zoukankan      html  css  js  c++  java
  • mapreduce编程--(准备篇)

    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处理。

  • 相关阅读:
    CentOS下编译安装hping3
    ping命令的几个简单使用
    安装CPqD/ofdissector遭遇的错误
    ldconfig报错 :libstdc++.so.6.0.18-gdb.py不是一个elf文件
    sudo source /etc/profile 提示找不到source命令
    linux下安装pkg-config时遇到"glib-2.0>=2.16"的错
    CentOS6.2编译安装codelite5.3
    Socket构造但不连接
    linux c——dup( )和dup2( )函数详解(转)
    Linux中重定向
  • 原文地址:https://www.cnblogs.com/chushiyaoyue/p/6519848.html
Copyright © 2011-2022 走看看