アジャイルデータサイエンス読書メモその2です。
前回の記事「AvroフォーマットデータをApache Pigで読み込み処理する」では、3章の前半、GmailのメールデータをPigで集計して結果をAvroフォーマットで保存するところまでを試しました。
この記事では、その後の集計結果をMongoDBに保存するところまでを試したメモになります。
MongoDBのインストール
Ubuntu 14.0にMongoDBをインストールする手順は以下の通りです。
Install MongoDB on Ubuntu — MongoDB Manual 2.6.4
を参照しました。
[bash gutter=”false”]
$ 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
[/bash]
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をダウンロードしてビルドする手順
[bash gutter=”false”]
$ 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
[/bash]
mongo-java-driveの入手
[bash]
$ 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
[/bash]
PigでMongoDBにデータをロードする
mongo-hadoopは本のバージョンと異なっているため、mongo.pigもフォークされたコードの方を参考に修正しています。
[text title=”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(”,’’);
[/text]
実行します。
[bash gutter=”false”]
$ 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!
[/bash]
ロードされたデータを確認します。
[bash gutter=”false”]
$ 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) }
[/bash]