fluentd + TwitterAPI + GoogleCloudPlatform でビッグデータもどきを作る話

# この記事は？
- Google Cloud Platform が使い勝手がいいらしい、無償評価もできるようなので使ってみたい。
- 特定の話題をかき集めて保存しておいてみよう！
- となるとTwitterのデータが扱いやすいかな
- 集めたデータの処理については別途検討。


# やりたいこと
- Google Cloud Platform にて仮想マシンを作る
- 作ったマシンでfluentdを起動し、指定のハッシュタグのツイートを集める
- 集めたツイートを保存する　⇒　固有の話題に関するビッグデータの完成だ（確信）
- 保存したデータは後で活用する

# 実装
## Step0 : 事前準備
### Googleのアカウントを取得する
やり方はここでは割愛。
後述のGoogle Cloud Platformの登録にてクレカ登録を行うため、
捨て垢での実装はやめた方がいいと思います。

### Google Cloud Platform(GCP)に登録する
[Google Cloud Platform: BigQuery](https://cloud.google.com/bigquery/?hl=ja) から無償評価に登録する。
新規ユーザーの場合 $300 分の無償枠がおまけでついてくので、この範囲で遊ぶ。
登録にクレカ必須なので注意してください。
別画面の設定で、「指定の金額の90%になったらメール通知する」という設定ができるので、
メールが確認できていれば無償評価を終え、課金対象になる前に止められます。

### Twitterのアカウントを取得する
やり方はここでは割愛。
後にAPI設定を付与するため、悪用されないようにメール認証と携帯電話番号の登録を済ませましょう。

### Twitter での API の設定を行う ( Twitter Streaming API )
Twitter OAuth 認証キーの取得を済ませておきます。
ログイン状態を維持したまま[Twitter Developers ページ](https://dev.twitter.com/) にアクセスし、
画面下部にあるメニューの中、`Tools` から `Manage my apps` をクリック、
リンク先のページの `Create New App` をクリックする。
あとは示される必要項目を埋めていきます。その後使われるパラメータは、

- consumer_key
- consumer_secret
- Access Token
- Access Token Secret

が必要となります。

## Step1 : 環境用意 ( Google Cloud Platform / Compute Engine )
GCP上に仮想マシンインスタンス(Compute Engine)を用意します。
Compute Engineの課金については[こちら](https://cloud.google.com/compute/pricing?hl=ja)を参照するとわかりますが、
最小スペックとなる f1-micro VM インスタンスで、かつ30 GB の HDD 永続ディスク ストレージであれば
Always FreeとしてVM 1台を無料で活用できます。

作成方法は、コンソール画面から `Compute Engine` > `VMインスタンス` へと進んだ [こちら](https://console.cloud.google.com/compute/instances)
 画面上部の `インスタンスを作成` ボタンからポチポチ選んでいけばすぐ使える。早い！便利！

## Step2 : Twitterからデータ収集 ( fluentd )
fluentdを利用してTwitterからのデータ収集を行う。
設定作業は概ね[Qiita記事：Fluentd + BigQuery による Tweet データ収集](http://qiita.com/Salinger/items/9d47ced748ff7191570a)を参考にした。
私はこれに加え、入れ子になっている構造が不便だったので、
[こちらの記事を参考](http://www.nagaseyasuhito.net/2014/01/10/416/)にして、フラットな構造として扱った。
閲覧者の皆様の参考までに、私の環境での設定を下記に共有しておく。
Twitterとしては他にもカラムがあるが、必要な項目のみをjsonとして記載、
fluentdで取得され、不要な項目については無視する(ignore_unknown_values true)ようにしている。
また、「やりたいこと」であるハッシュタグの指定はkeyword として設定している。

```/etc/td-agent/td-agent.conf
<source>
  @type twitter
  consumer_key <YOUR_CONSUMER_KEY>
  consumer_secret <YOUR_CNSUMER_SECRET>
  access_token <YOUR_ACCESS_TOKEN>
  access_token_secret <YOUR_ACCESS_TOKEN_SECRET>
  tag twitter.keyword
  timeline tracking
  keyword ${hashtag}ハッシュタグの名前
  lang ja
  output_format nest
</source>

<match twitter.keyword>
  @type flatten_hash
  tag twitter.keyword.flat
  separator _
</match>

<match twitter.keyword.flat>
  @type copy
  #<store>
  #  @type file
  #  path /var/log/td-agent/debug_twitter.log
  #</store>
  <store>
    @type bigquery
    method insert
    schema_path /opt/td-agent/bq_schema/bq_tweet_flat.json
  
    auth_method private_key
    email <YOUR_GOOGLE_PROJECT_EMAIL>
    private_key_path /opt/td-agent/google-keys/<YOUR_PROJECT_KEY>.p12
  
    project <YOUR_GOOGLE_PROJECT_NAME>
    dataset <DATASET_NAME>
    auto_create_table true
    table <DATATABLE_NAME>
    ignore_unknown_values true
  
    schema_path /opt/td-agent/bq_schema/bq_tweet_flat.json 
    
  </store>
</match>
```

```/opt/td-agent/bq_schema/bq_tweet_flat.json
[
  {
    "name": "created_at",
    "type": "STRING"
    },
  {
    "name": "timestamp_ms",
    "type": "STRING"
    },
  {
    "name": "text",
    "type": "STRING"
    },
  {
    "name": "source",
    "type": "STRING"
    },
  {
    "name": "in_reply_to_screen_name",
    "type": "STRING"
    },
  {
    "name": "user_name",
    "type": "STRING"
    },
  {
    "name": "user_screen_name",
    "type": "STRING"
    },
  {
    "name": "user_location",
    "type": "STRING"
    },
  {
    "name": "user_time_zone",
    "type": "STRING"
    },
  {
    "name": "user_lang",
    "type": "STRING"
    },
  {
    "name": "entities_media_0_media_url",
    "type": "STRING"
    },
  {
    "name": "entities_media_1_media_url",
    "type": "STRING"
    },
  {
    "name": "entities_media_2_media_url",
    "type": "STRING"
    },
  {
    "name": "entities_media_3_media_url",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_created_at",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_text",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_source",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_in_reply_to_screen_name",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_user_name",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_user_screen_name",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_user_location",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_retweet_count",
    "type": "INTEGER"
    },
  {
    "name": "retweeted_status_favorite_count",
    "type": "INTEGER"
    },
  {
    "name": "retweeted_status_entities_hashtags_0_text",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_entities_media_0_media_url",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_entities_media_1_media_url",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_entities_media_2_media_url",
    "type": "STRING"
    },
  {
    "name": "retweeted_status_entities_media_3_media_url",
    "type": "STRING"
    }
]
```

## Step3 : データの保存 ( Google Cloud Platform / BigQuery )
### 取得確認
データが取得できているか？については[Google BigqueryのGUI](https://bigquery.cloud.google.com/)から確認できる…が、
Googleのデータ保存の性質上、すぐには画面上に反映されない。
その場合、CUIからbigqueryに対しクエリを叩いてデータを取得する。

```bash
$ bq head -n 15 <YOUR_GOOGLE_PROJECT_NAME>:<DATASET_NAME>.<DATATABLE_NAME>
---ずらずらと結果が15行出力される---

$ bq query "SELECT entities_media_0_media_url FROM [<YOUR_GOOGLE_PROJECT_NAME>:<DATASET_NAME>.<DATATABLE_NAME>] WHERE entities_media_0_media_url IS NOT NULL GROUP BY 1 limit 15" 
Waiting on bqjob_r147fcaa79d4dbff_0000015d5a0ba870_1 ... (0s) Current status: DONE   
+------------------------------------------------+
|           entities_media_0_media_url           |
+------------------------------------------------+
| http://pbs.twimg.com/media/hogehoge.jpg        |
+------------------------------------------------+
```

### 注意
ここでも注意しなければいけないのは課金額である。
細かいことは[BigQueryのドキュメント：課金について](https://cloud.google.com/bigquery/pricing?hl=ja)を確認してもらいたいが、大雑把に言えば

- データを継続的に貯めこみ続けると課金(ストリーミングインサート)<br>
  (GoogleCloudStorageからの導入や、「一回CSVから取り込む」などは課金されない)
- ずっとデータを保存しておくと課金<br>
  (ただし、長いことデータにアクセスしていない状態になれば課金対象から外れる)
- クエリを発行してデータを取り出すと課金<br>
  (ただし毎月 1 TB まで無料)

である。個人利用においてはできるだけクエリ発行は無料範囲で押さえたい。

## Step4 : 可視化 (FooBarBaz)
### さぁ集めたデータをどう料理してやろうか
本来はここが一番肝の部分となります…が、まだデータ収集を始めたばかりの段階ではあまり旨みがなく、
後日料理しようと思います。
やりたいことに合わせて道具を選定しましょう。
以下にいくつかツール名を出しておきます。

- Google Data Studio
- Google Cloud Datalab
- Microsoft Power BI
- Tableau
- QlikView

課金制度や機能差異などどれも一長一短なので、利用シーンに合わせて選びましょう。
個人利用となると、無料でサクッと使えるGoogle Data Studio、機械学習に使えるGoogle Cloud Datalabしかない気もしますが、
ビジネスシーンだとすると美麗なグラフが描けるTableauなども視野に入りそうです。

# 終わりに
さてさて、これで特定の話題に関するツイート収集ができるわけです。
お仕事だったらもっと広く情報を集め、そこから分析をしなければなりませんが、
今回はあくまで個人利用。大切なことは、
**どのハッシュタグを使って自分の役に立つビッグデータとするか**です。

例えば、#ニチアサ であればその週のプリキュアの展開について賛否ある内容の分析ができるでしょうし、
はたまた #共謀罪 などであれば世の中の面白ツイートの分析ができるでしょう。
固有の話題とはいえ、扱い方によって面白いことができそうです。

この記事が皆様の参考となりますように。

* * *
以上