cindysz110 / blog

8 stars 1 forks source link

[Hadoop] Hadoop中压缩的使用 #34

Open cindygl opened 6 years ago

cindygl commented 6 years ago

1. 常用缩格式

压缩格式需要关注两个因素:

使用压缩带来的好处是:减少磁盘空间,减少磁盘的I/O,加速网络传输;同时,压缩带来的CPU消耗是比较高的。而且,压缩速度和压缩比是成反比的,生产中具体压缩方式的选择,是要根据实际的需要来选择(如果是历史数据,选择压缩比大的;如果要求执行速度快的,选择压缩比小的)。

2. 压缩在Hadoop中的应用

Hadoop的jobs都是I/O密集型的,压缩可以加速IO操作;压缩可以减少数据在网络传输时的size,提升性能。压缩格式要支持切割(分片)。

2.1 支持分割(分片)的压缩格式

在上面的压缩格式中,只有bzip2和LZO是支持分割的,且LZO是有条件的(被索引:com.hadoop.compression.lzo.LzoIndexer去创建一个index)分割。

Compression format Tool Algorithm File extention Splittable
gzip gzip DEFLATE .gz No
bzip2 bzip2 bzip2 .bz2 Yes
LZO lzop LZO .lzo Yes if indexed
Snappy N/A Snappy .snappy No

概念理解:

查看机器上的hadoop支持哪些压缩格式(只有编译后的hadoop的才能支持各种压缩方式)

[hadoop@hadoop01 ~]$ hadoop checknative 
18/08/13 18:43:08 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/08/13 18:43:08 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:  true /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0
zlib:    true /lib64/libz.so.1
snappy:  true /lib64/libsnappy.so.1
lz4:     true revision:99
bzip2:   true /lib64/libbz2.so.1
openssl: true /lib64/libcrypto.so
[hadoop@hadoop01 ~]$ 

2.2 常用的Codec

2.3 压缩在MapReduce中的应用

image MapReduce的三个阶段都可以压缩,map读进来的时候可以压缩,读进来之后解压;reduce读的时候要解压,reduce写出去的时候要压缩。 image

结论:

2.4 压缩实战

2.4.1 hadoop的压缩

2.4.1.1 修改hadoop配置文件

配置core-site.xml(①)

<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,
    </value>
</property>

配置mapred-site.xml(③)

<property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
</property>
<property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>

中间一步(②),打开hadoop官网,查看mapred-default.xml配置文件。 image 修改完配置文件之后要重启hdfs和yarn服务。

2.4.1.2 跑一个MapReduce作业测试
[hadoop@hadoop01 ~]$ cd app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/
[hadoop@hadoop01 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /tmp/input.txt /tmp/compression-out/
...
[hadoop@hadoop01 mapreduce]$ 

查看结果,输出结果的压缩格式为.bz2,与配置文件一致

[hadoop@hadoop01 mapreduce]$ hdfs dfs -ls /tmp/compression-out/
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2018-08-13 20:01 /tmp/compression-out/_SUCCESS
-rw-r--r--   1 hadoop supergroup         65 2018-08-13 20:01 /tmp/compression-out/part-r-00000.bz2
[hadoop@hadoop01 mapreduce]$ hdfs dfs -text /tmp/compression-out/part-r-00000.bz2
18/08/13 20:02:53 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/08/13 20:02:53 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
data    1
is  2
sample  1
test    2
this    2
[hadoop@hadoop01 mapreduce]$ 

2.4.1 hive的压缩

2.4.1.1 在hive创建一张不压缩的表,把数据导进去
hive> create table test1(
    > c1 string,
    > c2 string,
    > c3 string,
    > c4 string,
    > c5 string,
    > c6 string,
    > c7 string,
    > c8 string,
    > c9 string,
    > c10 string,
    > c11 string,
    > c12 string,
    > c13 string,
    > c14 string,
    > c15 string,
    > c16 string,
    > c17 string,
    > c18 string,
    > c19 string,
    > c20 string,
    > c21 string,
    > c22 string,
    > c23 string,
    > c24 string,
    > c25 string,
    > c26 string,
    > c27 string,
    > c28 string,
    > c29 string,
    > c30 string,
    > c31 string,
    > c32 string,
    > c33 string
    > )
    > row format delimited fields terminated by '||';
OK
Time taken: 0.716 seconds
hive> load data local inpath '/home/hadoop/data/20180813000203.txt' overwrite into table test1;
hive> select count(1) from test1;
OK
76241
Time taken: 20.67 seconds, Fetched: 1 row(s)
hive> 

此时hdfs上查看一下文件的大小

[hadoop@hadoop01 data]$ hdfs dfs -du -s -h /user/hive/warehouse/test1
37.4 M  37.4 M  /user/hive/warehouse/test1
[hadoop@hadoop01 data]$ 
2.4.1.2 在hive创建一张bzip2的表,把数据导进去(查看hive怎么压缩,打开hive官网,点击compression)

查看hive当前的压缩格式,默认是不压缩的

hive> SET hive.exec.compress.output;
hive.exec.compress.output=false
hive> 

查看hive当前的codec,默认是bzip2

hive> SET mapreduce.output.fileoutputformat.compress.codec;
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec
hive> 

设置一下压缩格式为bzip2,codec也为bzip2,并且创建一张表

hive> SET hive.exec.compress.output=true;
hive> SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
hive> create table test1_bzip2
    > row format delimited fields terminated by '||'
    > as select * from test1;

去hdfs上查看文件的大小,文件大小由最初的37.4M变成了450.0K(这里bzip2的压缩比应该是30%左右,因为我的数据本身有很多重复,所以压缩后体积缩小非常大),hdfs上存储的格式也变成了.bz2

[hadoop@hadoop01 data]$ hdfs dfs -du -s -h /user/hive/warehouse/test1_bzip2
450.0 K  450.0 K  /user/hive/warehouse/test1_bzip2
[hadoop@hadoop01 data]$ hdfs dfs -ls /user/hive/warehouse/test1_bzip2
Found 1 items
-rwxr-xr-x   1 hadoop supergroup     460749 2018-08-13 20:32 /user/hive/warehouse/test1_bzip2/000000_0.bz2

特别注意:为了不影响其他用户,通常使用压缩格式的时候不要设置为全局设置,使用完了以后要马上改回来!!

hive> SET hive.exec.compress.output=false;
JustDoDT commented 5 years ago

写得不错。