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 でインストール。

<br />
$ sudo yum install -y hadoop-hbase-master<br />
$ sudo yum install -y hadoop-hbase-regionserver<br />
$ sudo yum install -y hadoop-zookeeper-server<br />

次に /etc/hbase/conf/hbase-site.xml を設定する。

<br />
&lt;configuration&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;hbase.rootdir&lt;/name&gt;<br />
    &lt;value&gt;hdfs://myhost01:8020/hbase&lt;/value&gt;<br />
  &lt;/property&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;hbase.cluster.distributed&lt;/name&gt;<br />
    &lt;value&gt;true&lt;/value&gt;<br />
  &lt;/property&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;zookeeper.znode.rootserver&lt;/name&gt;<br />
    &lt;value&gt;myhost01&lt;/value&gt;<br />
  &lt;/property&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;hbase.zookeeper.quorum&lt;/name&gt;<br />
    &lt;value&gt;myhost01&lt;/value&gt;<br />
  &lt;/property&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;hbase.zookeeper.property.clientPort&lt;/name&gt;<br />
    &lt;value&gt;2181&lt;/value&gt;<br />
  &lt;/property&gt;<br />
  &lt;property&gt;<br />
    &lt;name&gt;hbase.zookeeper.property.dataDir&lt;/name&gt;<br />
    &lt;value&gt;/var/zookeeper&lt;/value&gt;<br />
  &lt;/property&gt;<br />
&lt;/configuration&gt;<br />

マスター以外のノードは regionserver だけ。

<br />
# yum install -y hadoop-hbase-regionserver<br />

続いて regionservers の設定。これは Hadoop の slaves のようなもの。

<br />
$ sudo vi /etc/hbase/conf/regionservers<br />
myhost1<br />
myhost2<br />
myhost3<br />
myhost4<br />
myhost5<br />

続いて Hadoop の設定を HBase に読み込ませるため、シンボリックリンクを張る

<br />
$ cd /etc/hbase/conf<br />
$ sudo ln -s /etc/hadoop/conf/core-site.xml .<br />
$ sudo ln -s /etc/hadoop/conf/hdfs-site.xml .<br />

下記コマンドで問題なくテーブルが作成できることがわかった

<br />
$ hbase shell<br />
&gt; create 'sample_names','info'<br />
&gt; put 'sample_names','1','info:fname','hoge'<br />
&gt; put 'sample_names','1','info:lname','fuga'<br />
&gt; scan 'sample_names'<br />
ROW       COLUMN+CELL<br />
 1        column=info:fname, timestamp=1361110702928, value=hoge<br />
 1        column=info:lname, timestamp=1361110715822, value=fuga</p>
<p>1 row(s) in 0.0170 seconds<br />

データも入れて、scan でデータが取得できることは確認!

Pig を HBase で連携させることを開始。
しかし、ここから長い旅の始まりだった・・・。

Pig で HBase のテーブルからデータを取得するための準備。
まずは sample_names と同じスキーマのテーブルを作っておく

<br />
$ hbase shell<br />
&gt; create 'sample_names2','info'<br />

準備したのは下記の hbase.pig 。
先頭の3行の register は、cloudera のサイトに記述されていた通り。
HBase からデータを取得し、DUMPするだけ。

<br />
register        /usr/lib/hbase/zookeeper.jar;<br />
register        /usr/lib/hbase/hbase.jar;<br />
register        /usr/lib/hbase/lib/guava-r06.jar;</p>
<p>raw_data = LOAD 'hbase://sample_names' USING<br />
org.apache.pig.backend.hadoop.hbase.HBaseStorage('info:fname info:lname', '-loadKey true');</p>
<p>STORE raw_data INTO 'sample_names2' USING<br />
org.apache.pig.backend.hadoop.hbase.HBaseStorage ('info:fname info:lname','-loadKey true');<br />

まずは pig をローカルモードで動作確認。
sample_names からのデータがsample_names2 にデータが入っていることを確認。

<br />
$ pig -x local -f hbase.pig<br />

続いて、MapReduce モードで動作確認。
何だか上手く動かない。

<br />
$ pig -f hbase.pig<br />

ジョブのログを確認していると、ZooKeeper でエラーが。

<br />
INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181<br />

zookeeper の設定もしているのに。。。

試しに、hbase-site.xml の hbase.zookeepr.property.clientPort、
zoo.cfg の clientPort を 2222 に設定して HBase を再起動。
変更したのに、同様に 127.0.0.1/2181 に接続してる・・・。
なぜ、2222 ポートに接続しているようにしてるのに、2181 に?

多分、設定が読み込まれてないんだろうなぁ・・と。
色々、ググってみると java のソースにその設定を書いている場合がある。
同様に Pig でも。と思い hbase.pig の先頭に下記を記述。

<br />
set hadoop.zookeeper.property.clientPort 2222;<br />
set hadoop.zookeeper.quorum 'myhost01';<br />

わーい^^ 接続は上手くいったぁ!
ただし、下記で処理が止まってしまう・・・
ずっと待つ。しかし終わらず Ctrl+C。

<br />
2013-02-16 01:33:28,748 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_201302160116_0003<br />
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<br />

なんか CLASSPATH でも読み込めてないんだろうなと思い、
Google でいろいろ探していると、二つのサイトを発見。
http://mikaelsitruk.wordpress.com/2011/09/15/pig-and-hbase-integration/
http://zjffdu.blogspot.jp/2010/10/using-hbasestorage-in-pig.html

<br />
$ cd /etc/hadoop/conf/<br />
$ sudo ln -s /etc/hbase/conf/hbase-site.xml .<br />

Hadoop も再起動して、MapReduce モードでも Pig が無事動きましたとさ。
最終的に動いた hbase.pig は下記。
cloudera に書いてあった register もいらなかった。
/user/lib/hbase/lib に register の jar を放り込んだからかな?

<br />
raw_data = LOAD 'hbase://sample_names' USING<br />
org.apache.pig.backend.hadoop.hbase.HBaseStorage('info:fname info:lname', '-loadKey true');</p>
<p>STORE raw_data INTO 'sample_names2' USING<br />
org.apache.pig.backend.hadoop.hbase.HBaseStorage ('info:fname info:lname','-loadKey true');<br />

コメントを残す