Hadoop 理解Map-Reduce

Hadoop 理解Map-Reduce,hadoop,mapreduce,Hadoop,Mapreduce,所以这一直让我困惑。我不确定map reduce到底是如何工作的,我似乎迷失在了一系列事件中 我的理解是: Master将文件分块并按(K1,V1)的格式将其交给映射者 映射者将获取文件并执行映射(K1,V1)->(K2,V2),然后将这些数据输出到各个文件中 这就是我迷路的地方。 那么这些单独的文件是如何合并的呢?如果在每个文件中重复键会怎样 这是谁干的?是主人吗?如果所有的文件都在这一步进入主控,那么它们不会成为一个巨大的瓶颈吗?是否所有内容都合并到一个文件中?现在文件是否重新分块并交给还原

所以这一直让我困惑。我不确定map reduce到底是如何工作的,我似乎迷失在了一系列事件中

我的理解是:

  • Master将文件分块并按(K1,V1)的格式将其交给映射者
  • 映射者将获取文件并执行映射(K1,V1)->(K2,V2),然后将这些数据输出到各个文件中
  • 这就是我迷路的地方。
  • 那么这些单独的文件是如何合并的呢?如果在每个文件中重复键会怎样
  • 这是谁干的?是主人吗?如果所有的文件都在这一步进入主控,那么它们不会成为一个巨大的瓶颈吗?是否所有内容都合并到一个文件中?现在文件是否重新分块并交给还原者
  • 或者,如果所有文件都直接转到还原器,那么在过程结束时(K3,V3)文件中重复的K3会发生什么?它们是如何组合的?是否还有另一个地图缩减阶段?如果是这样,我们是否需要创建新的操作:Map(K3,V3)->(K4,V4),Reduce(K4,V4)->(K3,V3)
  • 总而言之,我不明白文件是如何被正确地重新组合的,这会导致我的map reduce逻辑失败。

    步骤3被称为“洗牌”。它是map reduce框架的主要附加值之一,尽管它对于大型数据集来说也非常昂贵。框架对所有映射器输出的完整记录集执行类似于分组操作的操作,然后使用每组记录调用还原器。回答您的3个问题:

    3.1。假设您的作业配置为具有r个总减速器。该框架将每个map输出文件分割成r个片段,并将每个片段发送给一个reducer任务。有了m个总地图绘制者,这就是四处飞行的小切片先生。当一个特定的reducer接收到它所需要的所有切片时,它会将它们合并在一起,并按K2键对结果进行排序,然后根据该键对记录进行动态分组,以便单独调用reduce()。如果存在重复的K2密钥,则组将比单个密钥大。事实上,这就是重点。如果您的映射器从未输出相同的键,那么您的算法甚至不需要reduce阶段,您可以完全跳过昂贵的洗牌

    3.2。执行所有数据移动的负载分布在整个集群中,因为每个reducer任务都知道它想要什么输出,并从每个映射器请求它们。主节点必须做的唯一事情就是协调,即告诉每个减速器何时开始提取映射器输出,监视死区节点,并跟踪每个人的进度


    3.3。框架不检查减速器输出,也不以任何方式组合减速器输出。无论您有多少个reducer任务(r),这就是您将获得多少个包含K3、V3记录的输出文件。如果需要再次组合,请对该输出运行另一个作业

    在阅读此答案之前,请花些时间阅读有关合并排序(分治方法)的内容

    下面是框架在幕后发生的一整套动作

  • 客户端提交mapreduce作业。当作业提交发生时

    • FileInputFormat决定如何将文件分割为多个分割(分割=1个或多个hdfs块,具体取决于分割大小)
  • JobTracker计算出拆分的位置,并在拆分附近生成映射器,本地性的优先级为(1.数据本地,2.机架本地,3.网络跃点本地)

  • 映射程序读取数据(FileInputFormat提供的记录读取器)并生成k1->v1

  • 这些数据被本地保存到运行映射程序的本地文件系统中,这里的技巧是保存在本地文件系统上的数据被“排序”并存储在分区中(等于还原器的数量)

    • 如果启用了组合器,则在保存到磁盘之前,对于给定的键,值将根据组合器逻辑进行合并(基本上与reduce相同),数据将被排序并保存到磁盘上
  • 五,。每个reducer从映射器的相应分区中提取数据(不要忘记所有由reducer提取的数据都已排序)

    Reducer打开指向从映射器中提取的所有已排序文件的文件指针,并合并它们。(合并时使用Group和sort comparator)当从已排序的文件进行合并时,将对reducer的输出进行排序并保存到hdfs中

    此步骤有点类似于合并排序“合并步骤”

    请仔细查看同一张图片

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