使用Hadoop自带的wc的mr程序测试LZO的特性,测试index与否的map task个数

Hadoop admin 2年前 (2018-11-05) 43次浏览 0个评论 扫描二维码

特别注意:lzo的压缩比和压缩效率综合起来性价比是比较高的,但是lzo必须有索引才能进行split,以便多个map进行读取实现并行处理,在spark中也可以进行相同的操作,但并不是适合所有场景。比如集群负载已经很高,压缩需要额外的CPU,对性能产生影响

1、安装lzop压缩软件 native library

[root@hadoop000 package]#  wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz

[root@hadoop000 package]#  tar -zxvf lzo-2.06.tar.gz

[root@hadoop000 package]# cd lzo-2.06

[root@hadoop000 package]# export CFLAGS=-m64

[root@hadoop000 package]# ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/

[root@hadoop000 package]# make && sudo make install


编译完lzo包之后,会在/usr/local/hadoop/lzo/生成一些文件。

将/usr/local/hadoop/lzo目录下的所有文件打包,并同步到集群中的所有机器上。

在编译lzo包的时候,需要一些环境,可以用下面的命令安装好lzo编译环境

[root@hadoop000 package]# yum -y install  lzo-devel  zlib-devel  gcc autoconf automake libtool

2、安装hadoop-lzo


下载 [root@hadoop000 package]# wget https://codeload.github.com/twitter/hadoop-lzo/zip/release-0.4.20 [root@hadoop000 package]# unzip hadoop-lzo-release-0.4.20.zip hadoop-lzo中的pom.xml依赖了hadoop,由于我们这里用到的是Hadoop 2.6.0,所以建议将hadoop版本修改为2.6.0: [root@hadoop000 hadoop-lzo-release-0.4.20]# vim pom.xml <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> [root@hadoop000 hadoop-lzo-release-0.4.20]# export CFLAGS=-m64 [root@hadoop000 hadoop-lzo-release-0.4.20]# export CXXFLAGS=-m64 [root@hadoop000 hadoop-lzo-release-0.4.20]# export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include [root@hadoop000 hadoop-lzo-release-0.4.20]# export LIBRARY_PATH=/usr/local/hadoop/lzo/lib [root@hadoop000 hadoop-lzo-release-0.4.20]# mvn clean package -Dmaven.test.skip=true 将lzo对应的native包拷贝到hadoop中的native [root@hadoop000 hadoop-lzo-release-0.4.20]# cd target/native/Linux-amd64-64 [root@hadoop000 hadoop-lzo-release-0.4.20]# tar -cBf - -C lib . | tar -xBvf - -C ~ [root@hadoop000 hadoop-lzo-release-0.4.20]# cp ~/libgplcompression* $HADOOP_HOME/lib/native/ [root@hadoop000 hadoop-lzo-release-0.4.20]# cp target/hadoop-lzo-0.4.20-SNAPSHOT.jar $HADOOP_HOME/share/hadoop/common/ 其实在tar -cBf – -C lib . | tar -xBvf – -C ~命令之后,会在~目录下生成一下几个文件: [root@hadoop000 ~]# ls -l 1-rw-r--r-- 1 libgplcompression.a 2-rw-r--r-- 1 libgplcompression.la 3lrwxrwxrwx 1 libgplcompression.so -> libgplcompression.so.0.0.0 4lrwxrwxrwx 1 libgplcompression.so.0 -> libgplcompression.so.0.0.0 5-rwxr-xr-x 1 libgplcompression.so.0.0.0 其中libgplcompression.so和libgplcompression.so.0是链接文件,指向libgplcompression.so.0.0.0, 将刚刚生成的libgplcompression*和target/hadoop-lzo-0.4.18-SNAPSHOT.jar同步到集群中的所有机器对应的目录。

3、配置hadoop环境变量

1)在$HADOOP_HOME/etc/hadoop/core-site.xml加上如下配置:

<property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.GzipCodec,
           org.apache.hadoop.io.compress.DefaultCodec,
           com.hadoop.compression.lzo.LzoCodec,
           com.hadoop.compression.lzo.LzopCodec,
           org.apache.hadoop.io.compress.BZip2Codec
        </value>
</property>

<property>
    <name>io.compression.codec.lzo.class</name>
    <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

2)配置$HADOOP_HOME/etc/hadoop/mapred-site.xml

<!-- 配置 Map段输出的压缩,snappy-->
<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>
  <!--<value>com.hadoop.compression.lzo.LzoCodec</value>-->
</property>
<!-- 配置 MapReduce段输出的压缩,Lzo-->
<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>-->
  <value>com.hadoop.compression.lzo.LzopCodec</value>
</property>

3)配置$HADOOP_HOME/etc/hadoop/hdfs-site.xml

由于HDFS的默认文件大小块是128M,而我的机器中配置的有事256M,所以想要测试lzo压缩文件是否可以被MapReduce split,要么只要制造一个600M左右的文件

所以这里采用修改压缩块的大小达到我们的需求,修改内容如下,这里第一次随便修改了几个数,上传数据的时候提示hadoop的最小检查块为512Byte,并且最小设置为1M,需要设置为1048576:

<!-- 块大小256M (默认128M) -->
<property>
        <name>dfs.blocksize</name>
        <!--<value>268435456</value>-->
        <value>1048576</value>
</property>

重新启动HDFS

4、压缩lzo文件

[hadoop@hadoop000 data]$ lzop -v page_views.dat

[hadoop@hadoop000 data]$ ll -h
total 27M
drwxrwxr-x. 2 hadoop hadoop 4.0K Dec  8 13:19 emp_page_views2
-rw-rw-r--. 1 hadoop hadoop  13K Dec  6 21:02 load
-rw-r--r--. 1 hadoop hadoop  19M Dec  2 09:29 page_views.dat
-rw-r--r--. 1 hadoop hadoop 8.7M Dec  2 09:29 page_views.dat.lzo

上传page_views.dat.lzo到hdfs

[hadoop@hadoop000 data]$ hdfs dfs -put page_views.dat.lzo /data/page_views
[hadoop@hadoop000 data]$ hdfs dfs -ls /data/page_views
Found 2 items
-rw-r--r--   3 hadoop hadoop    9029650 2018-12-08 15:05 /data/page_views/page_views.dat.lzo

5、生成lzo压缩文件的index

1) 批量lzo文件修改

指定目录进行批量压缩

[hadoop@hadoop000 data]$ $HADOOP_HOME/bin/hadoop jar \
$HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/user/hive/warehouse/lzo

2) 单个lzo文件修改

[hadoop@hadoop000 data]$ $HADOOP_HOME/bin/hadoop jar 
$HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar \
com.hadoop.compression.lzo.LzoIndexer \
/data/page_views/page_views.dat.lzo
[hadoop@hadoop000 data]$ hdfs dfs -ls /data/page_views
Found 2 items
-rw-r--r--   3 hadoop hadoop    9029650 2018-12-08 15:05 /data/page_views/page_views.dat.lzo
-rw-r--r--   3 hadoop hadoop        584 2018-12-08 15:06 /data/page_views/page_views.dat.lzo.index

6、使用hadoop自带的例子进行wordcount,查看split个数

运行一下命令查看 number of splits:9

[hadoop@hadoop000 data]$ hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /data/page_views/page_views.dat.lzo /data/wc/emp_page_views2/
18/12/09 16:03:17 INFO input.FileInputFormat: Total input paths to process : 1
18/12/09 16:03:17 INFO mapreduce.JobSubmitter: number of splits:9
18/12/09 16:03:18 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1544286515483_0005
18/12/09 16:03:18 INFO impl.YarnClientImpl: Submitted application application_1544286515483_0005

lzo + index split成功

7、查看最终wordcount的结果

[hadoop@hadoop000 data]$ hdfs dfs -du -h /data/wc/emp_page_views2
0      0      /data/wc/emp_page_views2/_SUCCESS
2.9 M  8.6 M  /data/wc/emp_page_views2/part-r-00000.lzo
[hadoop@hadoop000 data]$ hdfs dfs -text /data/wc/emp_page_views2/part-r-00000.lzo|head -5
18/12/09 16:10:54 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library from the embedded binaries
18/12/09 16:10:54 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 52decc77982b58949890770d22720a91adce0c3f]
18/12/09 16:10:54 INFO Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
18/12/09 16:10:54 INFO compress.CodecPool: Got brand-new decompressor [.lzo]
&url=http://m.taobao.com/productList_20_29658_1 1
&url=http://m.taobao.com/productList_20_5081_4  1
&url=http://m.taobao.com/searchProduct_1_橄榄油_1       1

codeobj , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:使用Hadoop自带的wc的mr程序测试LZO的特性,测试index与否的map task个数
喜欢 (0)
[a37free@163.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址