前回に続いて、Cloudera Impalaに触れていきます。
今回は軽く、Impalaが対応するデータの保存形式と圧縮形式についてまとめておきます。
ある程度は検証手順も記載しますが、基本は最後のまとめだけ見てもらえればOKです。
概要
Impala構築において、最後のimpala-shellでのSELECTができずに悩んだ時、閃きでデータ圧縮が悪いのかなーと思って当りだったわけですが、実はちゃんと書いていてくれたんですね。HDFS and HBase storage starting with:
* HDFS file formats: TextFile, SequenceFile
* Compression codecs supported with SequenceFile: Snappy, GZIP, BZIP
* HDFS file formats: TextFile, SequenceFile
* Compression codecs supported with SequenceFile: Snappy, GZIP, BZIP
検証環境では、TextFile + GZIP だったので動かなかったのですが、実はそれ結構困るじゃないかということで、ちゃんと調べてみました。
検証した形式
File format
Compression codec
検証しなかった形式
LZOは用意するのが面倒で止めましたが、準備手順のリンクは貼っておきます。Trevniファイルフォーマット?はいつか試すかもなので単語だけ書いておきます。
Hiveでテーブル作成
こんな感じで全部作成していきます。HiveさんはCDH4.1でもいまだに mapred.output.compression.codec 設定を使っているのですが、いついきなり mapreduce. の設定に切り替わるかドキドキしちゃいますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# # TextFormat # # Raw hive \ -hiveconf hive.default.fileformat=TextFile \ -hiveconf hive.exec.compress.output=false hive> create external table impala_text_raw (`num` int, `str` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/impala/impala_text_raw'; insert overwrite table impala_text_raw select 1, 'A' from test_table limit 2; select * from impala_text_raw; quit; # GZIP hive \ -hiveconf hive.default.fileformat=TextFile \ -hiveconf hive.exec.compress.output=true \ -hiveconf mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec hive> create external table impala_text_gzip (`num` int, `str` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/impala/impala_text_gzip'; insert overwrite table impala_text_gzip select 1, 'A' from test_table limit 2; select * from impala_text_gzip; quit; # BZIP2 ~snip~ |
RCFile + BZIP2
この組み合わせはSELECT時にエラーが出て使えないようで・・・こんなエラーが出てしまいます。
1 2 3 |
hive> select * from impala_rcfile_bzip2; OK Failed with exception java.io.IOException:java.io.IOException: Stream is not BZip2 formatted: expected 'h' as first byte but got '�' |
Impalaで参照
impala-shellで普通に参照してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
impala-shell [Not connected] > connect host-of-impalad:21000 impala> refresh select * from impala_text_raw select count(*) from impala_text_raw select * from impala_text_gzip select count(*) from impala_text_gzip ~snip~ |
Impala成否まとめ
形式\圧縮 | Raw | GZIP | BZIP2 | Snappy | Deflate |
TextFile | o | x (1) | x (2) | x (3) | x (1) |
SequenceFile | o | o | o | o | o |
RCFile | x (4) | x (4) | – (5) | x (4) | x (4) |
注釈
(1) TextFile + GZIP or Deflate
select * も seelect count(*) も 0 が返ります。(2) TextFile + BZIP2
Error communicating with impalad: TSocket read 0 bytes が返って接続した impalad が落ちます。(3) TextFile + Snappy
select * の結果はNULL, select count(*) には 0 が返ります。(4) RCFile + 全部
Table default.impala_rcfile_raw has unsupported format RC_FILE のエラーが返ります。(5) RCFile + BZIP2
(4)と同じですが、それ以前にHiveで参照できないので今後も注意。まとめ
SequenceFileを指定すると、圧縮してもHDFSファイルに拡張子が付かないので(TextFileなら付く)確認しづらいところですが、公式で表記されてた以上に対応されている結果になりました。TextFileは平文しか扱えないので、今のところは容量少なめのデータだけ、圧縮テーブルの横っちょに平文テーブルも置いておいて、とりあえず遊んでみる的な感じがよさそうですね。でも、解凍機能くらいサクッとつけて欲しいところです(わりと切実)。
効率面だけ追うと、最終的にはTrevni+圧縮になるのでしょうが、バッチ処理以外にFuse経由でダウンロードしてもらったり、色んな言語で解析処理に使ってもらったりするとなると、TextFileがどうしても必要になるので、選択肢を把握しつつ適確に選んでいきたいものです。