hadoop mapreduce 工作原理(大数据之-Hadoop3.xMapReduce数据压缩)
hadoop mapreduce 工作原理(大数据之-Hadoop3.xMapReduce数据压缩)可以看到现在value中是空的没有配置可以看到找到这个配置文件 对应的这个配置选项首先我们看如果在输入端 采用压缩怎么配置 首先要在core-site.xml文件中 配置io.compression.codes
然后我们再来看看如何是hadoop MapReduce中使用压缩
为了支持多种压缩 解压算法那 hadoop引入了编码 解码器
首先我们看如果在输入端 采用压缩怎么配置 首先
要在core-site.xml文件中 配置io.compression.codes
可以看到找到这个配置文件 对应的这个配置选项
可以看到现在value中是空的没有配置
说明map的输入端默认不使用压缩
value既然是空的那么 如何配置呢?配置什么参数呢?
可以在我们搭建的hadoop集群中 使用hadoop checknative 这个命令
而已看到 显示 zlib astd snappy lz4 bzip2 这些压缩命令..这些都可以填入刚刚的
value中.
然后我们再看mapper输出端采用压缩 怎么实现
可以看到 这个配置需要在mapred-site.xml
配置mapreduce.map.output.compress
在配置文件中找到
这个配置可以看到默认是fasle 如果使用需要改成true
改成true了以后 表示开启了 mapper输出的 压缩
然后再去 配置使用什么压缩算法
就是这个
mapreduce.map.output.compress.codec
可以看到默认是
org.apache.hadoop.io.compress.DefaultCodec
默认采用的是这个压缩算法
然后我们再去看reducer输出的时候采用压缩的配置
可以看到要在mapred-site.xml文件中配置
找到这个配置
mapreduce.output.fileoutputformat.compress
可以看到默认是false对吧 要用 的话需要打开
然后我们再去看这个默认配置的是
org.apache.hadoop.io.compress.DefaultCodec 也是用的默认的解码器对吧.
可以看到上面是配置 那么如果我们想在代码中使用怎么用呢?
这里我们用以前的wordcount这个源码来进行演示
可以看到需要添加上上面这段代码就可以了
可以看到通过在Configuration conf = ....下面添加
conf.setBoolean("mapreduce.map.output.compress" true); 这里设置来开启map端输出时候的压缩
然后使用
conf.setClass("mapreduce.map.output.compress.codec" BZip2Codec.class CompressionCodec.class);
通过这个来设置map输出的压缩算法 这样就可以了.
然后我们去执行一下 这个时候map输出的时候 就会使用压缩算法把数据压缩以后再传输到reduce了.
然后我们去检查一下 输出目录 可以看到output888 有输出了
这个时候就是说 map处理完的数据会通过压缩算法bzip2 压缩然后再传输给reduce
reduce根据配置 会把压缩后的数据 从maptask拉取过来以后 自动解压缩处理
我们看看结果
打开以后可以看到 跟以前我们不使用压缩是一样的效果对吧
说明什么 说明map处理完了以后 把数据压缩 然后传给reduce 压缩算法我们指定了以后 也指定了
压缩的时机 也就是在map处理数据以后 采用压缩算法 压缩数据 以后传给reduce 这个时候
reduce拉取以后会自动解压 根据设置的压缩算法.
所以我们就看不出来 使用了压缩 但实际上已经用了.
然后我们再看 在reduce输出阶段使用压缩怎么弄
可以看到我们还是在driver驱动类中 在
设置FileOutputFormat.setOutputPath以后
然后设置
FileOutputFormat.setCompressOutput(job true);
开启 reduce输出时压缩
然后 设置reduce输出压缩的压缩方式
FileOutputFormat.setOutputCompressorClass(job BZip2Codec.class)
然后再执行可以看到这个时候 输出的时候
reduce输出的时候 就被利用我们设置的压缩算法压缩了
可以看到结果也没问题
然后我们再去试试 reduce输出的时候 我们设置
Gzip这种压缩算法
可以看到再执行 去看结果
结果变成.gz结尾的了吧 我们使用gzip压缩算法对吧.
可以看到也没问题对吧 但压缩算法用Gzip了
然后我们再修改成DefaultCodec.class再去执行
可以看到这个时候的后缀 变成了这种压缩的出来的了
deflate对吧
然后我们再去试试 我们在map输出的时候压缩 这时候 我们采用
conf.setClass("mapreduce.map.output.compress.codec" SnappyCodec.class CompressionCodec.class)
来进行压缩
然后我们执行可以看到报错了对吧 为什么?
因为snappy需要 结合 centos7.5以上 然后和hadoop 3.x 一块使用才可以 这个是版本问题..