理解map reduce

2q5ifsrm  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(348)

所以这一直困扰着我。我不确定map reduce究竟是如何工作的,我似乎迷失在一系列事件中。
我的理解是:
master将文件分块并将其作为(k1,v1)交给Map绘制者
Map程序将获取文件并执行Map(k1,v1)->(k2,v2),并将这些数据输出到各个文件中。
这就是我迷路的地方。
那么这些单独的文件是如何合并的呢?如果每个文件中的键都是重复的呢?
这是谁干的?是主人吗?如果所有的文件都在这一步进入主控,那么它们不会成为一个巨大的瓶颈吗?所有这些都合并到一个文件中了吗?这些文件现在是不是被重新分块交给了减速器?
或者,如果所有的文件都直接转到减速器,那么在过程结束时,(k3,v3)文件中重复的k3会发生什么?它们是如何结合的?是否还有另一个Map缩小阶段?如果是这样,我们是否需要创建新的操作:map(k3,v3)->(k4,v4),reduce(k4,v4)->(k3,v3)
我想总结一下,我只是不明白如何正确地重新组合文件,它导致我的map reduce逻辑失败。

cgvd09ve

cgvd09ve1#

第三步叫做“洗牌”。它是map-reduce框架的主要增值之一,不过对于大型数据集来说,它也非常昂贵。框架对所有Map器输出的完整记录集执行类似于分组操作的操作,然后使用每组记录调用reducer。回答3个问题:
3.1. 假设您的作业配置为具有r个总减速器。该框架将每个map输出文件分割成r个片段,并将每个片段发送给一个reducer任务。总共有m个Map绘制者,那就是四处飞行的小切片先生。当一个特定的reducer接收到它所需要的所有切片时,它会将它们合并在一起,并按k2键对结果进行排序,然后按该键动态地对记录进行分组,以便对reduce()进行单独调用。如果存在重复的k2密钥,则组将比单个密钥大。事实上,这就是重点。如果你的Map器从来没有输出过相同的密钥,那么你的算法甚至不需要reduce阶段,你可以完全跳过昂贵的shuffle。
3.2. 执行所有数据移动的负载分布在整个集群中,因为每个reducer任务都知道它想要什么输出,并从每个Map器请求它们。主节点唯一要做的就是协调,也就是说,告诉每个reducer何时开始提取mapper输出,监视死节点,并跟踪每个人的进度。
3.3. 减速机输出不受框架检查,也不以任何方式进行组合。不管您有多少个reducer任务(r),这就是您将得到多少个包含k3、v3记录的输出文件。如果需要再次合并,请对该输出运行另一个作业。

hfwmuf9z

hfwmuf9z2#

在阅读此答案之前,请先花点时间阅读有关合并排序(分而治之方法)的内容
下面是框架在幕后发生的一整套动作
客户端提交mapreduce作业。作业提交时
fileinputformat决定如何将文件分割为多个分割(分割=1个或多个hdfs块,具体取决于分割大小)。
jobtracker计算出拆分的位置,并在拆分附近生成Map器,位置的优先级为(1)。本地数据,2。机架本地,3。网络跃点(本地)
Map程序读取数据(fileinputformat提供的记录读取器)并生成k1->v1
这些数据被本地保存到运行Map程序的本地文件系统中,这里的技巧是保存在本地文件系统上的数据被“排序”并存储在分区中(等于还原器的数量)
如果启用了组合器,则在保存到磁盘之前,对于给定的键,值将根据组合器逻辑进行合并(基本上与reduce相同),数据将被排序并保存到磁盘上
5 . 每个reducer从Map器的相应分区中提取数据(不要忘记reducer提取的所有数据都已排序)

{
k1->v1
k1->v2 
K2->v3
}

reducer打开指向从Map器中提取的所有已排序文件的文件指针并合并它们(合并时使用group和sort comparator)当从已排序的文件进行合并时,reducer的输出将被排序并保存到hdfs中
这一步有点类似于合并排序“合并步骤”
请通过http://bytepadding.com/big-data/map-reduce/understanding-map-reduce-the-missing-guide/ 对于相同的图形表示

相关问题