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中使用压缩的更多相关文章

  1. Hadoop框架下MapReduce中的map个数如何控制

    控制map个数的核心源码 long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job)); //getFormatMinS ...

  2. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  3. Hadoop MapReduce中压缩技术的使用

    Compression and Input Splits   当我们使用压缩数据作为MapReduce的输入时,需要确认数据的压缩格式是否支持切片?   假设HDFS中有一个未经压缩的大小为1GB的文 ...

  4. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

  5. 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)

    转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...

  6. hadoop学习第四天-Writable和WritableComparable序列化接口的使用&&MapReduce中传递javaBean的简单例子

    一. 为什么javaBean要继承Writable和WritableComparable接口? 1. 如果一个javaBean想要作为MapReduce的key或者value,就一定要实现序列化,因为 ...

  7. Hadoop学习之路(二十三)MapReduce中的shuffle详解

    概述 1.MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle 2.Shuffle: 数 ...

  8. 在Spark程序中使用压缩

    当大片连续区域进行数据存储并且存储区域中数据重复性高的状况下,数据适合进行压缩.数组或者对象序列化后的数据块可以考虑压缩.所以序列化后的数据可以压缩,使数据紧缩,减少空间开销. 1. Spark对压缩 ...

  9. Hadoop学习笔记—11.MapReduce中的排序和分组

    一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...

随机推荐

  1. lamp环境应用实践

    LAMP之apache2.4.33 apache工作模式 apache 常用工作模式有2种,区别在于 worker模式 1. 线程模式 2. 占用资源少 3. 稳定性略差 4. 并发大 prefork ...

  2. Linux下编写 makefile 详细教程

    原文地址: https://www.cnblogs.com/mfryf/p/3305778.html 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到make ...

  3. python学习笔记(八):异常处理

    一.异常处理 在程序运行过程中,总会遇到各种各样的错误.程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理. 下面我们先写一个函数,实现 ...

  4. Git学习之常用的命令

    配置git git config --global user.name "你的github用户名" git config --global user.email "你的G ...

  5. Tkinter Spinbox

    Python - Tkinter Spinbox: Spinbox小部件是一个标准的Tkinter的Entry小窗口部件的变体,它可以用来选择从一个固定的值.   Spinbox小部件是一个标准的Tk ...

  6. WebStorm开发TypeScript的设置

    Webstorm IDE可以开发TypeScript,同时支持自动编译成js文件,下面我们来进行一些简单的配置. 1.去node.js官网下载安装node.js 2.下载安装新版本的Webstorm ...

  7. 数据分析之Numpy-数组计算

    引言 : 数据分析 : 就是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出研究对象的内在规律 . 数据分析三剑客 : Numpy   数组计算    Pandas   表计算与数据分析   ...

  8. 在 SQL Server 的存储过程中调用 Web 服务

    介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. ...

  9. 转--activemq的官方中文文档

    1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范. 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQCon ...

  10. 微信小程序中this关键字使用技巧

    转自:https://blog.csdn.net/qq_33956478/article/details/81348453 微信小程序中,在wx.request({});方法调用成功或者失败之后,有时 ...