Hive之压缩存储(Compression Storage)包括LZO、Snappy主流压缩

Hive之压缩存储(Compression Storage)

为什么需要采取压缩存储?

小明答:

将Hive table的数据以压缩状态进行存储在很多情况下比非压缩存储有更好的性能体现,不管是在磁盘(用量、IO)使用表现以及query表现方面。

Hive默认支持的压缩方式有Deflate、GZIP、BZIP2,SequenceFile格式默认就是压缩存储,而且GZIP2的压缩文件支持切分,可以直接导入到TEXTFILE的表中。

--将GZIP的压缩文件直接导入Table中
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;

可以以序列化的格式进行存储进行优化,由于表结构是一样的。

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;

1 LZO压缩

LZO是一款主流的数据零丢失的压缩格式,超快的压缩速度、超高的压缩率

1.1 LZO使用前准备

#查看Hadoop目前支持的所有压缩格式
bin/hadoop checknative

1.1.1 安装LZO/LZOP

LZO和LZOP需要在Hadoop集群的每个Node节点上安装。

1.1.2 配置core-site.xml


<property>
<name>io.compression.codecsname>
<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.classname>
<value>com.hadoop.compression.lzo.LzoCodecvalue>
property>

1.1.3 定义table

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';
"

1.1.4 查询LZO存储的表

SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress=true;

SELECT * FROM lzoTableName;

2 Snappy压缩

不管三七二十一,首先bin/hadoop checknative -a,如果已经true则支持snappy,那就不用额外安装了。

OS: CentOS 7
Hadoop: 2.7.2
Hive: 1.2.1

Hive中配置snappy压缩,`可以在Mapper端的输出阶段、reducer的输出阶段使用过压缩算法,也可以将压缩后的数据加载到表中用于查询,Hive会自动通过后缀名自动识别对应的压缩格式,并在查询时进行解压,但是需要保持数据文件和表的格式一致,否则只会显示结果全为NULL。

2.1 下载Snappy并安装

首先在github或者官网下载相关的源码:snappy-1.1.x.tar.gz

# 安装环境
0、yum -y install gcc gcc-c++ autoconf automake libtools

1、 tar -zxvf snappy-1.1.x.tar.gz

2、
./configure
make
make install

3、查看是否安装成功
ls -lh /usr/local/lib | grep snappy
>libsnappy.a

libsnappy.la

libsnappy.so

libsnappy.so.1

libsnappy.so.1.3.0

2.2 编译hadoop2.X的源码

下载hadoop-2.7.x-src.tar.gz

#安装支持环境
yum -y install cmake zlib-devel ant libssl-dev openssl-devel lzo-devel

#解压
tar -zxvf hadoop-2.7.x-src.tar.gz  hadoop-2.7.x-src;

#进入源码主目录
cd /hadoop-2.7.x-src

#编译Hadoop源码支持snappy
mvn clean package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/lib

# 进入编译后的jar
cd /hadoop-dist/target

# 将native下的文件拷贝到现有hadoop的lib目录下
cp native /hadoop-2.7.x/lib

# 分发lib目录到所有节点,并重启hadoop应用

2.3 配置对应的Hive参数设置压缩阶段以及压缩方式

2.3.1 core-site.xml

<property>
<name>io.compression.codecsname>
<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,org.apache.hadoop.io.compress.SnappyCodec
value>
property>

<property>
    <name>mapreduce.map.output.compressname>
    <value>truevalue>
property>
<property>
    <name>mapreduce.map.output.compress.codecname>
    <value>org.apache.hadoop.io.compress.SnappyCodecvalue>
property>

2.3.2 Map端的输出结果压缩

--也可以在mapred-site.xml中进行配置
set hive.exec.compress.intermediate=true; --Hive中MR中间文件压缩
set mapreduce.map.output.compress=true; --开启Hadoop的MapReduce任务中Map输出压缩功能
--设置Hadoop的MapReduce任务中Map阶段压缩算法(对应的编/解码器)
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

2.3.3 Reduce端的输出结果压缩

--也可以在mapred-site.xml
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

2.3.4 验证snappy安装配置是否成功

--验证是否结果压缩,通过到处数据走MRJOB,看最终的生成的文件是否为*.snappy
INSERT OVERWRITE LOCAL DIRECTORY '/TMP/HIVE/DATA/EXPORT' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
SELECT * FROM EMP;

--将压缩文件的数据导入到Hive的临时表
CREATE TEMPORARY TABLE TMP LIKE EMP ;
LOAD DATA LOCAL INAPTH '/TMP/HIVE/DATA/EXPORT/**.snappy' OVERWRITE INTO TABLE TMP;
SELECT * FROM TMP;

你可能感兴趣的:(Hive,lzo)