Hadoop压缩之MapReduce中使用压缩
1.压缩和输入分片
Hadoop中文件是以块的形式存储在各个DataNode节点中,假如有一个文件A要做为输入数据,给MapReduce处理,系统要做的,首先从NameNode中找到文件A存储在哪些DataNode中,然后,在这些DataNode中,找到相应的数据块,作为一个单独的数据分块,作为map任务的输入,这就是mapreduce处理的数据的粗略过程!但是,我们都知道,对于一些大型的数据,压缩是很有用的,不仅能够节省存储空间,而且还能够加快传输速率。把文件压缩后再存入数据节点中,这个很常见。那么压缩的数据作为MapReduce的输入数据处理,这个可以不?
假如现在有一个压缩文件B,存储在16个数据块中,但是,将每个数据块作为单独的输入分片是无法实现工作的,因为无法实现从gzip压缩数据流的任意位置读取数据,所以,让多个map任务多里运行是无法实现的。在这种情况下,MapReduce不会去切分gzip压缩文件,而是由一个map任务去处理所有的数据块。因为它知道输入的是gzip(文件扩展名)且不支持切分。那么这么做,带来的缺点很明显了:首先是牺牲了数据的本地性,一个map处理16个数据块,而其中大多数块并没有存储在执行map任务的节点。其次,map任务少了,作业的粒度就较大,运行的时间可能会更长!
对于大文件来说,不应该使用不支持切分整个文件的压缩格式,否则将失去数据的本地性,进而造成MapReduce应用效率低下!
2.数据本地性
Hadoop中有几样东西比较珍贵,不是存储硬盘,不是cpu,而是内存和带宽!为什么是内存和带宽呢?NameNode中存储的是目录元数据,不懂的可以查看我的博客《Hadoop中的namenode、辅助namenode、jobtracker、datenode等作用》,http://blog.sina.com.cn/s/blog_c09822a40102v9fp.html,而NameNode把这些存放在内存当中,所以,内存的大小也决定着DataNode中存放的数据多少,就算DataNode再多,NameNode的内存上不去,也存储不了多少数据。还有网络带宽,带宽很贵,数据本地化就能够节省网络带宽。因为我们把数据是在本地处理的。处理完后,然后,再把处理后的结果,通过网络传送个reduce所在的节点。而上面的经过gzip压缩的数据,是把数据块全部传送到map所在的节点,就丧失了数据本地化的优势,占用网络带宽。尤其是对于大点的数据!统一时间要占用多少带宽。
3.在MapReduce中使用压缩
如果想对MapReduce作业的输出进行压缩操作,应在作业配置过程中,将mapred.output.compress属性设置为true和mapred.output.compression.codec属性设置为打算使用的压缩codec的类名。
由于map任务的输出需要写到磁盘并通过网络传输到reducer节点,所以如果使用LZO这样的快速压缩方式,是可以获得性能提升的,因为需要传输的数据减少了。
属性名称 | 类型 | 默认值 | 描述 |
mapred.compress.map.out | boolean | false | 对map任务输出进行压缩 |
mapred.map.output.compression.codec | Class | org.apache.hadoop.io.compress.DefaultCodec | map输出所用的压缩codec |
Hadoop压缩之MapReduce中使用压缩的更多相关文章
- Hadoop框架下MapReduce中的map个数如何控制
控制map个数的核心源码 long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job)); //getFormatMinS ...
- hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较
在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...
- Hadoop MapReduce中压缩技术的使用
Compression and Input Splits 当我们使用压缩数据作为MapReduce的输入时,需要确认数据的压缩格式是否支持切片? 假设HDFS中有一个未经压缩的大小为1GB的文 ...
- Hadoop学习笔记—12.MapReduce中的常见算法
一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...
- hadoop学习第四天-Writable和WritableComparable序列化接口的使用&&MapReduce中传递javaBean的简单例子
一. 为什么javaBean要继承Writable和WritableComparable接口? 1. 如果一个javaBean想要作为MapReduce的key或者value,就一定要实现序列化,因为 ...
- Hadoop学习之路(二十三)MapReduce中的shuffle详解
概述 1.MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle 2.Shuffle: 数 ...
- 在Spark程序中使用压缩
当大片连续区域进行数据存储并且存储区域中数据重复性高的状况下,数据适合进行压缩.数组或者对象序列化后的数据块可以考虑压缩.所以序列化后的数据可以压缩,使数据紧缩,减少空间开销. 1. Spark对压缩 ...
- Hadoop学习笔记—11.MapReduce中的排序和分组
一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...
随机推荐
- 手机页面开发的meta
<meta name="viewport" content="width=device-width, initial-scale=1"> 手机环境. ...
- 侯捷stl学习笔记链接
http://www.cnblogs.com/ranjiewen/category/799058.html http://www.cnblogs.com/ranjiewen/p/8260275.htm ...
- Angular2快速入门-5.使用http(新闻数据来自http请求)
Angular2官网通过http请求模拟API 来请求hero 数据,感觉有点繁琐,很让人理解不了,我们不采用它的办法,直接展示怎么使用http请求来获取我们的数据 ,直截了当. 第一.准备工作,创建 ...
- 从windows拷贝到linux的脚本报错:未找到命令 or 语法错误
可能真的是命令拼错了或者参数有误,也可能是语法错误. 但是但是但是,如果之前脚本运行的好好的,没做任何改动或者仅仅改了一丁点儿. 那么脚本可能在格式上存在问题,解决方案: 安装dos2unix sud ...
- C 语言 - 逻辑运算和短路求值
逻辑运算符: 运算符 含义 优先级 ! 逻辑非 高 && 逻辑与 中 || 逻辑或 低 举例: !a:如果 a 为真,!a 为假:如果 a 为 假,!a 为真 a && ...
- Python图片转字符
前段时间学习pillow写的,可以通过改变font_map改变转换的深度和字符.思路是先转换黑白大小,读取黑白值取范围读font_map转变. from PIL import Image,ImageD ...
- Python操作中缓存Redis
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- postgresql 相关
http://www.yiibai.com/html/postgresql/2013/080998.html 1.安装PG的client以及函数库: yum install postgresql ...
- Squid 代理服务器日志管理
简介: Squid 服务器日志增长是很快的,如果不做处理的话,可以会由于系统限制单文件大小,而导致 Squid 服务停止,太大的日志文件也不适合分析. 一.日志配置 shell > grep ' ...
- dev GridControl显示标题
gridview:ShowViewCaption = TrueViewCation = "32435354354"