应用场景
高容错
高扩展
编程简单
适合大数据离线批量计算处理(注意,MB级别的数据直接用Java处理,PB级别以上的才有必要使用mapreduce)
有延迟(需要实时处理数据用Hbase或storm)
原理图
image
map任务处理
读取输入文件内容,解析成key,value对。对输入文件的每一行,解析成key,value对。每一个键值对调用一次map函数
写自己的逻辑,处理输入的key,value,转成新的key,value输出
对输出的key,value进行分区
对不同分区的数据,按照key进行排序,分组。相同key的value放到一个集合中
分组后对数据进行==归约== (可选)
reduce任务处理
对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
对多个map任务的输出进行合并,排序。写reduce函数自己的逻辑,对输入的key,value处理,转换成新的key,value输出。
把reduce的输出保存到文件中。
map&reduce键值对格式
map函数
输入键值对
输出键值对
reduce()函数
输入键值对
输出键值对
mapreduceg过程各个角色的作用
jobclient:提交作业
jobtracker:初始化作业,分配作业,tasktracker与其进行通信,协调监控整个作业
taskTracker:定期与jobtracker通信,执行map和reduce任务
HDFS:保存作业的数据,配置,jar包,结果
作业提交流程
提交作业准备
编写自己的mapreduce程序
配置作业,包括输入输出路径等等
提交作业
配置完成后,通过jobclient提交
具体功能
与jobTracker通信得到一个jar的存储路径和JobId
输入输出路径检查,将jobjar拷贝到HDFS中
写job.xml,真正提交作业
作业初始化
客户端提交作业后,jobTracker会将作业加入到队列中,然后进行调度,默认是FIFO的方式
具体功能
作业初始化主要是指JobInProgress中完成的
读取分片信息
创建task:包括map和reduce任务
创建taskInProgress执行task,包括map任务和reduce任务
任务分配
TashTracker和jobtracker之间的通信和任务分配是通过心跳机制实现的
tasktracker会主动定期的想jobtracker发送报告,询问是否有任务要做,如果有就申请到任务;如果没有任务,就一直申请
任务执行
当tasktracker拿到任务,会将信息拷贝到本地,包括代码,配置,分片信息等
tasktracker中的localizeJob()方法会被调用进行本地化,拷贝job.jar,jobconf,job.xml到本地
TaskTracker调用launchTaskForJob()方法加载启动任务
MapTaskRunner和ReduceTaskRunner分别启动Javachild进行来执行相应的任务
错误处理
JobTracker失败
hadoop2.0之前存在单点故障问题
TraskTracker失败
TraskTracker崩溃了会停止向JobTracker发送心跳信息
JobTracker会将TraskTracker从等待的任务池中移除,并将该任务转移到其他地方执行
JobTracker将TraskTracker加入到黑名单中s
Task失败
任务失败,会向TraskTracker抛出异常,任务挂起
牛逼啦:mapreduce词频统计的原理
HDFS中words文件内容:
hello a
hello b
hello c
map处理
reduce处理