我正在课堂上学习大数据,现在我们正在学习HIVE。我们今天了解了地图绘制器和减速器,但老实说它已经超越了我的脑海。有人可以向我解释映射器和减速器在每一步中的作用吗?或者至少指出一些好的读数?提前致谢
答案 0 :(得分:5)
让我们尝试从上面从互联网上下载的图表中了解map-reduce流程。
我们将讨论hadoop中的字数统计问题,在Hadoop中也称为hello world。
字数是一个程序,我们从文件中找到每个单词的出现。
让我们试着理解
第1步):
输入文件:我们需要一些我们将运行word count program的数据,在集群上运行这个程序,第一步应该是把这个文件放在hadoop上,这可以做到通过各种方式最简单的方法是使用hadoop shell命令: 喜欢put或copyFromLocal可以使用:
第2步)
映射减少关键值对的谈话,这意味着映射器将以键和值对的形式获得输入,它们将执行所需的处理然后它们将以键值对的形式产生中间结果,这将输入reducer以进一步处理它,最后reducer也会将它们的输出写入键值对。
但是我们知道映射器在主驱动程序之后执行,所以谁以键值对的形式向映射器提供输入,输入格式为你做这件事。
InputFormat是一个完成两件大事的类:
1)输入拆分(由此输入拆分驱动的映射器实例数或映射器数由输入拆分驱动,默认情况下,如果你去,你的一个拆分大小相当于一个块默认配置,但您可以根据需要更改分割大小。
所以,如果您正在玩,假设512 MB的数据,并且您的块大小为64 MB,那么将使用大约8个输入分割大小,将运行8个映射器实例或将使用8个映射器)
2)打破键值对中的数据(记录阅读器是在后端执行此操作的类)
现在,映射器的关键和价值将由您使用的文件输入格式驱动,例如TextInputFormat,它是最常用的输入格式。它将longWritable(相当于long)作为键发送,将Text(字符串)作为值发送给mapper
你的mapper类可以在1个分割上工作,在类中你有一个map函数,它一次只能在一行上工作,所以我们可以从上面的图中看到单行将是map函数
例如它发送:" Apple orange Mango"映射功能3)Mapper
在mapper中我们得到一行作为输入,所以现在我们需要编写逻辑。
我们将这条线分成基于分隔的单词,所以现在我们在一行中有单个单词 我们知道地图适用于键值对。 我们可以将这项工作作为关键和价值作为1
为什么我们把关键词当作关键而不是反过来,因为下一阶段是
混洗和排序阶段:在此阶段,框架将使组基于相似的键,或者所有不同的键将在混洗阶段聚集在一起,它们将根据键进行排序。
现在让我们再次修改:
最初我们有一个文件根据输入拆分发送到不同的不同映射器,然后在map函数的mapper类中我们得到一行作为输入,所以构建我们的逻辑相对于一行,所有行都可以工作对于一个实例以类似的方式,最后所有实例都能够以这样的方式并行工作。
现在假设你有10个映射器在运行,现在在map中减少你的reducer数量总是小于mapper。
因此,如果我们使用了10个映射器,那么最有可能使用2-3个降低器。
洗牌和分拣阶段,我们已经看到所有类似的钥匙都会聚在一起。
首先,在哪个基础上决定哪个映射器数据将转到哪个reducer。 在情况下,10个映射器数据必须分成2个减速器,因此它将根据它来决定。
有一个名为 Partitioner 的组件,它将决定哪个mapper输出将基于散列分区转到哪个reducer,并使用模运算符。
所以如果我们使用散列,那么这是100%确保所有相同的密钥都会转到同一个reducer。
我们不必为任何事情而烦恼,因为框架已被设计为有效地进行,但是因为它是用java编写的,所以我们可以根据需要灵活地使用不同的组件来定制键,自定义分区器,自定义比较器等。
4) Reducer :现在reducer将在其输入中获取键及其值列表
苹果,< 1,1,1,1)>
现在在reducer中我们编写逻辑我们想要做什么,对于我们的情况,我们想要进行字数统计,所以我们只需要计算值。
这也是我们最初在Map阶段将1作为值的原因,因为我们只需要计算。
输出:最终输出将由reducer再次写入hdfs。再次在键值对中。