DockerでFlumeからHDFSにTwitterデータを収集してみる

Flume & Twitterデータの投稿はすでにいくつかあるようだが、Cloudera QuickstartのDockerとCDH5.7(2016年4月27日時点で最新版)を使った投稿が無いようなので書いてみた。

**動作環境**
- Mac OS (Docker インストール済み)

## Twitter Applicationの作成
このステップは、OAuthプロセスが超簡単で驚いた。

まずはMacOSのブラウザからTwitterにログインした状態で、https://apps.twitter.com にアクセス。
こんな感じのページが表示されるので、Create New Appをクリック。

<img width="1026" alt="Screen Shot 2016-04-27 at 12.44.22 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/d5a54188-829d-f93b-8779-0ebd8280810f.png">


次のページでアプリの名前、Description、URLを入力する欄があるので、適当に入力。
URLはFully qualified URL(日本語で「完全修飾ドメイン名」?)が必要。Callback URLは必要なし。

<img width="1053" alt="Screen Shot 2016-04-27 at 2.05.00 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/660f7159-19b2-369a-35c2-eebbdae306a8.png">

下にスクロールして、Developer Agreementにチェックを入れて、Create your Twitter Applicationのボタンをクリック。
Twitter Applicationが作成されましたよ、という画面が表示される。

![Screen Shot 2016-04-27 at 2.10.44 AM.png](https://qiita-image-store.s3.amazonaws.com/0/118126/aefae1c0-ef14-ecf7-169d-c4de0cdeb938.png)

そして、画面の上の方にあるKeys and Access Tokensというタブをクリック。次に表示される画面の下の方にある、Create my access tokenというボタンをクリック。

![Screen Shot 2016-04-27 at 2.13.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/118126/f58c0bd1-2b1e-22d2-f945-689039731190.png)


これで認証に必要なAccess token, secret keyなどが発行される。

<img width="763" alt="Screen Shot 2016-04-27 at 2.14.49 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/417279af-77d7-fcfd-33db-c4292326d461.png">

上のConfirmationページで表示されている、画面右側のTest OAuthというボタンをクリックして、Access token, secret keyなどを表示させる。ここで表示される以下４つのキーは、後で使うのでメモ帳などにコピペしておくと便利。
- Consumer key
- Consumer secret
- Access token
- Access token secret:


## Cloudera Quickstart バージョン5.7のDockerイメージをPull
 `$ docker pull cloudera/quickstart:5.7.0-0-beta`

## Dockerコンテナ立ち上げ

```
 $ docker run --hostname=quickstart.cloudera --privileged=true -it -d  \
    cloudera/quickstart:5.7.0-0-beta  /usr/bin/docker-quickstart
```

## HDFSのディレクトリ作成
`# hadoop fs -mkdir twiter_data`
ディレクトリ名はなんでもOK。ついでにWrite accessも与えておく。
`# hadoop fs -chmod 777 twitter_data`
 
## Flumeの設定
Cloudera QuickstartのDockerコンテナでは、Flumeは **/usr/lib/flume-ng** に配置されてる。
/usr/lib/flume-ng/conf を見ると、すでに参考の設定ファイルがある。
が、無視して新しい設定ファイルを作成。仮に、flume-twitter.confというファイル名にして、以下の設定を記入。

```
TwitterAgent.sources = Twitter
TwitterAgent.channels = MemChannel
TwitterAgent.sinks = HDFS

# Configuration for soruce
TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
TwitterAgent.sources.Twitter.consumerKey = <Twitter Appから取得したCustomer key>
TwitterAgent.sources.Twitter.consumerSecret = <Twitter Appから取得したCustomer secret>
TwitterAgent.sources.Twitter.accessToken = <Twitter Appから取得した Access token>
TwitterAgent.sources.Twitter.accessTokenSecret = <Twitter Appから取得したAccess token secret>
TwitterAgent.sources.Twitter.keywords = java, bigdata, mapreduce, hbase, Hadoop

# Configuration for sink
TwitterAgent.sinks.HDFS.type = hdfs 
TwitterAgent.sinks.HDFS.hdfs.path = hdfs://quickstart.cloudera:8020/twitter_data/
TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream 
TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text 
TwitterAgent.sinks.HDFS.hdfs.batchSize = 1000
TwitterAgent.sinks.HDFS.hdfs.rollSize = 0 
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000 

# Configuration for Channel
TwitterAgent.channels.MemChannel.type = memory
TwitterAgent.channels.MemChannel.capacity = 10000 
TwitterAgent.channels.MemChannel.transactionCapacity = 100

# Binding source and sink to the channel 
TwitterAgent.sources.Twitter.channels = MemChannel
TwitterAgent.sinks.HDFS.channel = MemChannel
```

"TwitterAgent"は、いわゆるAgent名。
この設定で変える部分はTwitter Applicationで取得したOAuth情報と、TwitterAgent.sinks.HDFS.hdfs.pathに設定されているURL。
HDFSのURLは、**/etc/hadoop/conf/core-site.xml**の**fs.defaultFS**を参照。
自分の場合Dockerコンテナを起動する際にホスト名をcloudera.quickstartと明記したため、HDFSのURL はデフォルトで **hdfs://quickstart.cloudera:8020** になってた。

## Flume Agentの起動
/usr/lib/flume-ngディレクトリから、以下のコマンドを実行。
` # flume-ng agent --conf ./conf/ -f conf/flume-twitter.conf -Dflume.root.logger=DEBUG,console -n TwitterAgent`

うまくいくと、コンソール上に膨大な量のログが表示されて、Hadoopファイルシステムのディレクトリにもログが保存されていきます。