Hadoopチューニング >

おすすめの圧縮利用法

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

圧縮データのロード

  • 以下は、内容は全く同じで圧縮形式の異なるデータをテーブル(TextFile?ストレージ)にロードし、同じクエリを実行した場合の結果です。
  • 圧縮により消費領域が節約できるとともに、Gzip、LZO圧縮についてはクエリ応答時間が大幅に短縮されていることが分かります。LZO圧縮の利用がおすすめです。
  • ただし、TextFile?ストレージの圧縮はファイルベースなので、Mapタスク数が1になっている点に注意する必要があります。大規模データでは(分散処理が見込めないので)急激に速度が低下する恐れがありますので、ストレージに SequenceFile? を利用することをおすすめします。
    No.圧縮形式テーブルデータ量ロード時間(秒)クエリ応答時間(秒)Map数詳細
    1Raw1,592,052,200-165.71924filetextfile_no_compress001.png
    2Gzip圧縮(Deflate)207,106,4049.00792.2411fileload_gzip_001.png
    3LZO331,001,5470.53888.7951fileload_lzo_001.png
    4Bzip2圧縮144,019,5270.544214.871fileload_bzip2_001.png

テストログ

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

Gzip

  1. hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.gz'
  2.     > overwrite INTO TABLE postcodes;
  3. Loading data to table postcodes
  4. OK
  5. Time taken: 9.007 seconds
  6.  
  7. grunt> ls /user/hive/warehouse/postcodes
  8. hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.gz<r 1>  207106404
  9.  
  10. hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
  11. ...
  12. Time taken: 92.241 seconds

LZO

  1. hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.lzo'
  2.     > overwrite INTO TABLE postcodes;
  3. Loading data to table postcodes
  4. OK
  5. Time taken: 0.538 seconds
  6.  
  7. grunt> ls /user/hive/warehouse/postcodes
  8. hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.lzo<r 1> 331001547
  9.  
  10. Time taken: 88.795 seconds

Bzip2

  1. hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv.bz2'
  2.     > overwrite INTO TABLE postcodes;
  3. Loading data to table postcodes
  4. OK
  5. Time taken: 0.544 seconds
  6.  
  7. grunt> ls /user/hive/warehouse/postcodes
  8. hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv.bz2<r 1> 144019527
  9.  
  10. hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
  11. ...
  12. Time taken: 214.87 seconds

SequenceFile? の利用

  • 以下は、各ストレージに全く同じデータを投入し、同じクエリを実行した場合の結果です。
  • 圧縮により消費領域が節約できるとともに、Deflate、LZO圧縮についてはクエリ応答時間が大幅に短縮されていることが分かります。LZOもしくはDeflate圧縮を伴った SequenceFile? の利用がおすすめです。
    No.ストレージタイプデータ量ロード時間(秒)クエリ応答時間(秒)Map数詳細
    1テキストファイル(raw)1,592,052,200-165.71924filetextfile_no_compress001.png
    2SequenceFile?(Deflate圧縮)229,036,0511186.35789.2134fileseqfile_deflate_compress001.png
    3SequenceFile?(LZO圧縮)414,012,342946.14595.4396fileseqfile_lzo_compress001.png
    4SequenceFile?(Bzip2圧縮)159,883,1852,307.423166.133fileseqfile_bzip2_compress001.png

テストログ

テキストファイル

  1. hive> LOAD DATA inpath '/user/hadoop/work/postcodes.x100.csv'
  2.     > overwrite INTO TABLE postcodes;
  3. Loading data to table postcodes
  4. OK
  5. Time taken: 0.367 seconds
  6.  
  7. grunt> ls /user/hive/warehouse/postcodes
  8. hdfs://localhost:9000/user/hive/warehouse/postcodes/postcodes.x100.csv<r 1>     1592052200
  9.  
  10. hive> SELECT org_code, count(org_code) FROM postcodes GROUP BY org_code;
  11. ...
  12. Time taken: 165.719 seconds

SequenceFile?(Deflate圧縮)

  1. hive> set hive.exec.compress.output=true;
  2. hive> set mapred.output.compression.type=BLOCK;
  3. hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
  4. ...
  5. Loading data to table postcodes_seq
  6. 12287400 Rows loaded to postcodes_seq
  7. OK
  8. Time taken: 1186.357 seconds
  9.  
  10. grunt> ls /user/hive/warehouse/postcodes_seq
  11. hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0002_r_000000_0<r 1>       229036051
  12.  
  13. hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
  14. ...
  15. Time taken: 89.213 seconds

SequenceFile?(LZO圧縮)

  1. hive> set hive.exec.compress.output=true;
  2. hive> set mapred.output.compression.type=BLOCK;
  3. hive> set mapred.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
  4. hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
  5. ...
  6. Loading data to table postcodes_seq
  7. 12287400 Rows loaded to postcodes_seq
  8. OK
  9. Time taken: 946.145 seconds
  10.  
  11. grunt> ls /user/hive/warehouse/postcodes_seq
  12. hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0011_r_000000_0<r 1>       206579657
  13. hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0011_r_000001_0<r 1>       207432685
  14.  
  15. hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
  16. ...
  17. Time taken: 95.439 seconds

SequenceFile?(Bzip2圧縮)

  1. hive> set hive.exec.compress.output=true;
  2. hive> set mapred.output.compression.type=BLOCK;
  3. hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
  4. hive> INSERT OVERWRITE TABLE postcodes_seq SELECT * FROM postcodes;
  5. ...
  6. Loading data to table postcodes_seq
  7. 12287400 Rows loaded to postcodes_seq
  8. OK
  9. Time taken: 2307.423 seconds
  10.  
  11. grunt> ls /user/hive/warehouse/postcodes_seq
  12. hdfs://localhost:9000/user/hive/warehouse/postcodes_seq/attempt_201007141806_0014_r_000000_0<r 1>       159883185
  13.  
  14. hive> SELECT org_code, count(org_code) FROM postcodes_seq GROUP BY org_code;
  15. ...
  16. Time taken: 166.13 seconds

HDFS上のファイルのSequenceFile?テーブルへのロードは不可

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

データの圧縮ストア

TODO

テストの詳細

概要

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

テスト環境

No.項目内容備考
1CPUIntel Core Duo T2300 1.66GHz
2メモリ4GBただし、32bit環境。
3OSUbuntu 9.04
4JDKOpenJDK 6
5HadoopVer. 0.20.2, r911707、1台で擬似分散モード
6HiveVer. 0.5.0

スキーマ

  • テストに用いたテーブルの定義は以下の通りです。
    1. CREATE TABLE postcodes (
    2.   org_code string,
    3.   old_postcode string,
    4.   postcode string,
    5.   todoufuken_yomi string,
    6.   shikuchoson_yomi string,
    7.   choiki_yomi string,
    8.   todoufuken string,
    9.   shikuchoson string,
    10.   choiki string,
    11.   flag1 int,
    12.   flag2 int,
    13.   flag3 int,
    14.   flag4 int,
    15.   flag5 int,
    16.   flag6 int
    17. )
    18. row format delimited
    19. FIELDS terminated BY ','
    20. LINES terminated BY '\n';
    21.  
    22. CREATE TABLE postcodes_seq (
    23.   org_code string,
    24.   old_postcode string,
    25.   postcode string,
    26.   todoufuken_yomi string,
    27.   shikuchoson_yomi string,
    28.   choiki_yomi string,
    29.   todoufuken string,
    30.   shikuchoson string,
    31.   choiki string,
    32.   flag1 int,
    33.   flag2 int,
    34.   flag3 int,
    35.   flag4 int,
    36.   flag5 int,
    37.   flag6 int
    38. )
    39. row format delimited
    40. FIELDS terminated BY ','
    41. LINES terminated BY '\n'
    42. STORED AS SEQUENCEFILE;

リソース


添付ファイル: fileload_lzo_001.png 598件 [詳細] fileload_gzip_001.png 604件 [詳細] fileload_bzip2_001.png 514件 [詳細] filetextfile_no_compress001.png 631件 [詳細] fileseqfile_lzo_compress001.png 524件 [詳細] fileseqfile_deflate_compress001.png 619件 [詳細] fileseqfile_bzip2_compress001.png 529件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-18 (日) 15:48:35 (2989d)