zoukankan      html  css  js  c++  java
  • mapreduce,数据结构和类型介绍

    mapreduce,数据结构和类型介绍

    特别数据类型介绍
    Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。
    BooleanWritable:标准布尔型数值
    ByteWritable:单字节数值
    DoubleWritable:双字节数
    FloatWritable:浮点数
    IntWritable:整型数
    LongWritable:长整型数
    Text:使用UTF8格式存储的文本
    NullWritable:当<key,value>中的key或value为空时使用
    InputFormat和InputSplit:InputSplit是Hadoop定义的用来 传送 给每个 单独 的 map 的 数据 ,InputSplit 存储的并 非 数据本身而是一个分片长度 和一个 记录数据位置 的 数组 。 生成InputSplit的方法可以通过 InputFormat()来设置 。
    OutputFormat:每一种 输 入 格式 都有一种 输 出 格式 与其对应。默认的输出格式是 TextOutputFormat ,这种输出方式与输入类似,会将每条记录以一行的形式存入文本文件。不过,它的 键和值 可以是 任意形式 的,因为程序 内容 会调用 toString() 方法将键和值转换为 String 类型再输出。
    特别类介绍
    Mapper
    1、mapper可以选择性地继承 MapreduceBase这个基类, 他只是把一些方法实现了而已, 即使方法体是空的.
    2、 mapper必须实现 Mapper 接口(0.20以前的版本), 这是一个泛型接口, 需要执行输入和输出的key-value的类型, 这些类型通常都是Wriable接口的实现类

    3、实现map方法, 方法有四个参数, 前面两个就是输入的 Key 和 value, 第三个参数是 OuputCollector, 用于收集输出的, 第四个是reporter,用来报告一些状态的,可以用于debug
    3.1 input 默认是一行一条记录, 每天记录都放在value里边
    3.2 output 每次搜集一条 K-V记录, 一个K可以对应多个value, 在reduce 里面体现为一个 iterator
    4、覆盖 configure方法可以得到JobConf的实例, 这个JobConf是在Job运行时传递过来的, 可以跟外部资源进行数据交互
    Reducer
    1、reduce也可以选择继承 MapreduceBase这个基类, 功能跟mapper一样.
    2.、reducer必须实现Reducer接口, 这个接口同样是泛型接口, 意义跟Mapper的类似
    3、实现reduce方法, 这个方法也有四个参数, 第一个是输入的key, 第二个是输入的 value的迭代器, 可以遍历所有的value,相当于一个列表,
    outputCollector跟map的一样, 是输出的搜集器, 每次搜集都是key-value的形式, report的作用跟map的相同.
    4、在新版本中, hadoop已经将后面两个参数合并到一个context对象里边了, 当然还会兼容就版本的 接口. >0.19.x
    5、覆盖configure方法, 作用跟map的相同
    6、覆盖close 方法,可以做一些reduce结束后的处理工作.(clean up)
    Combiner
    1、combiner的作用是, 将map的输出,先计算一遍,得到初步的合并结果, 减少reduce的计算压力.
    2、combiner的编写方法跟reduce是一样的, 他本来就是一个Reducer的实现类
    3、当reducer符合函数 F(a,b) = F(F(a), F(b)) 时, combinner可以与reduce相同. 比如 sum(a,b,c,d,e,f,g) = sum(sum(a,b) ,sum(c,d,e,f) , sum(g)) 还有max, min等等.
    4、 编写正确的combiner可以优化整个mapreduce程序的性能.(特别是当reduce是性能瓶颈的时候.)
    5、combiner可以跟reducer不同.
    Configuration
    1、 后加的属性的值会覆盖前面定义的相同名称的属性的值.
    2、被定义为 final的属性(在属性定义中加上true标签)不会被后面的同名属性定义的值给覆盖.
    3、系统属性比通过资源定义的属性优先级高, 也就是通过System.setProperty()方法会覆盖在资源文件中定义的属性的值.
    4、系统属性定义必须在资源文件中有相应的定义才会生效.
    5、通过 -D 选项定义的属性, 比在资源文件中定义的属性优先级要高.
    Run Jobs
    1、设置 inputs & output
    1.1 先判断输入是否存在 (不存在会导致出错,最好利用程序来判断.)
    1.2 判断输出是否已经存在(存在也会导致出错)
    1.3 养成一种好的习惯(先判断,再执行)
    2、设置 mapper、reducer、combiner. 各个实现类的class对象. XXXX.class
    3、设置 inputformat & outputformat & types
    3.1 input和output format都有两种, 一种是 textfile, 一种是sequencefile. 简单理解, textfile是文本组织的形式,sequence file是 二进制组织的形式.
    3.2 Types的设置, 根据输入和输出的数据类型, 设置各种Writable接口的实现类的class对象.
    4、设置reduce count
    4.1 reduce count可以为0, 当你的数据无需reduce的时候.
    4.2 reduce数量最好稍微少于当前可用的slots的数量, 这样reduce就能在一波计算中算好. (一个slot可以理解为一个计算单元(资源).)

  • 相关阅读:
    【华磊随笔】一个企业的内部讨论(含高层)“30岁IT人,产出代码还是产出思想”之我见。
    dotNetGrid 演示站点(new)争取做ASP.NET中最好的Ajax开源表格控件
    【华磊随笔】进一步的分析:开发者版本;你属于哪个版本的程序员?
    新增格式化单元格数据功能dotNetFlexGrid1.24,快速的设置您的表格数据的不同样式;现在开始扔掉你的Asp.net GridView吧。(更新FieldFormatorHandle参数)
    【华磊随笔】技术到底值不值钱,到底值多少钱有感于公司新产品的上线
    【华磊原创】某企业前两年的开发人员技术能力评估表(不分语言)相对比较全面也比较细
    【华磊原创】安装程序自动检测安装.Net Framework运行环境(使用InnoSetup)
    mainline.js主线
    JS中的“!!”
    读“周大师代码评审”有感
  • 原文地址:https://www.cnblogs.com/miaozhijuan/p/12630885.html
Copyright © 2011-2022 走看看