Hadoop之Map-Reduce

应用场景

  1. 高容错
  2. 高扩展
  3. 编程简单
  4. 适合大数据离线批量计算处理(注意,MB级别的数据直接用Java处理,PB级别以上的才有必要使用mapreduce)
  5. 有延迟(需要实时处理数据用Hbase或storm)

原理图

Hadoop之Map-Reduce_第1张图片
image

map任务处理

  1. 读取输入文件内容,解析成key,value对。对输入文件的每一行,解析成key,value对。每一个键值对调用一次map函数
  2. 写自己的逻辑,处理输入的key,value,转成新的key,value输出
  3. 对输出的key,value进行分区
  4. 对不同分区的数据,按照key进行排序,分组。相同key的value放到一个集合中
  5. 分组后对数据进行==归约== (可选)

reduce任务处理

  1. 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
  2. 对多个map任务的输出进行合并,排序。写reduce函数自己的逻辑,对输入的key,value处理,转换成新的key,value输出。
  3. 把reduce的输出保存到文件中。

map&reduce键值对格式

  1. map函数
  • 输入键值对
  • 输出键值对
  1. reduce()函数
  • 输入键值对
  • 输出键值对

mapreduceg过程各个角色的作用

  • jobclient:提交作业
  • jobtracker:初始化作业,分配作业,tasktracker与其进行通信,协调监控整个作业
  • taskTracker:定期与jobtracker通信,执行map和reduce任务
  • HDFS:保存作业的数据,配置,jar包,结果

作业提交流程

  1. 提交作业准备
  • 编写自己的mapreduce程序
  • 配置作业,包括输入输出路径等等
  1. 提交作业
  • 配置完成后,通过jobclient提交
  1. 具体功能
  • 与jobTracker通信得到一个jar的存储路径和JobId
  • 输入输出路径检查,将jobjar拷贝到HDFS中
  • 写job.xml,真正提交作业

作业初始化

  1. 客户端提交作业后,jobTracker会将作业加入到队列中,然后进行调度,默认是FIFO的方式
  2. 具体功能
  • 作业初始化主要是指JobInProgress中完成的
  • 读取分片信息
  • 创建task:包括map和reduce任务
  • 创建taskInProgress执行task,包括map任务和reduce任务

任务分配

  1. TashTracker和jobtracker之间的通信和任务分配是通过心跳机制实现的
  2. tasktracker会主动定期的想jobtracker发送报告,询问是否有任务要做,如果有就申请到任务;如果没有任务,就一直申请

任务执行

  1. 当tasktracker拿到任务,会将信息拷贝到本地,包括代码,配置,分片信息等
  2. tasktracker中的localizeJob()方法会被调用进行本地化,拷贝job.jar,jobconf,job.xml到本地
  3. TaskTracker调用launchTaskForJob()方法加载启动任务
  4. MapTaskRunner和ReduceTaskRunner分别启动Javachild进行来执行相应的任务

错误处理

  1. JobTracker失败
  • hadoop2.0之前存在单点故障问题
  1. TraskTracker失败
  • TraskTracker崩溃了会停止向JobTracker发送心跳信息
  • JobTracker会将TraskTracker从等待的任务池中移除,并将该任务转移到其他地方执行
  • JobTracker将TraskTracker加入到黑名单中s
  1. Task失败
  • 任务失败,会向TraskTracker抛出异常,任务挂起

牛逼啦:mapreduce词频统计的原理

HDFS中words文件内容:
hello a
hello b
hello c

  1. map处理


    Hadoop之Map-Reduce_第2张图片
  2. reduce处理


    Hadoop之Map-Reduce_第3张图片

一个敲代码,爱分享的人,我在这里!

Hadoop之Map-Reduce_第4张图片
来玩啊

你可能感兴趣的:(Hadoop之Map-Reduce)