Amazon Elastic Compute Cloud(EC2)に構築したHadoop(疑似分散)で、Tweetをワードカウントする。
一口に「Twitterの記事から語句の出現頻度を取得する」といっても、前段階の準備が大変だ。ここまでのログで
- Hadoopの開発環境の構築
- JavaプログラムによるTweetの取得
- JavaプログラムとMecabによるTweetの品詞分解(語句の抽出)
- Amazon EC2上でのHadoopの疑似分散環境の構築
を行ってきた。
本来なら、完全分散環境を構築すべきかと思うが、MapReduceの動きを見るのが、当面の目標であるので、構築の簡単な疑似分散環境のまま進めていく。
今回も開発環境は、MacBook Pro(OSX Lion)。
ワードカウント用javaプログラム
jar形式にしてEC2に送らなければならないため、Eclipseからエクスポートしておく。
具体的には、デフォルトパッケージを選択し、右クリック、エクスポートでJava -> 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を使って実験するにとどめ、機械学習については別の機会に行う。