アジャイルデータサイエンス読書メモその2です。

前回の記事「AvroフォーマットデータをApache Pigで読み込み処理する」では、3章の前半、GmailのメールデータをPigで集計して結果をAvroフォーマットで保存するところまでを試しました。

この記事では、その後の集計結果をMongoDBに保存するところまでを試したメモになります。

MongoDBのインストール

Ubuntu 14.0にMongoDBをインストールする手順は以下の通りです。
Install MongoDB on Ubuntu — MongoDB Manual 2.6.4
を参照しました。

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
$ sudo apt-get update
$ sudo apt-get install mongodb-org


mongo-hadoopのインストール
本の手順と前後しますが、mongo-java-driverは、mongo-hadoopのディレクトリにダウンロードするので左記にmongo-hadoopを準備します。

mongo-hadoopは、1.3.0以降ではPig実行時にCompatibleエラーが発生してしまったため、1.2.0を利用しています。
1.2.0の安定板はReleases · mongodb/mongo-hadoopよりダウンロードできます。

本のバージョン1.10.0より新しいmongo-hadoopを使った場合の手順は、以下のフォークの説明が参考になります。
https://github.com/jstirnaman/Agile_Data_Code/tree/master/ch03
本家プロジェクトへプルリクエストもされています。
https://github.com/rjurney/Agile_Data_Code/pull/25/files

以下、mongo-hadoop-r1.2.0をダウンロードしてビルドする手順

$ wget https://github.com/mongodb/mongo-hadoop/archive/r1.2.0.zip

$ unzip r1.2.0.zip 
$ cd mongo-hadoop-r1.2.0/
$ ./sbt update
...

*** Adding Pig Dependency for Version '0.9.2'
*** Adding Hadoop Dependencies for Hadoop '1.0.4'
*** Adding Pig Dependency for Version '0.9.2'
...
$ ./sbt package

mongo-java-driveの入手

$ cd mongo-hadoop-r1.2.0/
$ wget http://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.9.3/mongo-java-driver-2.9.3.jar

PigでMongoDBにデータをロードする
mongo-hadoopは本のバージョンと異なっているため、mongo.pigもフォークされたコードの方を参考に修正しています。

/* Set Home Directory - where we install software */
%default HOME `echo \$HOME/mongo-hadoop-r1.2.0`

REGISTER $HOME/mongo-java-driver*.jar
REGISTER $HOME/core/target/mongo-hadoop-core-*.jar
REGISTER $HOME/pig/target/mongo-hadoop-pig-*.jar

set mapred.map.tasks.speculative.execution false
set mapred.reduce.tasks.speculative.execution false

sent_counts = LOAD '/tmp/sent_counts.txt' AS (from:chararray, to:chararray, total:long);
STORE sent_counts INTO 'mongodb://localhost/agile_data.sent_counts' USING com.mongodb.hadoop.pig.MongoInsertStorage('','’);

実行します。

$ JAVA_HOME=/usr ~/pig-0.13.0/bin/pig -x local -v -w mongo.pig
...

HadoopVersion	PigVersion	UserId	StartedAt	FinishedAt	Features
1.0.4	0.13.0	vagrant	2014-08-23 06:49:07	2014-08-23 06:49:11	UNKNOWN

Success!

Job Stats (time in seconds):
JobId	Maps	Reduces	MaxMapTime	MinMapTIme	AvgMapTime	MedianMapTime	MaxReduceTime	MinReduceTime	AvgReduceTime	MedianReducetime	Alias	Feature	Outputs
job_local_0001	1	0	n/a	n/a	n/a	n/a	0	0	0	0	sent_counts	MAP_ONLY	mongodb://localhost/agile_data.sent_counts,

Input(s):
Successfully read 3 records from: "/tmp/sent_counts.txt"

Output(s):
Successfully stored 3 records in: "mongodb://localhost/agile_data.sent_counts"

Counters:
Total records written : 3
Total bytes written : 0
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0

Job DAG:
job_local_0001


2014-08-23 06:49:11,980 [main] INFO  com.mongodb.hadoop.pig.MongoStorage - Store Location Config: Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml For URI: mongodb://localhost/agile_data.sent_counts
2014-08-23 06:49:11,982 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!

ロードされたデータを確認します。

$ mongo
> db.sent_counts.find();
{ "_id" : ObjectId("53f62fd2e4b03f644d53b786"), "from" : "notification@hoge.com", "to" : "hrendoh@gmail.com", "total" : NumberLong(5) }
{ "_id" : ObjectId("53f62fd2e4b03f644d53b787"), "from" : "special@foo.jp", "to" : "hrendoh@gmail.com", "total" : NumberLong(2) }
{ "_id" : ObjectId("53f62fd2e4b03f644d53b788"), "from" : "news@example.jp", "to" : "hrendoh@gmail.com", "total" : NumberLong(1) }