横向扩展
将mapreduce和数据运行在分布式模式之上;
数据流
mapreduce作业(job)是客户端需要执行的一个工作单元,它包括输入数据,mapreduce程序,和配置信息;hadoop将作业分成若干个小任务(task)来执行;其中包括两类任务,map任务,reduce任务;
有两类节点控制着作业执行过程,:一个jobtracker及一系列tasktracker,jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业,taskracker在运行任务的同时讲运行进度报告发送给jobtracker,jobtracker由此记录每项作业的整体进度情况,如果其中一个任务失败,jobtracker可以在另一个tasktracker调度重新运行该任务;
hadoop中将输入数据切成等长的小数据块(input split)(block)每一个块都分配一个所定义的map task;当然分块大小关系到负载均衡,还有切片时间,合并时间,处理时间等;
所以为此,一般每个block为64M;
当每一个节点的任务都运行的是本地的数据块时(数据本地化优化),是最优性能,但也不排除会有跨节点,跨机架,但主要是还是本地数据为主;
还有map结束后的输出数据存在本地节点的本地磁盘上,不在HDFS,因为map的输出数据是中间结果,不是最终结果,用完即删,没有必要HDFS备份;
每个map task结束之后,排序,合并所有输出数据到reduce输入端,是先合并,然后到reduce端;会占用网络带宽;
reduce的任务数量并不是只能是一个,但所有数据合并给一个reduce是绝对的,reduce task数量并非输入数据大小决定,而是单独自定义指定的;
shuffle(混洗)整理单项数据,是map到reduce之间的数据流,调整混洗参数对作业的总执行时间的影响非常大;当然也有不需要reduce的数据,可以直接输出的;
当有多个reduce task时,每个后面合并形成的数据将会形成不同的part;