Hadoop MapReduce
MR语义
- map可以有多个,个数越多,深度越快,hdfs可以作为输入给map,map的输出给reduce的输入,reduce的输出给hdfs,map前面的split是切片,一个切片对应于一个map程序。
- mapreduce默认情况下,一个块会对应与一个map程序,例如一个hdfs文件有两个块,则map的并行度为2。
- 切片:相当于一种更小的窗口,这种窗口突破了块,将块中的每一条记录,来当做一个切片,来启用一个map,解耦了块个map1:1的关系。
- map的数量有切片决定,具体是由数据以及运行场景来决定的。
- reduce的数量是由人来决定。当reduce和具体服务器节点数量一致时,则相当于一个服务器启用一个进程来控制,而当reduce数量多于具体服务器节点时,则相当于一个服务器会开启对个进程来处理,所以具体reduce的数量要根据实际需求来进行决定。
- 这里的切片给map输入是以记录为单位,一条记录为单位调用一次map,map输出的是key,value映射对。
- 默认一行是一条记录
MR原语
- 输入(格式化 k,v)数据---->map映射成一个中间数据集(k,v)—>reduce
- “相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算
总结
- block > split
- 1:1
- N:1
- 1:N
- split > map
- 1:1
- map > reduce
- N:1
- N:N
- 1:1
- 1:N
- group(key) > partition
- 1:1
- N:1
- N:N
- 1:N >错误 违背了原语
- partition > outputfile
Shuffler
- Shuffler<洗牌>:框架内部实现机制
- 分布式计算节点数据流转:连接MapTask与ReduceTask
经过map之后数据为三个部分 (key,value,partition)这时,首先对partition进行排序,然后对key进行排序,从而一方面保证相同的key位于同一个partition中,另一方面所得到的map输出会使reduce读操作更加的快
Map和Reduce之间数据的拉取Merge叫做Shuffel
Map
- 读懂数据
- 映射为kv模型
- 并行分布式
- 计算向数据移动
Reduce
- 数据全量/分量加工
- Reduce中可以包含不同的key
- 相同的Key汇聚到一个Reduce中
- 相同的Key调用一次reduce方法
- 排序实现key的汇聚
K,V使用自动以数据类型
- 作为参数传递,节省开发成本,提高程序自由度
- Writable序列化:使能分布式程序数据交互
- Comparable比较器:实现具体排序(字典序,数值序等)
client:算切片,检查路径,上传资源到hdfs,触发JobTracker运行分布式作业
JobTracker:调度所有map和reduce任务,对集群资源的监控和管理,此时会从hdfs文件系统将切片文件下载,根据资源负载情况分析切片中的map应该去到哪一个节点 ,做一个规划,这是TaskTracker会与JobTracker做心跳,会将属于自己的任务取过来,这是JobTracker在从hdfs上把jar包下载到本地,并启动一个JVM进程
任何计算框架想使用节点计算,资源向yarn来申请,这样就可以规避多个计算框架对于集群节点资源的争抢问题
- ResourceManager是yarn的核心
- NodeManager和DataNode是1:1的关系
- NodeManager会和ResourceManager做心跳
- NodeManager负责统计自己所在计算机的资源,以及资源的消耗,来汇报给ResourceManager,这样ResourceManager就能知道整个集群的资源情况
知识点:
client去访问ResourceManager,这使ResourceManager会在一个不忙的节点上创建一个ApplicationMaster,相当于之前的JobTracker,ApplicationMaster会向ResourceManager申请,然后由ResourceManager分配Map和Reduce处理的节点,然后在相应的节点上出现三个container,container中放map任务,
zookeeper用于分布式情况下做协调用的