首先,我们来了解一下MapReduce中的必知概念
客户端(Client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
1.JobTracker: JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个 TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。
作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
JobTracker只有一个,他负责了任务的信息采集整理,你就把它当做包工头把,这个和采用Master/Slave结构中的Master保持一致
JobTracker 对应于 NameNode
一般情况应该把JobTracker部署在单独的机器上
2.TaskTracker:TaskTracker是JobTracker和Task之间的桥梁。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等
将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker,节点健康情况、资源使用情况,任务执行进度、任务运行状态等,比如说map task我做完啦,你什么时候让reduce task过来拉数据啊
TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。
TaskTracker都需要运行在HDFS的DataNode上
3.HDFS:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面
NameNode: 管理文件目录结构,接受用户的操作请求,管理数据节点(DataNode)
DataNode:是HDFS中真正存储数据的
Block:是hdfs读写数据的基本单位,默认64MB大小,就是说如果你有130MB数据,那就要分成三个block,两个存放64MB,最后一个存放2MB数据,虽然最后一个block块是64MB,但实际上占用空间为2MB
4.Sencondary NameNode:它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间,在文件系统中设置一个检查点来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份。
1.input:也就是数据存储位置,这里当然是类似于hdfs这样的分布式存储啦,
2.split:因为map task只读split,而split基本上和hdfs的基本存储块block同样大小,一个split对应一个map,你可以把它当做map的单位块来理解,投喂进map的时候必须要这样的格式,打个比方,比如只收硬币的地铁站,你只能投放1元硬币的,你投什么五毛,一角的,都是犯法的!对,警察叔叔就是他!
3.map:这里做的是wordcount,而map程序是由程序原来编写的,如果非要用代码来写,我用python写你别打我
splitdata = 'Deer Bear River'
aftermap = map(lambda x:(x,1),splitdata.split(" "))
print aftermap
三个map对应三组Split,我这里只取了其中一组,就是这么个意思,组成key/value键值对
4.shuffle:这是一个比较核心的过程,shuffle有洗牌的意思,这里的意思你把她理解成在拉斯维加斯赌场发牌的小姐姐,但是这个小姐姐并不是随机发牌,而是把红桃发给A先生,黑桃都发给B先生,诸如此类。如果非要说有什么套路,那么其中有一个HashPartitioner就帮我们做了hash,你把它想成低配版的聚类,狭义版聚类,因为这里的类特喵的必须是同一个key 啊!
5.reduce:既然都说了似wordcount了,那我,额,额,做戏做全套,我还是用python来写这个过程
shuffledata = [('Deer', 1),('Deer', 1),('River', 1)]
afterreduce_dict = {}
for i in shuffledata:
if i[0] not in afterreduce_dict:
afterreduce_dict[i[0]] = 0
afterreduce_dict[i[0]] +=1
print afterreduce_dict