mapreduce编程准备

学习mapreduce编程之前需要做一些概念性的了解,这是做的一些课程学习笔记,以便以后时不时的翻出来学习下,之前看过一篇文章大神们都是时不时的翻出基础知识复习下,我也做点笔记吧。

1.mapreduce定义

  • 源于Google的MapReduce论文(如果想更深入的学习,可以搜一下)

  √  发表于2004年12月

√  Hadoop Mapreduce是Google MapReduce克隆版。

  • MapReduce特点

√  易于编程

√  良好的扩展性

√  高容错性

√  适合PB级以上海量数据的离线处理

2.应用场景和不擅长之处

  • 常见mapreduce应用场景

简单的数据统计,比如网站的pv,uv统计
搜索引擎建索引
海量数据查找
复杂数据分析算法实现

聚类算法
分类算法
推荐算法
图算法

  • 不擅长的地方

    实时计算:
            像mysql一样,在毫秒级或者秒级返回结果。
    流式计算:
        MapReduce的输入数据集是静态的,不能动态变化。
        mapreduce自身的设计特点决定了数据源必须是静态的。
    DAG计算:
        多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。

3.mapreduce编程模型基本过程

实例还是用最常见的入门级WordCount:

整体过程:

  1. 先将数据切分成一个个小的分片,每个分片叫一个splitting 交个map去执行。
  2. 进行简单的拆分 统计相关词的个数 比如(Deer 1  Bear 1)。
  3. shuffling并sort 就是进行排序后将相同的k发送到同一个节点上,统计分析。
  4. reduce 就是进行最后的累加输出结果。

MapReduce编程模型:

  • input:一系列的key/value。

    这个是mapreduce框架解析的,是通过inputformat模块进行处理转换发送给map函数的,inputformat可以自己开发。

  • 用户提供两个函数实现:

    map(k,v) -> k1,v1
      就是将输入的k 和v进行计算输出为新的k1和v1 比如常见的wordcount实例,就是将输入的(k行号)和值(v单词) 统计分析后输出为k1(单词) ,v1(出现的次数)
    reduce(k1,list[v1])->k2,v2
      这个地方需要详细理解一下,因为在输入到reduce之前 mapreduce框架已经帮我们做了一些工作,就是上面提到的shuffling和sort已经将相同的值做了汇总 所以输入的k1和v1变成了k1(单词) v1(一组单词的数量[1,2,3,4]) 经过reduce计算后输出为k2(单词)和v2(单词总数)。

  • (k1,v1)是中间key/value结果对。
  • output:一系列(k2,v2)对。

示例图:

4.mapreduce编程模型

Mapreuce将作业的整个运行过程分为两个阶段:map阶段和reduce阶段

  • Map阶段由一定数量的map task组成

    √ 输入数据格式解析:inputFormat  :去负责取分片并解析成map的输入格式k,v
    √ 输入数据处理:Mapper :根据业务逻辑处理k和v
    √ 数据分组:Partitioner  :就是把相同的k分配给相同的reduce 一般用hash算法处理路由策略 (这个地方可以自己定义)需要学习。

  • Reduce阶段由一定数量的reduceTask组成

    √ 数据远程拷贝:  就是将map处理后的结果远程拷贝到相关的处理集群上。  ----需要理解下
    √ 数据按照key排序 :就是shuffling和sort阶段。
    √ 数据处理:reducer :根据业务逻辑处理k和v。
    √ 数据输出格式:outputFormat :结果输出可以输出到hbase 或者hdfs (这个也可以自定义)。

内部逻辑:

MapReduce编程模型-InputFormat

  • 文件分片(inputSplit)方法

    √ 处理跨行问题。

  • 将分片数据解析成key/value对

    √ 默认实现是TextInputFormat。

  • TextInputFormat

    √ key是行在文件中的偏移量,value是行内容。

    √ 若行被截断,则读取下一个block的前几个字符。

MapReduce编程模型-Split与block

  • Block

    √ HDFS中最小的数据存储单元。

    √ 默认是128MB。

  • spilt

    √ MapReduce中最小的计算单元。

    √ 默认与block一一对应

  • block与split

    √ split与block的对应关系是任意的,可以自己控制---需要注意的是不要看到默认一一对应就觉得是都是这样,有可能一个split对应好结果block。

MapReduce编程模型-combiner

  • combiner可以看成是一个local reducer

    √ 合并相同key对应的value值。
    √ 通常与reduce逻辑一样。

  • 好处:

    √ 可以减少map task输出的数据量(减小磁盘io)。
    √ 可以reduce-map网络传输的数据量(减小网络io)。

  • 如何正确使用:

    √ 结果叠加的可以使用。
    √ sum可以使用 但是求平局值的时候不能使用。

MapReduce编程模型-patitioner

  • patitioner决定了MapTask 输出的每条数据交给哪个Reduce Task处理  ----这个需要查询一下 不是自己远程拷贝么,怎么能制定了
  • 默认实现时hash(key) mod R

    √ R是reduce Task数目。

    √ 允许用户自定义。

  • 很多情况下需要自定义Partitioner

    √ 比如:hash(hostname(URL)) mod R 确保相同域名的网页交给同一个Reduce Task处理。

mapreduce编程--(准备篇)的更多相关文章

  1. hadoop2.2编程:使用MapReduce编程实例(转)

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...

  2. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

  3. MapReduce编程模型及其在Hadoop上的实现

    转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示:  关于上 ...

  4. MapReduce编程实战之“调试”和"调优"

    本篇内容 在上一篇的"初识"环节,我们已经在本地和Hadoop集群中,成功的执行了几个MapReduce程序,对MapReduce编程,已经有了最初的理解. 在本篇文章中,我们对M ...

  5. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本3(九)

    不多说,直接上干货! 下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 下面是版本2. Hadoop MapReduce编程 API入门系列之挖掘气象数 ...

  6. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)

    下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...

  7. 批处理引擎MapReduce编程模型

    批处理引擎MapReduce编程模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce是一个经典的分布式批处理计算引擎,被广泛应用于搜索引擎索引构建,大规模数据处理 ...

  8. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  9. [Hadoop入门] - 1 Ubuntu系统 Hadoop介绍 MapReduce编程思想

    Ubuntu系统 (我用到版本号是140.4) ubuntu系统是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境.Ubuntu的目标在于为一般用户提供一 ...

随机推荐

  1. php中的 file_get_contents(‘php://input’)

    今天用CI框架整合微信发现了一个没见过的 file_get_contents('php://input'); 这个家伙是干嘛用的,然后自己直接写了验证的代码.好吧 废话不多说直接看下面的代码. < ...

  2. Jmeter接口测试系列之参数化方法

    至于参数化的用途,我这里就不多说了,本文主要介绍最全.最强大的参数化方法,对参数化有一个彻底的认识,这里提供了多种参数化方法 1.jmeter参数化之用户变量   在测试计划里面添加一个用户自定义的变 ...

  3. ubuntu text mode和图形界面切换

    Ctrl+Alt+F1(或者F2~F6总共可以同时开6个text mode界面并行工作) Ctrl+Alt+F7切换到图形界面

  4. Python相对完美的URL拼接函数

    首先说下什么叫URL拼接,我们有这么一个HTML片段:   <a href="../../a.html">click me</a> 做为一只辛苦的爬虫,我们 ...

  5. numpy 和 pandas 中常用的一些函数及其参数

    numpy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这其中. numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值.  ...

  6. 怎样開始学习ADF和Jdeveroper 11g

    先给一些资料能够帮助刚開始学习的人開始学习ADF和Jdeveloper11g 1.首先毫无疑问,你要懂java语言. 能够看看Thinking In Java, 或者原来sun的网上的一些文档Sun' ...

  7. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

  8. 使用sendmail来发邮件

    安装sendEmail sendEmail是一个免费.轻量级.命令行的SMTP邮件客户端. 如果你需要使用命令行方式发送邮件,那么sendEmail是非常完美的选择:使用简单.功能强大. wget - ...

  9. 原生js:js获得当前选中的内容的字体大小

    利用currentStyle()和ComputedStyle() function getstyle(obj, key) {    if (obj.currentStyle) {        ret ...

  10. Android 生成keystore,两种方式

    一.eclipse 中生成android keystore 建立任意一个android项目(例如:AntForAndroid) 右键AntForAndroid根目录弹出菜单->Android T ...