Hadoop Streaming で HBase を使う

HBase のテーブルを Hadoop Streaming の入出力にするための InputFormat/OutputFormat を書きました。

GitHub - wanpark/hadoop-hbase-streaming: HBase InputFormat/OutputFormat for Hadoop Streaming

debian:~% hadoop dfs -mkdir dammy_input
debian:~% hadoop jar hadoop-streaming.jar \
              -input dammy_input \
              -output output \
              -mapper /bin/cat \
              -inputformat org.childtv.hadoop.hbase.mapred.JSONTableInputFormat \
              -jobconf map.input.table=scores \
              -jobconf map.input.columns=course:
debian:~% hadoop dfs -cat output/*
Dan     {"course:math":"87","course:art":"97"}
Dana    {"course:math":"100","course:art":"80"}

使い方

  1. Hadoop 1.7.2, HBase 0.2.1 を準備します。
  2. リポジトリから hadoop-hbase-streaming.jar をとってきます。
  3. とってきた jar を $HADOOP_HOME/conf/hadoop-env.sh の HADOOP_CLASSPATH に加えます。
  4. 選んだフォーマットと、jobconf に適切な値を指定して Hadoop Straming を実行します

コマンドオプション

-jobconf map.input.table=
入力元のテーブル名を指定します。必須です。
-jobconf map.input.columns=
走査するカラム名を指定します。複数カラムはスペースで区切ります。必須です。
-jobconf map.input.binary=
true にすると、カラム名と cell の値を Base64エンコードして map に渡します。デフォルトは false
-jobconf map.input.timestamp=
true にすると各 cell のタイムスタンプを加えます。デフォルトは false

input format の説明

org.childtv.hadoop.hbase.mapred.JSONTableInputFormat
Dan     {"course:math":"87","course:art":"97"}

-jobconf map.input.timestamp=true だと構造が変わります。

Dan     {"course:math":{"value":"87","timestamp":"1226501804191"},"course:art":{"value":"97","timestamp":"1226501810087"}}
org.childtv.hadoop.hbase.mapred.XMLTableInputFormat

REST API の GET /[table_name]/row/[row_key]/ と同形式の XML を出力します。

Dan     <?xml version="1.0" encoding="UTF-8"?><row><column><name>course:art</name><value>97</value></column><column><name>course:math</name><value>87</value></column></row>

-jobconf map.input.binary=true にすると、中身の値も REST API と同じになります。

Dan     <?xml version="1.0" encoding="UTF-8"?><row><column><name>Y291cnNlOmFydA==</name><value>OTc=</value></column><column><name>Y291cnNlOm1hdGg=</name><value>ODc=</value></column></row>
org.childtv.hadoop.hbase.mapred.ListTableInputFormat

cell の値のみを空白で区切って出力します。

Dan     97 87

-jobconf map.input.value.separator= で区切り文字を指定できます。
-jobconf map.input.value.separator=,

Dan     97,87
独自のフォーマット

org.childtv.hadoop.hbase.mapred.TextTableInputFormat のサブクラスを実装します。簡単です。

output format の説明

ソースのコメントを読んでください