- 数据类型与分析工具
结构化
非结构化
批处理
大规模并行仓库
分布式文件系统
hadoop/通用NoSQL
实时
内存DBs、分析RDBMS
特殊NoSQL、流处理
- 数据并行带来的问题
GFS已经解决了数据分块存储的问题,但仍存在:
共享的状态:吞吐量(多个进程同时改变)、同步(同步修改需要锁);
小粒度的通讯让管理变得复杂;
失败的机器;
- MapReduce
数据并行的分治策略
Map:将数据分割为shards或者splits,将他们分配给工作节点,工作节点计算子问题的解。
Reduce:收集,合并子问题的解
基本编程模型:
Map:处理输入的键值对、生成中间结果集
map(in_key,in_value)->list(out_key, intermediate value)
reduce:对于某个键,合并它所有的值,生成结果值集合
reduce(out_key, list(intermediate_value))->list(out_value)
例子:词频统计
Distribute:将输入数据分割成M块,每块分布式调用map( )
切分文本数据->shards/splits
每个shard/split->交给map函数
Shuffle:将中间结果分割成R块,对每块分布式调用reduce( )
中间结果根据out_key"洗牌"->交给reduce函数
Collect:
合并结果
源代码:
map (String input_key, String input_value): //input_key: document name //input_value: document contents localCount=CountLocally(input_value); for each count: emit (word, count); //Produce count of words;
reduce (String word, Iterator intermediate_value): //word: the word in the intermediate_value //intermediate_value: a list of counts int result=0; for each v in intermediate_values: result+=v; emit(word, result); |
M和R的数量由用户指定:
M>>#servers, R>#servers
很大的M值有助于负载均衡,以及快速恢复;
每个Reduce调用,对应一个单独的输出文件,所以R值不应该太大;
冗余执行:
整个任务的完成时间由最慢的节点决定的。
解决方案:在接近结束时,生成冗余任务,谁最先完成,谁获胜(幂等操作)。
- Hadoop Mapreduce
组成:
JobTracker(master)、Tasktracker(Worker)、Task、Client、HDFS(类似GFS)
执行过程:
用户拷贝输入文件、提交任务、得到输入文件信息、创建切分、上传作业信息、提交任务、
初始化任务、读取任务文件、创建Maps和Reduces、选取任务、分配任务(心跳)
- 小结
同样的细粒度的操作(map、reduce)重复作用于大数据
操作必须是确定性的
操作是幂等的
只有shuffle过程中才有通信
操作输出存储在硬盘上
优点:
分布式过程完全透明,不需要分布式编程;
自动的容错性;
自动的规模缩放;
自动的负载均衡。
缺点:
严格的数据流(map+reduce);
很多常见的操作也必须手写;