了解hive数据库中的Map器和缩减器

bxfogqkk  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(429)

我在班上学习大数据,现在我们在学习Hive。今天我们了解了Map绘制器和还原器,但老实说,这件事让我大吃一惊。有人能给我解释一下制图器和减速机在每一步都做些什么吗?或者至少给我点好的读物?提前谢谢

6g8kf2rb

6g8kf2rb1#


让我们试着从我从网上下载的上面的图来理解Map减少流量。
我们将讨论hadoop中的单词计数问题,hadoop中的单词计数也称为helloworld。
字数统计是一个程序,在这里我们可以从文件中找到每个字的出现。
让我们试着去理解
步骤1):
输入文件:我们需要一些数据来运行字数计算程序,要在集群上运行此程序,第一步应该是将此文件放到hadoop上,这可以通过多种方式完成最简单的方法是使用hadoop shell命令:可以使用put或copyfromlocal:
步骤2)
map reduce是以键值对的形式进行的,这意味着mapper将以键值对的形式获取输入,然后进行所需的处理,然后以键值对的形式生成中间结果,这些中间结果将被输入到reducer中,以便进行进一步的工作,最后reducer也将其输出写入键值对中。
但是我们知道mapper在主驱动程序之后执行,所以谁以键值对的形式向mapper提供输入,输入格式为您做这件事。
inputformat是一个类,它完成两个主要任务:
1) 输入分割(由该输入分割驱动的Map器示例数或由输入分割驱动的Map器数,默认情况下,如果按默认配置,则一个分割大小相当于一个块,但可以根据需要更改分割大小。
因此,如果您正在使用512MB数据,并且块大小为64MB,那么将使用大约8个输入拆分大小,将运行8个Map器示例或使用8个Map器)
2) 断开键值对中的数据(RecordReader是在后端执行此操作的类)
现在什么是Map器的键和值,这将由您使用的文件输入格式驱动,例如textinputformat,它是最常用的inputformat。它将longwritable(相当于long)作为键和文本(字符串)作为值发送给mapper
你的mapper类将在一个split上工作,在类中你有一个map函数,它一次只在一行上工作,因此我们可以从上面的图中看到,单行将转到map函数
例如它发送:“苹果橙芒果”Map功能
3) 制图器
在mapper中,我们得到行作为输入,所以现在我们需要编写逻辑。
我们根据分隔符将行分解为单词,所以现在我们在一行中有一个单词,因为我们知道map在键值对上起作用。我们可以把这项工作作为一个关键和价值1
为什么我们把单词作为关键而不是相反,因为下一个阶段是
洗牌和排序阶段:在这个阶段框架将使组基于相似的键,或者在洗牌阶段将所有不同的键放在一起,并根据键进行排序。
现在让我们再次修改:
最初我们有一个文件,它是根据输入拆分发送到不同的Map器的,然后在map函数的mapper类中我们得到一行作为输入,所以我们建立了关于一行的逻辑,所有的行对于一个示例都将以类似的方式工作,最后所有的示例都可以这样并行工作。
现在假设你有10个Map器在运行,现在在map reduce中你的reducer的数量总是小于mapper。
因此,如果我们使用10个Map器,那么最有可能使用2-3个还原器。
洗牌和排序阶段,我们已经看到所有类似的键将俱乐部在一起。
首先要根据哪个基础来决定哪个Map器的数据会去哪个还原器。在这种情况下,10个Map器的数据必须分成2个还原器,所以它将根据哪个决定。
有一个名为partitioner的组件,它将根据散列分区和对其使用模运算符来决定哪个Map器输出将转到哪个reducer。
所以,如果我们使用散列,那么这是100%确定,所有相同的键将去同一个减速机。
我们不必为任何事情操心,因为框架设计得非常有效,但是是的,因为它是用java编写的,所以我们可以根据需要灵活地使用不同的组件,比如自定义键、自定义分区器、自定义比较器等等。
4) reducer:现在reducer将在其输入中获得键和值列表,如下所示
苹果,<1,1,1,1)>
现在,在reducer中,我们写逻辑,我们想做什么,对于我们的例子,我们想做单词计数,所以我们必须简单地计算值。
这也是我们最初在map阶段取1作为值的原因,因为我们必须简单地计数。
输出:最终的输出将由reducer以键值对的形式再次写入hdfs。

相关问题