LZO Compression

LZO 一般概念

LZO 是一种无损数据压缩库,它支持速度胜于压缩率。有关 LZO 的常规信息,请参见http://www.oberhumer.com/opensource/lzohttp://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 集群的每个节点上安装lzolzop。这些安装的详细信息超出了本文档的范围。

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 TABLEHive 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>"