1.安装lzo以及生成测试数据

1.1生成未压缩的测试数据

先生成一个400M左右的测试数据,这样在使用lzo压缩后就能保证压缩文件大小大于数据块大小,方便后续测试分片效果。 我是通过 cat a >> b,cat b >> a 方式快速实现的数据生成。
测试数据链接:

  1. 链接:https://pan.baidu.com/s/1SdW8Nkx-mvrSaoQ2A0U6jA 提取码:o5pn

1.2安装lzo相关工具

lzo格式文件压缩解压需要用到服务器的lzop工具,hadoop 的native库(hadoop checknative是没有的lzo,zip相关信息)并不支持

  1. #检查是否有lzop命令,我这里显示是有的,说明安装过了lzop
  2. [hadoop@hadoop001 ~]$ which lzop
  3. /usr/bin/lzop
  4. #若没有执行如下安装命令
  5. [root@hadoop001 ~]# yum install -y svn ncurses-devel
  6. [root@hadoop001 ~]# yum install -y gcc gcc-c++ make cmake
  7. [root@hadoop001 ~]# yum install -y openssl openssl-devel svn ncurses-devel zlib-devel libtool
  8. [root@hadoop001 ~]# yum install -y lzo lzo-devel lzop autoconf automake cmake

1.3使用lzop工具压缩测试数据

lzo压缩:lzop -v file
lzo解压:lzop -dv file

  1. #压缩后文件后缀名为.lzo
  2. [hadoop@hadoop001 click]$ ll -h
  3. total 472M
  4. -rw-r--r--. 1 hadoop hadoop 472M Apr 14 05:49 page_views.dat
  5. [hadoop@hadoop001 click]$ lzop -v page_views.dat
  6. compressing page_views.dat into page_views.dat.lzo
  7. [hadoop@hadoop001 click]$ ll -h
  8. total 683M
  9. -rw-r--r--. 1 hadoop hadoop 472M Apr 14 05:49 page_views.dat
  10. -rw-r--r--. 1 hadoop hadoop 212M Apr 14 05:49 page_views.dat.lzo

2.编译hadoop-lzo

2.1 获取hadoop-lzo源码

下载源码包,并上传到服务器

  1. 源码地址:https://github.com/twitter/hadoop-lzo

2.2mvn编译源码

  1. #解压
  2. [hadoop@hadoop001 ~]$ unzip ~/source/hadoop-lzo-master.zip
  3. #mvn编译,等待出现BUILD SUCCESS则表示编译成功,几分钟左右
  4. [hadoop@hadoop001 ~]$ cd ~/source/hadoop-lzo-master/
  5. [hadoop@hadoop001 ~]$ mvn clean package -Dmaven.test.skip=true
  6. #查看编译后的jar,hadoop-lzo-0.4.21-SNAPSHOT.jar则为我们需要的jar
  7. [hadoop@hadoop001 hadoop-lzo-master]$ ll target/*.jar
  8. -rw-rw-r--. 1 hadoop hadoop 180667 Apr 14 08:48 target/hadoop-lzo-0.4.21-SNAPSHOT.jar
  9. -rw-rw-r--. 1 hadoop hadoop 185046 Apr 14 08:49 target/hadoop-lzo-0.4.21-SNAPSHOT-javadoc.jar
  10. -rw-rw-r--. 1 hadoop hadoop 52023 Apr 14 08:48 target/hadoop-lzo-0.4.21-SNAPSHOT-sources.jar

3.配置hadoop

可参考hadoop之文件压缩格式对比分析以及配置实现中的hadoop具体配置,下面的配置我是直接贴出来的,可直接使用

3.1上传hadoop-lzo.jar

这一步很重要,踩坑

  1. #将hadoop-lzo-0.4.21-SNAPSHOT.jar 复制到每台hadoop的common目录
  2. [hadoop@hadoop001 hadoop-lzo-master]$ cp hadoop-lzo-0.4.21-SNAPSHOT.jar ~/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/
  3. [hadoop@hadoop001 hadoop-lzo-master]$ ll ~/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/hadoop-lzo*
  4. -rw-rw-r--. 1 hadoop hadoop 180667 Apr 14 08:52 /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar

3.2配置core.site.xml

  1. # 停止hadoop
  2. [hadoop@hadoop001 hadoop-lzo-master]$ stop-all.sh
  3. #编辑core-site.xml添加或修改如下内容
  4. [hadoop@hadoop001 ~]$ vim ~/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/core-site.xml
  5. -----------------------开始-------------------------------
  6. <property>
  7. <name>io.compression.codecs</name>
  8. <value>org.apache.hadoop.io.compress.GzipCodec,
  9. org.apache.hadoop.io.compress.DefaultCodec,
  10. org.apache.hadoop.io.compress.BZip2Codec,
  11. org.apache.hadoop.io.compress.SnappyCodec,
  12. com.hadoop.compression.lzo.LzoCodec,
  13. com.hadoop.compression.lzo.LzopCodec
  14. </value>
  15. </property>
  16. <property>
  17. <name>io.compression.codec.lzo.class</name>
  18. <value>com.hadoop.compression.lzo.LzoCodec</value>
  19. </property>
  20. -----------------------结束-------------------------------
  21. 解析:主要是配置com.hadoop.compression.lzo.LzoCodeccom.hadoop.compression.lzo.LzopCodec压缩类
  22. io.compression.codec.lzo.class必须指定为LzoCodecLzopCodec,不然压缩后的文件不会支持分片的

3.3配置mapred-site.xml

这里主要是开启压缩,并指定默认的压缩格式

  1. #编辑mapred-site.xml添加或修改如下内容
  2. [hadoop@hadoop001 ~]$ vim ~/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/mapred-site.xml
  3. -----------------------开始-------------------------------
  4. <property>
  5. <name>mapreduce.map.output.compress</name>
  6. <value>true</value>
  7. </property>
  8. <property>
  9. <name>mapreduce.map.output.compress.codec</name>
  10. <value>org.apache.hadoop.io.compress.SnappyCodec</value>
  11. </property>
  12. <property>
  13. <name>mapreduce.output.fileoutputformat.compress</name>
  14. <value>true</value>
  15. </property>
  16. <property>
  17. <name>mapreduce.output.fileoutputformat.compress.codec</name>
  18. <value>org.apache.hadoop.io.compress.BZip2Codec</value>
  19. </property>
  20. -----------------------结束-------------------------------
  21. #启动hadoop
  22. [hadoop@hadoop001 ~]$ start-all.sh

4.LZO文件测试

LZO文件分片测试是在hive中进行的,hive的安装启动就不在这里详细的去写了

4.1LZO文件不支持分片
  1. #创建LZO压缩文件测试表,若hadoop的common目录没有hadoop-lzo的jar,就会报类DeprecatedLzoTextInputFormat找不到异常
  2. create table page_views2_lzo(
  3. track_time string,
  4. url string,
  5. session_id string,
  6. referer string,
  7. ip string,
  8. end_user_id string,
  9. city_id string
  10. ) row format delimited fields terminated by '\t'
  11. STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
  12. OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";
  13. #加载lzo格式的测试数据,注意
  14. LOAD DATA LOCAL INPATH '/home/hadoop/data/click/page_views.dat.lzo' OVERWRITE INTO TABLE page_views2_lzo;
  15. #查看数据
  16. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views2_lzo/*
  17. 211.0 M 211.0 M /user/hive/warehouse/wsktest.db/page_views2_lzo/page_views.dat.lzo
  18. #查询测试
  19. select count(1) from page_views2_lzo;
  20. 控制台日志截取:Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 6.88 sec HDFS Read: 221259925 HDFS Write: 8 SUCCESS

由日志我们可以看出只有一个map任务,而我们的数据文件是远大于128M的,说明当前lzo文件默认不支持数据切片

4.2LZO文件支持分片

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

  1. #开启压缩,生成的压缩文件格式必须为设置为LzopCodec,lzoCode的压缩文件格式后缀为.lzo_deflate是无法创建索引的。
  2. SET hive.exec.compress.output=true;
  3. SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;
  4. #创建LZO压缩文件测试表
  5. create table page_views2_lzo_split
  6. STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
  7. OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
  8. as select * from page_views2_lzo;
  9. #查看数据,文件后缀为.lzo
  10. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views2_lzo_split/*
  11. 211.1 M 211.1 M /user/hive/warehouse/wsktest.db/page_views2_lzo_split/000000_0.lzo
  12. #构建LZO文件索引,使用我们之前打的jar包中的工具类
  13. hadoop jar ~/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar \
  14. com.hadoop.compression.lzo.LzoIndexer /user/hive/warehouse/wsktest.db/page_views2_lzo_split
  15. #查询hdfs数据目录,可知在lzo文件同级目录有个.index索引文件
  16. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views2_lzo_split/*
  17. 211.1 M 211.1 M /user/hive/warehouse/wsktest.db/page_views2_lzo_split/000000_0.lzo
  18. 15.7 K 15.7 K /user/hive/warehouse/wsktest.db/page_views2_lzo_split/000000_0.lzo.index
  19. #执行统计分析
  20. select count(1) from page_views2_lzo_split;
  21. 控制台日志:Stage-Stage-1: Map: 2 Reduce: 1 Cumulative CPU: 8.66 sec HDFS Read: 221521265 HDFS Write: 58 SUCCESS

由日志可知 此时有两个map任务。即构建索引后支持数据分片。

总结:

大数据中常见的压缩格式只有bzip2是支持数据分片的,lzo在文件构建索引后才会支持数据分片