Pig で HBase を Load と Store する

Pocket

使用した環境は 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');

コメントを残す