MapReduce

MapReduce 与分布式文件系统

MapReduce 就像分布在上千台机器上的 Unix 工具。

  • MapReduce 作业通常不会修改输入,除了输出外没有任何副作用。
  • MapReduce 作业在分布式文件系统上读写。(Unix 工具 stdin、stdout),如 HDFS(Hadoop Distributed File System)等(GlusterFS、QFS、Amazon S3、Azure Blob 和 OpenStack Swift)。

MapReduce 作业执行

MapReduce 是一个编程框架,可以使用它编写代码处理 HDFS 等分布式文件系统中的大型数据集。

要创建 MapReduce 作业需要实现两个回调函数: mapperreducer (另请参阅 MapReduce 查询):

  • Mapper: 每个输入记录都会调用一次,从输入记录提取任意数量的关键字和值(可以为空),不保留任何状态,可以独立处理。
  • Reducer: MapReduce 框架使用 Mapper 生成的键值对,收集同一个关键字的所有值,并使用迭代器调用 reducer 以使用该值的集合。 Reducer 可以生成输出记录。

MapReduce 分布式执行

参见 Hadoop 的 MapReduce 的分布式执行

MapReduce 工作流

将 MapReduce 作业链接到工作流是非常普遍的,作业的输出作为下一个作业的输入。通过目录名隐式的完成:

  • 第一个作业必须配置将其输出写入 HDFS 中指定目录;
  • 第二个作业必须配置读取相同的目录名作为输入。

目前已经开发了处理依赖管理的 MapReduce 工作流调度器

Reduce 端的 join 与分组

批处理的背景下讨论 join,主要解决数据集内存在关联的所有事件。 假设 join 两张表:用户和活动事件。

排序-合并 join

次级排序:reducer 会首先看到用户数据库的记录,然后按照时间戳顺序查看活动事件。

基于次级排序 reducer 可以很容易的执行 join:为每个用户 ID 调用一次 reducer 函数。

  • 第一个值是来自用户数据库的出生日期记录,并存储在局部变量。
  • 然后使用相同的用户 ID 遍历活动事件。
  • 进行聚类。

reducer 每次处理一个特定用户 ID 的所有记录。

将相关数据放在一起

分组

处理数据倾斜

数据抽样探测热键,使用算法进行补偿。缺点是需要进行数据复制。

Hive 需要在表格元数据中明确指定热键,并将与这些键相关记录与其余文件分开存放。

Map 端 join 操作

广播哈希 join

把小数据集加载到内存哈希表中,mapper 的时候直接读取哈希表进行数据补全。

“广播”:每个分区的 mapper 读取整个小数据集到内存哈希表。

分区哈希 join

将加载到内存哈希表的数据缩小独立作用于每个分区。

Hive 中称为 bucketed map join

map 端合并 join

按关键字升序增量读取两个输入文件,并且匹配具有相同关键字的记录。

具有 map 端 join 的 MapReduce 工作流

批处理工作流的输出

生成搜索索引

批处理输出键值

批处理输出的哲学

对比 Hadoop 与分布式数据库

参见 对比分布式数据库

相关文章

超越 MapReduce

中间状态实体化

  • 数据流引擎:Spark、Flink、Tez
  • 容错:Spark 使用 弹性分布式数据集 跟踪数据的祖先,Flink 对运算符状态建立检查点来从故障中恢复。

数据流对 MapReduce 的改进是:不需要自己将所有中间状态写入文件系统。

图与迭代处理

  • Pregel 处理模型

高级 API 和语言

Hive、Pig、Cascading 和 Crunch。Tez 可以将这些高级语言移植到新的数据流执行引擎。