RCfileの圧縮とsplit

334 views
Skip to first unread message

pandazx

unread,
Oct 22, 2012, 6:07:21 AM10/22/12
to hado...@googlegroups.com
pandazxと申します。

RCfileの使い方を調べています。

RCfileをlzo圧縮したり、lzoではインデックスをつけないとsplitできないのはわかったのですが、RCfileをlzo圧縮した場合はsplitできないのでしょうか。

テストデータが500GB程度と小さいので、block sizeやhive.merge.size.per.taskをhiveのset文の16MBにして、hive上で実験しましたか、map数が1になりました。

RCfileで圧縮しても、splitできるのか知りたいのですが、ご存知の方いらっしゃれば、教えていただけないでしょうか。

hiveで出来ると扱いやすいので助かります。

Sho Shimauchi

unread,
Oct 22, 2012, 6:21:41 AM10/22/12
to hado...@googlegroups.com
pandazx さん、

嶋内です。
タスク数の問題は流したクエリ等がわからないとなんとも言えませんが、RCFile 自体は一定の行の範囲ごとに別々に圧縮をかけているので、既に分割されている状態で保存されています。

2012/10/22 pandazx <pand...@gmail.com>



--
Sho Shimauchi
Customer Operations Engineer, Cloudera

pandazx

unread,
Oct 23, 2012, 4:02:06 AM10/23/12
to hado...@googlegroups.com
嶋内さん

ご回答ありがとうございます。pandazxです。

環境の説明が不十分でした。説明させていただきます。
HadoopはApacheのサイトからダウンロードした0.20.2、Hiveは0.7.1です。

テーブル定義は以下のようになります。
CREATE TABLE IF NOT EXISTS table_name (
  column1 float,
  column2 float
)
ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
STORED AS RCFile;

実行したクエリは以下のようになります。
set hive.exec.compress.intermediate=true;
set hive.exec.compress.output=true;
set mapred.output.compression.type=BLOCK;
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
set mapred.max.split.size=32000000;
set hive.merge.size.per.task=32000000;
INSERT OVERWRITE TABLE input_table_lzo SELECT * FROM input_table;

set mapred.max.split.size=16000000;(圧縮後のファイルサイズが32MB以下だったので、16MBに変更)
select count(*) from input_table_lzo;

map数が1で実行された。

以下のサイトによると、RCFileの一定の行の範囲というのは
hive.io.rcfile.record.buffer.size で設定しているようですね。
http://grokbase.com/t/hive/user/124krjvfsh/row-group-size-of-rcfile

これを小さくして、RCFileが複数できて、map数が2以上になるのを確認したいと思います。

pandazx

unread,
Oct 23, 2012, 4:07:10 AM10/23/12
to hado...@googlegroups.com
pandazxです。

すみません、説明に不備がありました。
テーブルについて訂正します。

以下が生データのテキスト用テーブルで、ここにデータをロードする。
CREATE TABLE IF NOT EXISTS input_table (

  column1 float,
  column2 float
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

以下がRCFile用テーブルで、ここに上記テーブルからデータを圧縮してロードする
CREATE TABLE IF NOT EXISTS input_table_rcfile (

pandazx

unread,
Oct 23, 2012, 5:56:09 AM10/23/12
to hado...@googlegroups.com
RCFileが一つしかできないことが原因のように思われます。

input_tableにデータをロードした状態では120MBのファイルが5つあります。

しかし、input_table_rcfileにインポートした後はHDFSを見るとlzo圧縮されたファイルが一つあります。サイズが30MB程度。

圧縮なしでRCFileにロードしても400MBぐらいのファイルが一つできます。

hiveがreduce数1で実行するのが原因かもしれません。

上記のように考えましたが、
コメントなどいただければ幸いです。

Reply all
Reply to author
Forward
0 new messages