Hadoop之Map-Reduce

  应用场景

  高容错

  高扩展

  编程简单

  适合大数据离线批量计算处理(注意,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处理

 

物联网