我是菜鸟:MapReduce编程模型

来源:互联网 发布:淘宝半自动机器人 编辑:程序博客网 时间:2024/06/03 16:12

编程方法

  1. 迭代。 遍历输入数据,并将之解析为key/value;
  2. 映射。 将输入key/value映射为另外的key/value;
  3. 分组。根据key对中间数据进行分组;
  4. 规约。 以组为单位对数据进行规约;
  5. 迭代。 将最终的key/value对保存在输出文件中。

编程接口体系结构

可以分为2层:
1. 编程接口层 InputFormat, Mapper, Partitioner, Reducer和outputFormat.
2. 工具层: JobControl, ChainMapper/ChainReducer, Hadoop Streaming 和 Hadoop pipes.

一些细节

  1. 参数要求: 用户输入的key/value必须是可以序列化的,且key必须是可以排序的。
  2. Reporter 接口。 提供完成进度,设置状态消息和更新计数器。
  3. 编程接口层中的5个组件都属于 回调接口, 以实现回调机制。 当用户按照预定实现这几个接口后,运行时环境会自动调用。

java API 解析

作业配置与提交

Hadoop 配置文件

Hadoop中 Common, HDFS 和MapReduce 都配置文件均为xml, 分为系统默认配置文件(core-default.xml, hdfs-defalult.xml, mapred-default.xml)和管理员自定义配置文件(core-site.xml….)。
每个配置文件包括三个配置属性:name,value 和 description. 另外这些参数有2个特性:final 和变量扩展。
final参数 可以防止用户在程序中修改这些属性。
变量扩展:就是将参数中对部分的值通过引用其他已近定义好的,有点如使用JAVA_HOME定义PATH。其格式为:${hadoop.tmp.dir}/mapred/temp

InputFormat 接口的实现

InputFormat<—FileInputFormat
InputFormat<—–DBInputFormat
针对FileInputForma而言,基类FileInputFormat 提供getSplits实现,派生类提供getRecordReader的实现。
getSplits中的算法:文件切分算法和host选择算法。
文件切分算法:
splitSize = max{minSize, min{goalSize, blockSize}}
host 选择算法
按照rack包含的数据量对rack排序,然后在rack内部按照每个node包含的数据量对node进行排序,最后取前N个node的host作为InputSplit的host列表,这里的N为副本数量。
当使用基于fileInputFormat实现InputFormat时候,为了提高Map Task的数据本地性,应当使用InputSize大小与block大小相同。
getRecordReader, 将InputSplit 解析为一个个key/value对。
需要考虑以下内容:
1. 定位记录边界: 用来识别完整的记录。如添加换行付。
2. 解析key/value: TextInputFormat每一行的内容作为value,而将改行在整个文件中的偏移量作为key。

OutputFormat 接口的设计

描述输出数据的格式,将用户提供的key/value对写入特定的文件中。

0 0
原创粉丝点击