Apache Pigで処理したデータをMongoDBにロードする – アジャイルデータサイエンス読書メモ その2


アジャイルデータサイエンス読書メモその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]