传统并行框架,底层使用统一共享存储(SAN),扩展比较难,故障容易引起整个集群不工作。刀片服务器,贵,只能横向增加服务器数量,不能扩大。编程考虑互斥信号量等类似多线程编程。适用与实时计算等计算密集型。
MapReduce, 非共享式架构,节点有自己的内存。可以自由增加计算节点。自动进行资源分配部署。适合数据密集型的应用。
MapReduce
理念:计算向数据靠拢,而不是数据向计算靠拢
数据向计算:选择一个计算节点,把所需数据从节点上取过来
计算向数据:把计算发到数据所在的节点
map 函数
map输入一个键值对<k,v>, 一个v拆分成多个v1,v2 ,因为是同一个V的拆分同属一组,产生一组键值对(v1,a1)(v2, a1)成为中间结果
reduce 函数
reduce 将同组(a1,a2)映射为一个值 a, 输出 (v1,a), (v2, a)
client 提交作业
jobtracker 跟踪作业调度作业
tasktracker 执行作业,接受jobtracker命令,回复心跳
tasktacker 把所在节点的资源称为slot, slot分为map, reduce类型,这两类slot是固定的
tasktacker 有两种任务map\reduce. 在一台机器上面是可以运行两种任务的
hadoop文件存储
inputFormat: 把整个文件,切分成多个split, 只是逻辑上的切分,分片的起点在哪里,长度是多少,不是物理的切分
split 分片
RR 读出文件,给出key value
中间Shuffle:负责分区、归并、排序
outputFormat 检查输出格式
一个文件在hdfs中分了6个物理块进行存储。
该文件 split 逻辑分片4个片,分片是用户自定义
产生一个分片,就产生一个map任务。有多少个分片,就有多少个map任务
一般一个hdfs块的大小作为一个片
最优的reduce的任务个数 略小于 整个集群中可用的slot reduce的数目
shuffle 有两个部分:map端和reduce端
map端: 将map结果不是先写在磁盘文件中,先写入缓存。缓存满了以后写入磁盘文件,为了处理满了之后会丢失后续的结果,这里有溢写操作:写到一定比例(80%)就开始写磁盘。
溢写中存在操作:分区、排序、合并
分区:根据reduce数量进行分区
排序:在每个分区中进行排序,自动进行字典序
合并(不是Merge 是combine): 比如(a,1),(a,1)->(a,2) 可选
磁盘上有多个文件,在map结束之前,系统进行归并成一个文件(文件内分区并排序)
jobtracker检测到归并成一个文件完成map任务后,同时reduce任务开始
reduce 节点会从多个map任务中,把属于自己reduce任务分区的数据拉取到本地
reduce端:
在多个map获得的数据读入缓存,进行归并数据, 归并后写入磁盘文件,再把文件归并成一个文件
归并:把值变成value-list (k,v1) (k,v2) (k, v3) -> (k,<v1,v2,v3>)