[[Hadoopチューニング]] >

#contents

* おすすめの圧縮利用法 [#k4ba9e28]

- 一度、ソースファイルを通常のテーブル(TextFile形式)にロードし、それをLZO圧縮(ブロックベース)を伴った SequenceFile 形式のテーブルに投入してから利用しましょう。
- 比較的データ量が少ない場合(それでも数GBまで)には、ただ単に圧縮されたファイル(ただし、GzipかLZO)を通常のテーブル(TextFile形式)にロードするだけでも圧縮の効果が得られます。

* 圧縮データのロード [#u75a7e9f]

- 以下は、内容は全く同じで圧縮形式の異なるデータをテーブル(TextFileストレージ)にロードし、同じクエリを実行した場合の結果です。
- 圧縮により消費領域が節約できるとともに、Gzip、LZO圧縮についてはクエリ応答時間が大幅に短縮されていることが分かります。COLOR(blue){''LZO圧縮の利用がおすすめです。''}
- COLOR(red){ただし、TextFileストレージの圧縮はファイルベースなので、Mapタスク数が1になっている点に注意する必要があります。}大規模データでは(分散処理が見込めないので)急激に速度が低下する恐れがありますので、ストレージに SequenceFile を利用することをおすすめします。
|~No.|~圧縮形式|~テーブルデータ量|~ロード時間(秒)|~クエリ応答時間(秒)|~Map数|~詳細|
|1|Raw|RIGHT:1,592,052,200|-|RIGHT:165.719|RIGHT:24|&ref(textfile_no_compress001.png,noimg);|
|2|Gzip圧縮(Deflate)|RIGHT:207,106,404|RIGHT:9.007|RIGHT:92.241|RIGHT:COLOR(red){1}|&ref(load_gzip_001.png,noimg);|
|3|LZO|RIGHT:331,001,547|RIGHT:COLOR(blue){0.538}|RIGHT:COLOR(blue){88.795}|RIGHT:COLOR(red){1}|&ref(load_lzo_001.png,noimg);|
|4|Bzip2圧縮|RIGHT:COLOR(blue){144,019,527}|RIGHT:0.544|RIGHT:214.87|RIGHT:COLOR(red){1}|&ref(load_bzip2_001.png,noimg);|

** テストログ [#m763bf55]

- HDFS上のファイルのロードが高速なのは、HDFS上の mv (ただしHiveの)だからです。コピーされないことに注意が必要です。

*** Gzip [#k8ffbec1]

#geshi(bash,number){{
hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.gz'
    > overwrite INTO TABLE postcodes;
Loading data to table postcodes
OK
Time taken: 9.007 seconds

grunt> ls /user/hive/warehouse/postcodes
hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.gz<r 1>  207106404

hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
...
Time taken: 92.241 seconds
}}

*** LZO [#a461b96c]

#geshi(bash,number){{
hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.lzo'
    > overwrite INTO TABLE postcodes;
Loading data to table postcodes
OK
Time taken: 0.538 seconds

grunt> ls /user/hive/warehouse/postcodes
hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.lzo<r 1> 331001547

Time taken: 88.795 seconds
}}

*** Bzip2 [#pd303b0a]

#geshi(bash,number){{
hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.bz2'
    > overwrite INTO TABLE postcodes;
Loading data to table postcodes
OK
Time taken: 0.544 seconds

grunt> ls /user/hive/warehouse/postcodes
hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.bz2<r 1> 144019527

hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
...
Time taken: 214.87 seconds
}}

* SequenceFile の利用 [#k199ee5e]

- 以下は、各ストレージに全く同じデータを投入し、同じクエリを実行した場合の結果です。
- 圧縮により消費領域が節約できるとともに、Deflate、LZO圧縮についてはクエリ応答時間が大幅に短縮されていることが分かります。COLOR(blue){''LZOもしくはDeflate圧縮を伴った SequenceFile の利用がおすすめです。''}
|~No.|~ストレージタイプ|~データ量|~ロード時間(秒)|~クエリ応答時間(秒)|~Map数|~詳細|
|1|テキストファイル(raw)|RIGHT:1,592,052,200|-|RIGHT:165.719|RIGHT:24|&ref(textfile_no_compress001.png,noimg);|
|2|SequenceFile(Deflate圧縮)|RIGHT:229,036,051|RIGHT:1186.357|RIGHT:COLOR(blue){89.213}|RIGHT:4|&ref(seqfile_deflate_compress001.png,noimg);|
|3|SequenceFile(LZO圧縮)|RIGHT:414,012,342|RIGHT:COLOR(blue){946.145}|RIGHT:95.439|RIGHT:6|&ref(seqfile_lzo_compress001.png,noimg);|
|4|SequenceFile(Bzip2圧縮)|RIGHT:COLOR(blue){159,883,185}|RIGHT:2,307.423|RIGHT:166.13|RIGHT:3|&ref(seqfile_bzip2_compress001.png,noimg);|

** テストログ [#s7f0c427]

*** テキストファイル [#dacfb4c4]

#geshi(bash,number){{
hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv'
    > overwrite INTO TABLE postcodes;
Loading data to table postcodes
OK
Time taken: 0.367 seconds

grunt> ls /user/hive/warehouse/postcodes
hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv<r 1>     1592052200

hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
...
Time taken: 165.719 seconds
}}

*** SequenceFile(Deflate圧縮) [#k3d2b2c5]

#geshi(bash,number){{
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.type=BLOCK;
hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
...
Loading data to table postcodes_seq
12287400 Rows loaded to postcodes_seq
OK
Time taken: 1186.357 seconds

grunt> ls /user/hive/warehouse/postcodes_seq
hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0002_r_000000_0<r 1>       229036051

hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
...
Time taken: 89.213 seconds
}}

*** SequenceFile(LZO圧縮) [#d5c0f350]

#geshi(bash,number){{
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.type=BLOCK;
hive> set mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
...
Loading data to table postcodes_seq
12287400 Rows loaded to postcodes_seq
OK
Time taken: 946.145 seconds

grunt> ls /user/hive/warehouse/postcodes_seq
hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0011_r_000000_0<r 1>       206579657
hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0011_r_000001_0<r 1>       207432685

hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
...
Time taken: 95.439 seconds
}}

*** SequenceFile(Bzip2圧縮) [#wdabb454]

#geshi(bash,number){{
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.type=BLOCK;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
...
Loading data to table postcodes_seq
12287400 Rows loaded to postcodes_seq
OK
Time taken: 2307.423 seconds

grunt> ls /user/hive/warehouse/postcodes_seq
hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0014_r_000000_0<r 1>       159883185

hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
...
Time taken: 166.13 seconds
}}

** HDFS上のファイルのSequenceFileテーブルへのロードは不可 [#we7e7955]

#geshi(){{
hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv'    
    > overwrite INTO TABLE postcodes_seq;                    
Loading data to table postcodes_seq
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask

hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.gz'
    > overwrite INTO TABLE postcodes_seq;                       
Loading data to table postcodes_seq
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask

hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.lzo'
    > overwrite INTO TABLE postcodes_seq;                        
Loading data to table postcodes_seq
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask

hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.bz2'
    > overwrite INTO TABLE postcodes_seq;                        
Loading data to table postcodes_seq
Failed with exception Wrong file format. Please check the file's format.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
}}

* データの圧縮ストア [#qc5a89ad]
TODO

* テストの詳細 [#wb73b1b1]

** 概要 [#eed60a9c]

- サンプルデータは、例によって郵便番号データを100倍に増やしたもので、無圧縮で1.48GBのサイズになります。

** テスト環境 [#aff7ee2f]

|~No.|~項目|~内容|~備考|
|1|CPU|Intel Core Duo T2300 1.66GHz||
|2|メモリ|4GB|ただし、32bit環境。|
|3|OS|Ubuntu 9.04||
|4|JDK|OpenJDK 6||
|5|Hadoop|Ver. 0.20.2, r911707、1台で擬似分散モード||
|6|Hive|Ver. 0.5.0||

** スキーマ [#yb7c8411]

- テストに用いたテーブルの定義は以下の通りです。
#geshi(sql,number){{
CREATE TABLE postcodes (
  org_code string,
  old_postcode string,
  postcode string,
  todoufuken_yomi string,
  shikuchoson_yomi string,
  choiki_yomi string,
  todoufuken string,
  shikuchoson string,
  choiki string,
  flag1 int,
  flag2 int,
  flag3 int,
  flag4 int,
  flag5 int,
  flag6 int
)
row format delimited
FIELDS terminated BY ','
LINES terminated BY '\n';

CREATE TABLE postcodes_seq (
  org_code string,
  old_postcode string,
  postcode string,
  todoufuken_yomi string,
  shikuchoson_yomi string,
  choiki_yomi string,
  todoufuken string,
  shikuchoson string,
  choiki string,
  flag1 int,
  flag2 int,
  flag3 int,
  flag4 int,
  flag5 int,
  flag6 int
)
row format delimited
FIELDS terminated BY ','
LINES terminated BY '\n'
STORED AS SEQUENCEFILE;
}}

* リソース [#y410d94c]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS