MapReduce重点
程序员必须指定:
map (k, v) → <k’, v’>*
reduce (k’, v’) → <k’, v’>*
-
- 所有具有相同key的value被聚集到一起
可选的操作:
partition (k’,划分数) → k’的划分
-
- 往往使用key的一个简单散列函数, e.g., hash(k’) mod n
- 为并行reduce操作划分key空间
combine (k’, v’) → <k’, v’>*
-
- Mini-reducers在map后的阶段运行
- 用作减少网络流量的优化器
执行框架处理一切
-
- 调度:为map和reduce分配工人
- “数据分布”:将过程移动到数据
- 同步:聚集, 排序, 打乱中间数据
- 错误处理:检测工人失败和重新启动
有限的数据和控制执行流
-
- 所有算法都必须用m, r, c, p表达
存在疑问的:
-
- map和reduce在哪里运行
- mapper或reducer何时结束
- 一个特定的mapper正在处理哪种输入
- 一个特定的reducer正在处理哪个特定中间键值
同步工具
- 聪明构建数据结构
- 将部分结果联系在一起
- 中间键的排序顺序
- 控制reducer处理键的顺序
- 分割器
- 控制哪些reducer处理哪些键
- 保持mapper和reducer的状态
- 捕获多个键和值的依赖关系
可伸缩的Hadoop算法: 模式
- 避免创建对象
- 本质上昂贵的操作
- 垃圾收集
- 避免缓冲
- 有限的堆大小
- 适用于小数据集,但不可扩展!
本地的聚合的重要性
- 理想的可扩展行:
- 数据加倍,运行时间加倍
- 资源加倍,运行时间减半
- 为什么我们不能做到这一点呢?
- 同步需要通信
- 通信影响性能
- 因此…避免通信!
- 通过当地的聚合减少中间数据
- 有效利用组合器
洗牌和排序