了解 HIVE 数据库中的映射器和缩减器

Posted

技术标签:

【中文标题】了解 HIVE 数据库中的映射器和缩减器【英文标题】:Understanding the mapper and reducer in a HIVE database 【发布时间】:2015-04-30 05:41:57 【问题描述】:

我正在课堂上学习大数据,现在我们正在学习 HIVE。我们今天了解了映射器和化简器,但老实说,它超出了我的想象。有人可以向我解释一下 mapper 和 reducer 在每个步骤中的作用吗?或者至少给我指出一些好的读物?提前致谢

【问题讨论】:

你可以从这里hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html 开始,试着挖掘更多你觉得困惑的东西 【参考方案1】:

让我们试着从我从网上下载的上图中理解 map-reduce 流程。

我们将讨论hadoop中的字数问题,也就是Hadoop中的hello world。

Word Count 是一个程序,我们可以在其中找到文件中每个单词的出现次数。

让我们试着理解

第 1 步)

输入文件:我们需要一些数据来运行字数统计程序,要在集群上运行这个程序,第一步应该是把这个文件放在hadoop上,这可以做到通过各种方式最简单的方法是使用 hadoop shell 命令: 可以使用 put 或 copyFromLocal 之类的:

第 2 步)

Map Reduce 谈的是键值对,这意味着 mapper 会以键值对的形式获取输入,他们会做需要的处理,然后他们会以键值对的形式产生中间结果,这将作为reducer 的输入以进一步处理,最后reducer 也会将其输出写入键值对。

但是我们知道mapper在主驱动程序之后执行,所以谁以键值对的形式向mapper提供输入,输入格式为你做这件事。

InputFormat 是做两个主要事情的类:

1) 输入拆分(您的映射器实例数由此输入拆分驱动或映射器数量由输入拆分驱动,默认情况下,如果您去,您的一个拆分大小相当于一个块默认配置,但您可以根据需要更改拆分大小。

因此,如果您正在使用 512 mb 数据并且您的块大小为 64 mb,那么将使用大约 8 个输入拆分大小,将运行 8 个映射器实例或将使用 8 个映射器)

2) 破坏键值对中的数据(记录读取器是在后端执行此操作的类)

现在映射器的键和值是什么,这将由您使用的文件输入格式驱动,例如 TextInputFormat 是最常用的输入格式。它将 longWritable(相当于 long)作为键和 Text(字符串)作为值发送到映射器

您的映射器类将在 1 split 上工作,在类中,您有一个 map 函数,它一次可以在一行上工作,因此我们可以从上图中看到,单行将转到 map 函数

例如它发送:“Apple orange Mango”到地图功能

3) 映射器

在 mapper 中,我们将 line 作为输入,所以现在我们需要编写逻辑。

我们根据 delimited 将行分成单词,所以现在我们在一行中有单个单词 我们知道 map 适用于键值对。 我们可以把这个工作作为一个键和值作为 1

为什么我们把单词作为关键而不是反过来,因为下一阶段是

Shuffle 和 Sorting 阶段:在这个阶段,框架会根据相似的 key 进行分组,或者在 shuffle 阶段将所有不同的 key 聚集在一起,然后根据 key 对它们进行排序。

现在让我们再次修改

最初我们有一个文件,它根据输入拆分发送到不同的映射器,然后在 map 函数的映射器类中,我们得到一行作为输入,因此针对一行构建了我们的逻辑,所有行都可以工作以类似的方式处理一个实例,最后所有实例都可以像这样并行工作。

现在假设你有 10 个 mapper 正在运行,现在在 map reduce 中你的 reducer 的数量总是少于 mapper。

所以如果我们使用了 10 个映射器,那么很可能会使用 2-3 个减速器。

洗牌和排序阶段我们已经看到所有相似的键会组合在一起。

首先在什么基础上决定哪个映射器数据将去哪个reducer。 在这种情况下,10 个映射器数据必须分成 2 个减速器,所以它会根据什么来决定。

有一个名为 Partitioner 的组件,它将根据散列分区并在其上使用模运算符来决定哪个映射器输出将发送到哪个减速器。

所以如果我们使用散列,那么这是 100% 确定所有相同的键都会进入相同的减速器。

我们不必担心任何事情,因为框架的设计目的是高效地完成工作,但是是的,因为它是用 java 编写的,所以我们确实可以根据需要灵活地使用不同的组件,例如自定义键,自定义分区器,自定义比较器等。

4) Reducer :现在 reducer 将在其输入中获取键和其值列表,如下所示

苹果,

现在在 reducer 中,我们编写了我们想要做什么的逻辑,对于我们的例子,我们想要进行字数统计,所以我们必须简单地计算值。

这也是我们最初在 Map 阶段取 1 作为值的原因,因为我们只需要计数。

输出:最终输出将由reducer再次以键值对形式写入hdfs。

【讨论】:

以上是关于了解 HIVE 数据库中的映射器和缩减器的主要内容,如果未能解决你的问题,请参考以下文章

Spring映射器适配器解析器

从文件中为hadoop中的映射器创建自定义键值

无法在 Sqoop 导出中自定义的映射器数量

java--springmvc

在 pyspark 的映射器中导入错误

如何将不同的数据集传递给同一作业的两个不同的映射器