hadoop支持LZO压缩文件的分片的过程

关于LZO和LZOP
  • LZO是一个适合实时解压、压缩的压缩库。LZO并不是linux系统原生支持,所以需要下载安装软件包,让linux支持这种压缩格式。
  • LZOP 基于LZO库的压缩解压工具,lzop工具依赖于lzo库。
  • 有了压缩解压库LZO,还不能直接操作文件压缩解压,需要LZOP。
  • lzop是一款与gzip很类似的文件压缩工具,它使用lzo压缩库来提供服务,与gzip工具相比,它的最大优势就是极快的压缩速度和解压速度(在相同的压缩比例的前提下)。
  • hadoop本身不支持lzo,下载 hadoop lzo支持到源代码,将编译出来到hadoop-lzo-*.jar 部 署到hadoop集群到各个slave到某个有效目录下,如$HADOOOP_HOME/lib。
  • lzo压缩格式有很快的压缩/解压速度和合理的压缩率,并且建了索引后支持分片(split),所以lzo是目前在Hadoop中最流行的压缩格式。hadoop中的lzo不是自带的,如果要支持lzo,需要另外安装。
  • Hadoop经常用于处理大量的数据,如果期间的输出数据、中间数据能压缩存储,对系统的I/O性能会有提升。综合考虑压缩、解压速度、是否支持split,目前lzo是最好的选择。
Linux上安装LZO和LZOP

如果已经安装,请忽略。如果没有安装,自行百度,或者参考这篇博客:

#如何在linux(Ubuntu)下编译和安装lzop压缩工具源码
https://blog.csdn.net/leon1741/article/details/78189194

我的之前已经安装过LZO和LZOP

[hadoop@hadoop001 data]$ which lzop
/usr/bin/lzop
安装HADOOP-LZO
获取hadoop-lzo源码
[hadoop@hadoop001 soft]$ wget https://github.com/twitter/hadoop-lzo/archive/master.zip

下载下来是一个zip的压缩文件,需要解压:

[hadoop@hadoop001 soft]$ unzip master.zip -d ~/app/

[hadoop@hadoop001 hadoop-lzo-master]$ ls
COPYING  pom.xml  README.md  scripts  src

修改pom.xml,与自己的hadoop版本一致(不修改好像也是可以的)

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hadoop.current.version>2.6.0</hadoop.current.version>
    <hadoop.old.version>1.0.4</hadoop.old.version>
</properties>

然后进入hadoop-lzo-master目录,依次执行下面的命令(这个不做好像也可以)

[hadoop@hadoop001 hadoop-lzo-master]$ export CFLAGS=-m64
[hadoop@hadoop001 hadoop-lzo-master]$ export CXXFLAGS=-m64
[hadoop@hadoop001 hadoop-lzo-master]$ export C_INCLUDE_PATH=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lzo/include
[hadoop@hadoop001 hadoop-lzo-master]$ export LIBRARY_PATH=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lzo/lib
hadoop-lzo源码编译

进入hadoop-lzo-master目录,执行编译命令:

[hadoop@hadoop001 hadoop-lzo-master]$ mvn clean package -Dmaven.test.skip=true
....
[INFO] Building jar: /home/hadoop/app/hadoop-lzo-master/target/hadoop-lzo-0.4.21-SNAPSHOT-javadoc.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 58.674 s
[INFO] Finished at: 2019-05-01T00:37:58+08:00
[INFO] Final Memory: 35M/982M
[INFO] ------------------------------------------------------------------------
[hadoop@hadoop001 hadoop-lzo-master]$ 

把target目录下的hadoop-lzo-0.4.21-SNAPSHOT.jar包拷贝到$HADOOP_HOME/share/hadoop/common/下面

[hadoop@hadoop001 target]$ cp hadoop-lzo-0.4.21-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/
配置Hadoop的core-site.xml和mapred-site.xml文件

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,
            org.apache.hadoop.io.compress.SnappyCodec,
            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>
#io.compression.codec.lzo.class必须指定为LzoCodec非LzopCodec,不然压缩后的文件不会支持分片的

mapred-site.xml添加如下的代码:

<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<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>
测试数据准备

现在准备个日志数据

#原始数据大小为381M
[hadoop@hadoop001 data]$ ll -h
-rw-r--r-- 1 hadoop hadoop 381M May  1 10:44 page_views.dat
#用lzop压缩命令把它压缩为lzo格式
[hadoop@hadoop001 data]$ lzop -v page_views.dat
compressing page_views.dat into page_views.dat.lzo
#压缩完后的大小为171M
[hadoop@hadoop001 data]$ ll -h
-rw-r--r-- 1 hadoop hadoop 381M May  1 10:44 page_views.dat
-rw-r--r-- 1 hadoop hadoop 171M May  1 10:44 page_views.dat.lzo

需要注意的是.lzo文件是171M,大于一个块的大小128M。这样可以模拟后面hadoop支持LZO压缩文件的分片的过程。*

LZO压缩文件不建索引不支持分片测试

现在用hive工具进行测试:
创建一张hive表page_views_lzo

create table page_views_lzo(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";

把本地的lzo文件数据加载到hive表中:

hive (g6)> LOAD DATA LOCAL INPATH '/home/hadoop/data/page_views.dat.lzo' OVERWRITE INTO TABLE page_views_lzo;
Loading data to table g6.page_views_lzo
Table g6.page_views_lzo stats: [numFiles=1, numRows=0, totalSize=178709268, rawDataSize=0]
OK
Time taken: 2.829 seconds

看一下在hdfs上的数据;

[hadoop@hadoop001 data]$ hdfs dfs -du -s -h /user/hive/warehouse/g6.db/page_views_lzo
170.4 M  170.4 M  /user/hive/warehouse/g6.db/page_views_lzo
[hadoop@hadoop001 data]$

开始测试:

hive (g6)> select count(1) from page_views_lzo;
Query ID = hadoop_20190501121111_5d6a0fb7-33e0-4611-a494-526981c1da4e
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Job = job_1556676300841_0003, Tracking URL = http://hadoop001:18088/proxy/application_1556676300841_0003/
Kill Command = /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/bin/hadoop job  -kill job_1556676300841_0003
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2019-05-01 12:14:27,934 Stage-1 map = 0%,  reduce = 0%
2019-05-01 12:14:42,116 Stage-1 map = 49%,  reduce = 0%, Cumulative CPU 4.06 sec
2019-05-01 12:14:44,222 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 5.03 sec
2019-05-01 12:14:53,815 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.53 sec
MapReduce Total cumulative CPU time: 6 seconds 530 msec
Ended Job = job_1556676300841_0003
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 6.53 sec   HDFS Read: 178716309 HDFS Write: 8 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 530 msec
OK
_c0
2100000
Time taken: 41.975 seconds, Fetched: 1 row(s)

可以看到Stage-Stage-1: Map: 1 Reduce: 1 ,只有一个map,而我们的数据文件是大于一个块的大小128M的,说明当前lzo文件默认不支持数据切片。

对LZO文件建索引后支持分片测试

注意若不是直接load的lzo文件,需要开启压缩,且压缩格式为LzopCodec,load数据并不能改变文件格式和压缩格式。

hive (g6)> SET hive.exec.compress.output;
hive.exec.compress.output=false
hive (g6)> SET hive.exec.compress.output=true;
hive (g6)> SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;

再创建一张表page_views_lzo_split:

create table page_views_lzo_split
STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
as select *  from page_views_lzo;

建索引之前查看一下:
在这里插入图片描述
对上面的lzo文件用hadoop-lzo-0.4.21-SNAPSHOT.jar这个jar包建立索引:

[hadoop@hadoop001 data]$ hadoop jar ~/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar \
> com.hadoop.compression.lzo.LzoIndexer /user/hive/warehouse/g6.db/page_views_lzo_split

运行完,建完索引后,再看:
在这里插入图片描述
可以看到在同级目录下生成了 000000_0.lzo.index索引文件。
开始测试:

hive (g6)> select count(1) from page_views_lzo_split;
Query ID = hadoop_20190501121111_5d6a0fb7-33e0-4611-a494-526981c1da4e
Total jobs = 1
.......
Hadoop job information for Stage-1: number of mappers: 2; number of reducers: 1
.........
Stage-Stage-1: Map: 2  Reduce: 1   Cumulative CPU: 7.9 sec   HDFS Read: 178943226 HDFS Write: 58 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 900 msec
OK
_c0
2100000
Time taken: 39.066 seconds, Fetched: 1 row(s)
hive (g6)> 

从上面可以看到map的数量限制变成了2个。由此可见,当对lzo文件建立索引后,Hadoop就支持数据分片了。
大数据中,textfile文本文件支持分片,bzip2是支持数据分片,当对lzo文件建立索引后Hadoop才会支持分片。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值