LZO Compression
LZO 一般概念
LZO 是一种无损数据压缩库,它支持速度胜于压缩率。有关 LZO 的常规信息,请参见http://www.oberhumer.com/opensource/lzo和http://www.lzop.org;有关 Hive 中压缩的信息,请参见压缩数据存储。
想象一个包含三列的简单数据文件
-
id
-
first name
-
last name
让我们填充一个包含 4 条记录的数据文件:
19630001 john lennon
19630002 paul mccartney
19630003 george harrison
19630004 ringo starr
我们将数据文件称为/path/to/dir/names.txt
。
为了使其成为 LZO 文件,我们可以使用 lzopUtil,它将创建一个names.txt.lzo
文件。
现在将文件names.txt.lzo
复制到 HDFS。
Prerequisites
Lzo/Lzop Installations
需要在 Hadoop 集群的每个节点上安装lzo
和lzop
。这些安装的详细信息超出了本文档的范围。
core-site.xml
将以下内容添加到您的core-site.xml
:
-
com.hadoop.compression.lzo.LzoCodec
-
com.hadoop.compression.lzo.LzopCodec
For example:
<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>
接下来,我们运行命令来创建 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
这将在 HDFS 上创建names.txt.lzo
。
Table Definition
以下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
'命令正确运行。
有关命令语法的信息,请参见CREATE TABLE和Hive CLI。
Hive Queries
选项 1:直接创建 LZO 文件
-
直接创建 LZO 文件作为 Hive 查询的输出。
-
使用
lzop
命令 Util 或您的自定义 Java 为.lzo
文件生成.lzo.index
。
配置查询参数
SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec
SET hive.exec.compress.output=true
SET mapreduce.output.fileoutputformat.compress=true
For example:
hive -e "SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec; SET hive.exec.compress.output=true;SET mapreduce.output.fileoutputformat.compress=true; <query-string>"
** 注意:如果数据集很大或输出文件的数量很大,则此选项不起作用.
选项 2:编写自定义 Java 创建 LZO 文件
-
创建文本文件作为 Hive 查询的输出。
-
编写自定义 Java 代码到
-
将 Hive 查询生成的文本文件转换为
.lzo
个文件- 为上面生成的
.lzo
个文件生成.lzo.index
个文件
- 为上面生成的
配置查询参数
使用以下参数为查询字符串添加前缀:
SET hive.exec.compress.output=false
SET mapreduce.output.fileoutputformat.compress=false
For example:
hive -e "SET hive.exec.compress.output=false;SET mapreduce.output.fileoutputformat.compress=false;<query-string>"