Amazon Elastic Compute Cloud(EC2)に構築したHadoop(疑似分散)で、Tweetをワードカウントする。

一口に「Twitterの記事から語句の出現頻度を取得する」といっても、前段階の準備が大変だ。ここまでのログで

を行ってきた。

本来なら、完全分散環境を構築すべきかと思うが、MapReduceの動きを見るのが、当面の目標であるので、構築の簡単な疑似分散環境のまま進めていく。

今回も開発環境は、MacBook Pro(OSX Lion)。

ワードカウント用javaプログラム

jar形式にしてEC2に送らなければならないため、Eclipseからエクスポートしておく。
具体的には、デフォルトパッケージを選択し、右クリック、エクスポートでJava -> jarファイルを選択する。

hadoopsampleプロジェクトを選び、不要なファイルのチェックをはずして、jarファイル名を指定する。

jarファイルと品詞分解後のTweetデータ(テキスト)をEC2に送る。

上で作成したjarファイルと、データを、sftpでEC2へおくる。

MacBook-Pro:~ tetsuya$ sftp -i .ssh/[your_keypairname].pem ec2-user@[uri of your aws ec2]
Connected to [uri of your aws ec2].
sftp> put tweets_noun.txt tweets_noun.txt
Uploading tweets_noun.txt to /home/ec2-user/tweets_noun.txt
tweets_noun.txt                               100%   93KB  93.2KB/s   00:01    
sftp> put hadoopsample.jar hadoopsample.jar
Uploading hadoopsample.jar to /home/ec2-user/hadoopsample.jar
hadoopsample.jar                              100% 3665     3.6KB/s   00:00

hadoopユーザーにオーナーを変更し、hadoopユーザーのホームディレクトリへ移動する。

[ec2-user@ip-10-139-15-241 tmp]$ sudo chown hadoop:hadoop hadoopsample.jar 
[ec2-user@ip-10-139-15-241 tmp]$ sudo chown hadoop:hadoop tweets_noun.txt 
[ec2-user@ip-10-139-15-241 tmp]$ sudo cp hadoopsample.jar /home/hadoop
[ec2-user@ip-10-139-15-241 tmp]$ sudo cp tweets_noun.txt /home/hadoop

hadoopユーザーで、入力ファイルをHDFSにコピーする。

hadoop@ip-10-139-15-241:~$ hadoop fs -copyFromLocal tweets_noun.txt .
hadoop@ip-10-139-15-241:~$ hadoop fs -ls .
Found 1 items
-rw-r--r--   1 hadoop supergroup      95391 2013-06-22 00:42 /user/hadoop/tweets_noun.txt

Javaプログラムを実行する。

hadoop@ip-10-139-15-241:~$ hadoop jar hadoopsample.jar Main tweets_noun.txt ./output

結果を確認する。

hadoop@ip-10-139-15-241:~$ hadoop fs -ls ./output
Found 4 items
-rw-r--r--   1 hadoop supergroup          0 2013-06-22 00:45 /user/hadoop/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup       6340 2013-06-22 00:44 /user/hadoop/output/part-r-00000
-rw-r--r--   1 hadoop supergroup       6744 2013-06-22 00:44 /user/hadoop/output/part-r-00001
-rw-r--r--   1 hadoop supergroup       6903 2013-06-22 00:44 /user/hadoop/output/part-r-00002
hadoop@ip-10-139-15-241:~$ hadoop fs -cat ./output/part-r-00000 | more
&	1
(*^^*)	20
(*_*)	1
(^	29
(^-^)	7
(^^;	1
(^○^)	1
( ̄□ ̄;)	1
)	44
)?	5
) 	7
)〜』	1
,	89

結果

ワードカウントの結果はそのままここに記載しないが、以下の結果を観測した。

  • 最も頻度の高い名詞は、その都市の名前であった(trivialな結果かと思う)
  • 次に頻度の高い名詞は、Twitterに投稿された広告(風俗店)で、およそ30分に1回以上投稿されている。
  • 2番目に多く投稿されている広告(これも風俗店)と、上の2つを合わせて12.05%となった。

エコノミスト」誌(6/4号)でも、「広告などの投稿を除外した」と簡単に記載されているが、実際にはかなりの量のスパムが混入すると考えられる。
そういう意味では、trivialな結果や、(1ユーザーとして)頻度の高いTweetは除くなどのフィルタリング機能が必要になると考える。

フィルタリングは機械学習に関する話題になろうかと思う。
今回は、「TwitterからTweetを取得して、そこから語句を抽出する流れ」をAmazon EC2を使って実験するにとどめ、機械学習については別の機会に行う。