使用した環境は CentOS
使った HBase は yum でインストールした cdh3u5 のやつ
そしてそれに付属する hadoop で 5 つマシン、myhost01 – myhost05 で Cluster を構築済み
NameNode が乗ってるマシン myhost01 を HBase の Master にして、HBase も構築するようにした
HBase のデータを変更するために、Java でごにょごにょするのはめんどくさい!
なので、Pig でできないかなぁーと思っていたら、きちんと Cloudera の Pig のページに
HBase との連携の記事があった
HBase は yum でインストール。
$ sudo yum install -y hadoop-hbase-master $ sudo yum install -y hadoop-hbase-regionserver $ sudo yum install -y hadoop-zookeeper-server
次に /etc/hbase/conf/hbase-site.xml を設定する。
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://myhost01:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>zookeeper.znode.rootserver</name> <value>myhost01</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>myhost01</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/var/zookeeper</value> </property> </configuration>
マスター以外のノードは regionserver だけ。
# yum install -y hadoop-hbase-regionserver
続いて regionservers の設定。これは Hadoop の slaves のようなもの。
$ sudo vi /etc/hbase/conf/regionservers myhost1 myhost2 myhost3 myhost4 myhost5
続いて Hadoop の設定を HBase に読み込ませるため、シンボリックリンクを張る
$ cd /etc/hbase/conf $ sudo ln -s /etc/hadoop/conf/core-site.xml . $ sudo ln -s /etc/hadoop/conf/hdfs-site.xml .
下記コマンドで問題なくテーブルが作成できることがわかった
$ hbase shell > create 'sample_names','info' > put 'sample_names','1','info:fname','hoge' > put 'sample_names','1','info:lname','fuga' > scan 'sample_names' ROW COLUMN+CELL 1 column=info:fname, timestamp=1361110702928, value=hoge 1 column=info:lname, timestamp=1361110715822, value=fuga 1 row(s) in 0.0170 seconds
データも入れて、scan でデータが取得できることは確認!
Pig を HBase で連携させることを開始。
しかし、ここから長い旅の始まりだった・・・。
Pig で HBase のテーブルからデータを取得するための準備。
まずは sample_names と同じスキーマのテーブルを作っておく
$ hbase shell > create 'sample_names2','info'
準備したのは下記の hbase.pig 。
先頭の3行の register は、cloudera のサイトに記述されていた通り。
HBase からデータを取得し、DUMPするだけ。
register /usr/lib/hbase/zookeeper.jar; register /usr/lib/hbase/hbase.jar; register /usr/lib/hbase/lib/guava-r06.jar; raw_data = LOAD 'hbase://sample_names' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('info:fname info:lname', '-loadKey true'); STORE raw_data INTO 'sample_names2' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage ('info:fname info:lname','-loadKey true');
まずは pig をローカルモードで動作確認。
sample_names からのデータがsample_names2 にデータが入っていることを確認。
$ pig -x local -f hbase.pig
続いて、MapReduce モードで動作確認。
何だか上手く動かない。
$ pig -f hbase.pig
ジョブのログを確認していると、ZooKeeper でエラーが。
INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181
zookeeper の設定もしているのに。。。
試しに、hbase-site.xml の hbase.zookeepr.property.clientPort、
zoo.cfg の clientPort を 2222 に設定して HBase を再起動。
変更したのに、同様に 127.0.0.1/2181 に接続してる・・・。
なぜ、2222 ポートに接続しているようにしてるのに、2181 に?
多分、設定が読み込まれてないんだろうなぁ・・と。
色々、ググってみると java のソースにその設定を書いている場合がある。
同様に Pig でも。と思い hbase.pig の先頭に下記を記述。
set hadoop.zookeeper.property.clientPort 2222; set hadoop.zookeeper.quorum 'myhost01';
わーい^^ 接続は上手くいったぁ!
ただし、下記で処理が止まってしまう・・・
ずっと待つ。しかし終わらず Ctrl+C。
2013-02-16 01:33:28,748 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_201302160116_0003 2013-02-16 01:33:28,748 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - More information at: http://myhost01:50030/jobdetails.jsp?jobid=job_201302160116_0003
なんか CLASSPATH でも読み込めてないんだろうなと思い、
Google でいろいろ探していると、二つのサイトを発見。
http://mikaelsitruk.wordpress.com/2011/09/15/pig-and-hbase-integration/
http://zjffdu.blogspot.jp/2010/10/using-hbasestorage-in-pig.html
$ cd /etc/hadoop/conf/ $ sudo ln -s /etc/hbase/conf/hbase-site.xml .
Hadoop も再起動して、MapReduce モードでも Pig が無事動きましたとさ。
最終的に動いた hbase.pig は下記。
cloudera に書いてあった register もいらなかった。
/user/lib/hbase/lib に register の jar を放り込んだからかな?
raw_data = LOAD 'hbase://sample_names' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('info:fname info:lname', '-loadKey true'); STORE raw_data INTO 'sample_names2' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage ('info:fname info:lname','-loadKey true');