Hadoop for .NET Developers(十四):了解MapReduce和Hadoop流

来源:互联网 发布:王者荣耀数据封神榜67 编辑:程序博客网 时间:2024/06/08 10:06

在Hadoop中,通过MapReduce作业解决数据处理。作业由基本配置信息组成,例如输入文件和输出文件夹的路径,由Hadoop的MapReduce层执行一系列任务。这些任务负责首先执行map和reduce功能,以便将输入数据转换为输出结果。

为了说明MapReduce如何工作,请考虑一个简单的输入文件,其中包含制表符分隔的记录(在下图的最左侧)。为了说明的目的,每一行将被标记为A到F。

这里写图片描述

MapReduce作业是根据这个输入文件指定的,通过一些内部逻辑,假设MapReduce确定记录A到C应该由一个地图任务(Map Task 0)执行,并记录D到F应由另外一个地图执行(Map Task 1 )。

定义MapReduce作业时,已经识别出Mapper类。 Mapper类是一个包含map函数的类。每个map任务针对每个输入记录执行map任务,以使map任务0执行map函数三次,一次对记录A,再次对记录B,再次对记录C.类似地,map任务1执行map函数针对其三个记录中的每一个记录D至F.

map函数被写入以接受一行输入数据,并且预期以键和值组合的形式发出输出数据。典型的map函数发出单个键和从输入数据导出的值,但是映射函数有可能根据输入数据生成零个或多个键值和值组合。在我们的例子中,map函数发出的输入数据行和键值组合之间存在一对一的相关性。

map函数发出的键和值应该如何?在我们的示例中,键被标识为具有与每个相关联的各种值的k1,k2和k3。给定map函数提供的关键和价值是完全由Mapper类开发人员提供的,但通常的关键是可以对哪些数据进行分组,并且该值是一些输入值 - 可以包括一个分隔符列表值,XML或JSON片段,或者更复杂的东西 - 这对于reduce功能将是有用的。如果现在不是100%清楚,那么希望一旦我们覆盖了减少功能。

一旦地图任务完成工作,从地图函数的各种调用输出的数据将被排序和混洗,以便将与给定键相关联的所有值排列在一起。生成减少任务并将键及其值交给处理任务。在我们的示例中,MapReduce已经生成了两个简化任务,并将k1和k2的值交给了减少任务0和k3的值以减少任务1。

作为MapReduce作业定义的一部分,定义了一个Reducer类。该类包含一个reduce函数,该函数提供了一个键值及其相关值的数组,用于通过reduce任务进行处理。 reduce函数通常会产生一个汇总值,该值可以通过给定关键字的值数组导出,但是在开发人员根据输出的输出以及它的派生方式保持相当的灵活性之前。

将每个reducer任务的reduce函数输出写入被识别为MapReduce作业配置的一部分的输出文件夹中的文件。单个文件与每个缩减任务相关联,因此在我们的示例中,使用两个简化任务,会生成两个输出文件。这些文件可以单独访问,但更典型的是使用getmerge命令(在命令行中)或类似的功能将它们组合成单个输出文件。

如果这个解释是有道理的,那么让我们给这个故事增加一点复杂性。并不是每个工作都包含一个Mapper和一个Reducer类。至少,MapReduce作业必须具有Mapper类,但是如果可以通过地图函数处理所有数据处理工作,那将是路的尽头。在这种情况下,输出文件与映射任务对齐,并在与作业配置标识的输出文件夹中找到类似的名称。

此外,MapReduce作业可以接受Combiner类。 Combiner类被定义为Reducer类(并且具有reduce函数),但它在与单个映射任务相关联的数据上运行。 Combiner类背后的想法是,在排序和混洗之前,可以“缩小”(总结)一些数据。对数据进行排序和混洗以将其转换为reduce任务是一项昂贵的操作,Combiner类可以作为优化器来减少在任务之间移动的数据量。组合器类绝对不需要,当您绝对必须将性能从我们的MapReduce作业中挤出时,您应该考虑使用它们。




在最后一篇文章中,我们使用C#构建了一个简单的MapReduce作业。但Hadoop是一个基于Java的平台。那么我们如何使用.NET语言执行MapReduce作业呢?答案是Hadoop Streaming。

简而言之,Hadoop Streaming是一种允许任何可执行文件在MapReduce作业中作为映射器和/或还原器的功能。通过此功能,MapReduce使用其标准输入和输出(即stdin和stdout)与可执行文件交换数据。而且,您可以编写和编译可执行文件,将其加载到集群,并从命令行执行流作业,您可以允许.NET SDK代表您处理流作业的安装和执行,这正是您在最后一篇文章中发生了什么。

与Hadoop Streaming一样灵活,它有一些限制。首先,可执行文件必须能够在集群中的数据节点上运行。使用.NET SDK,这意味着.NET 4.0框架(这已经在您的HDInsight数据节点上可用)依赖,因此,除非在Windows上部署Hadoop,否则无法使用.NET语言编写MapReduce作业。

接下来,Hadoop Streaming可以使用有限数量的格式的文件。对于HDInsight上的Hadoop Streaming,默认的限制是包含面向行的文本(带回车符/换行符分隔符)和JSON格式的文件的文件。如果需要以替代格式处理文件,您可以传递这些文件的名称,并利用map方法和.NET Framework的灵活性来解决这些约束。

最后,Hadoop Streaming需要数据从您的Mappers和Reducers以键+ tab +值格式的文本流动。如果您正在使用.NET SDK编写MapReduce作业(就像我们在最后一篇文章中所做的那样),那么.NET SDK将为您处理最后一个约束。

如果您想了解有关Hadoop中Hadoop Streaming的更多信息,请查看此资源。

原创粉丝点击