Hive語言手冊之四:壓縮數據存貯與應用

一、壓縮數據存儲
有時候,Hive Table中的壓縮數據比不壓縮的數據在磁盤讀取與查詢性能方面都有比較好的性能。可以把使用GZip或BZip2壓縮的文本數據直接導入到Hive,並且以TextFile格式進行存儲,Hive可以識別壓縮的數據並且在查詢時進行實時解壓,例如:
CREATE TABLE raw (line STRING)
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INPATH '/tmp/weblogs/20090603-access.log.gz' INTO TABLE raw;
在示例中,表raw以缺省格式TextFile存儲。然而,這種情況下,Hadoop將無法把數據文件分解成塊實現並行處理,從而引起整個集羣的運算能力利用不足。
比較好的解決方案是把數據插入到另一個以SequenceFile格式存儲的表中,以SequenceFile格式存儲的數據可以被Hadoop分解成塊並且分配到多個Job上進行並行處理,處理過程示例如下:
CREATE TABLE raw (line STRING)
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';

CREATE TABLE raw_sequence (line STRING)
   STORED AS SEQUENCEFILE;

LOAD DATA LOCAL INPATH '/tmp/weblogs/20090603-access.log.gz' INTO TABLE raw;

SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK; -- NONE/RECORD/BLOCK (see below)
INSERT OVERWRITE TABLE raw_sequence SELECT * FROM raw;
參數io.seqfile.compression.type 用來指明以何種方式(NONE/RECORD/BLOCK)處理壓縮數據。SequenceFile的操作中有三種處理方式:1) NONE:不壓縮數據直接。2)RECORD:壓縮value值不壓縮key值存儲的存儲方式。3)BLOCK: key/value值都壓縮的方式存儲。
二、使用LZO
LZO是一個更關注壓縮速度的無損壓縮庫,詳細信息見http://www.oberhumer.com/opensource/lzohttp://www.lzop.org
想象在一個文件中包含以下三個列:
• id
• first name
• last name
文件中包含以下四條記錄:
19630001     john          lennon
19630002     paul          mccartney
19630003     george        harrison
19630004     ringo         starr
文件命名爲names.txt ,存放在/path/to/dir/。使用lzop工具把文件壓縮成一個LZO文件並且命名爲names.txt.lzo,然後把它複製到HDFS
1、Lzo/Lzop應用配置
(1)lzo 和lzop需要被安裝在Hadoop集羣中的每一個節點上,詳細的安裝細節在此不做詳述,參見相關資料。
(2)配置文件core-site.xml,添加參數com.hadoop.compression.lzo.LzoCodec和com.hadoop.compression.lzo.LzopCodec:
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
(3)創建LZO索引文件:
hadoop jar /path/to/jar/hadoop-lzo-cdh4-0.4.15-gplextras.jar com.hadoop.compression.lzo.LzoIndexer  /path/to/HDFS/dir/containing/lzo/files
2、創建表
下面的hive –e創建一個LZO壓縮的外部表:
hive -e "CREATE EXTERNAL TABLE IF NOT EXISTS hive_table_name (column_1  datatype_1......column_N datatype_N)
         PARTITIONED BY (partition_col_1 datatype_1 ....col_P  datatype_P)
         ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
         STORED AS INPUTFORMAT  \"com.hadoop.mapred.DeprecatedLzoTextInputFormat\"
                   OUTPUTFORMAT \"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\";
注意:雙引號必須進行轉義,否則hive -e 無法正常工作
3、Hive查詢
方法1:直接創建LZO文件
(1)直接爲Hive查詢輸出創建LZO文件
(2)使用lzop命令工具或者編寫Java程序爲.lzo文件創建索引文件.lzo.index。
Hive查詢參數
SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec
SET hive.exec.compress.output=true
SET mapreduce.output.fileoutputformat.compress=true
示例:
hive -e "SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;SET hive.exec.compress.output=true;SET mapreduce.output.fileoutputformat.compress=true;<query-string>"
     注意:如果數據集或者輸出結果集太大,上面的命令將無法執行
方法2: 通過Java程序創建LZO文件
(1)以普通文本文件保存Hive查詢結果
(2)寫Java程序實現:Write custom Java code to
       (a) 把查詢產生的文本文件轉換成.lzo文件
       (b) 爲.lzo文件生成LZO索引文件
Hive查詢參數
SET hive.exec.compress.output=false
SET mapreduce.output.fileoutputformat.compress=false
示例:
hive -e "SET hive.exec.compress.output=false;SET mapreduce.output.fileoutputformat.compress=false;<query-string>"


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章