在之前的Hadoop是什么 <https://blog.csdn.net/qq_38314823/article/details/80641042>
中已经说过MapReduce采用了分而治之的思想,MapReduce主要分为两部分,一部分是Map——分,一部分是Reduce——合
MapReduce全过程的数据都是以键值对的形式存在的
首先,我们假设我们有一个文件,文件中存了以下内容
hive spark hive hbase 
 hadoop hive spark 
 sqoop flume scala
这里涉及到一个偏移量(一个字符或空格为1位) 
 第一行的偏移量为0,内容为“hive spark hive hbase” 
 第二行的偏移量为21,内容为“hadoop hive spark” 
 第三行的偏移量为39,内容为“sqoop flume scala”
 * Map 
 * 输入 
 MapReduce处理的数据是从HDFS中读出来的 
 以偏移量为key,内容value,则存在: 
 (0,“hive spark hive hbase”) 
 (21,“hadoop hive spark”) 
 (39,“sqoop flume scala”) 
 * 输出 
 将输入的value中的词以空格为分割逐个取出来做key,1做value存起来 
 (hive,1) 
 (spark,1) 
 (hive,1) 
 (hbase,1) 
 (hadoop,1) 
注意:有多少行,Map就要循环做几次 
 * shuffle(之后会详细说,这里简单解释) 
 * 输入 
 map的输出 
 * 输出 
 相同的key的value进行合并 
这里合并不是进行累加或别的运算,而是合并到一个集合中 
 (hive,[1,1,1]) 
 (spark,[1,1]) 
 (hbase,[1]) 
 (hadoop,[1]) 
 。。。。。。 
 * reduce 
 * 输入 
 shuffle的输出 
 * 输出 
 根据业务将value进行合并 
 例如当前的业务就会将value进行累加 
MapReduce处理数据五步走
整个MapReduce程序,所有数据以(key,value)形式流动
 * 第一步:input 
正常情况下不需要写代码 
 仅仅在MapReduce程序运行的时候指定一个路径即可 
 * 第二步:map(核心) 
map(key,value,output,context) 
 key:每行数据的偏移量——基本没用 
 value:每行数据的内容——真正需要处理的内容
 * 第三步:shuffle 
不需要写代码
 * 第四步:reduce(核心) 
reduce(key,value,output,context) 
 key:业务需求中的key 
 value:要聚合的值
 * 第五步:output 
正常情况下不需要写代码 
 仅仅在MapReduce程序运行的时候指定一个路径即可
 * 工作原理 
热门工具 换一换