【1】Hadoop Map/Reduce框架为每一个
InputSplit
产生一个map任务,而每个
InputSplit
是由该作业的
InputFormat
产生的。
【2】
Mapper
的输出被排序后,就被划分给每个
Reducer
。分块的总数目和一个作业的reduce任务的数目是一样的。用户可以通过实现自定义的
Partitioner
来控制哪个key被分配给哪个
Reducer
。
【3】写MR时主要有8个步骤:
1、map任务处理
(1.1)读取输入文件的内容,解析成key, value对。对输入文件的每一行,解析成key\value对。每个键值对调用一次map函数。
(1.2)写自己的逻辑,对输入的key\value处理,转换成新的key\value输出。
(1.3)对输出的key\value进行分区。
(1.4)对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
(1.5)(可选)分组后的数据进行归约。
2、reduce任务处理
(2.1)对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
(2.2)对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key\values处理,转换成新的key\value输出。
(2.3)把reduce的输出保存到文件中。
【4】技巧:先确认<k1,v1>和<k3,v3>,这个根据业务要求,一般都比较好确定。k2一般和k3相似。还有一种确定k2的方式是:考虑mapper中有一个特别重要的功能是分组。考虑业务中哪些需要分组,可以确定k2。确定<k1, v1>和<k2, v2>就可以确定map(),<k2,v2s>和<k3, v3>就确定了reduce()。
【5】涉及到比较的问题,先找到它们关联的因素。将关联因素作为k2,在一个map函数中context.write可以调用多次。如果v2的类型有多个,可以在v2字段设置标记,用来区分。得灵活运用。