Hiveの圧縮ストレージ(Compression Storage)はLZO、Snappyの主流圧縮を含む

18210 ワード

Hiveの圧縮ストレージ(Compression Storage)


Hive tableのデータを圧縮状態で格納することは、ディスク(使用量、IO)の使用表現やquery表現にかかわらず、非圧縮ストレージよりも優れたパフォーマンスを発揮する場合が多い.
Hiveのデフォルトでサポートされている圧縮方式はDeflate、GZIP、BZIP2で、SequenceFile形式のデフォルトは圧縮ストレージであり、GZIP 2の圧縮ファイルは分割をサポートし、TEXTFILEのテーブルに直接インポートすることができる.
-- GZIP Table 
CREATE TABLE raw (line STRING)
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '
'
; 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 '
'
; 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/LCOP取付


LZOとLZOPはHadoopクラスタの各ノードにインストールする必要がある.

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 hadoop 2をコンパイルする.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;