Java 使用Hadoop MapReduce在不同的节点上处理不同的文件

Java 使用Hadoop MapReduce在不同的节点上处理不同的文件,java,hadoop,mapreduce,cloudera,Java,Hadoop,Mapreduce,Cloudera,我以前使用过Pig和Hive,但我是Hadoop MapReduce的新手。我需要写一个应用程序,其中有多个小文件作为输入(比如10)。它们有不同的文件结构,所以我想在不同的节点上并行处理它们,以便能够快速处理它们。我知道Hadoop的优点是处理大数据,但这些输入文件虽然小,但需要大量处理,因此我希望利用Hadoop的并行计算能力。这是可能的吗?这是可能的,但你可能不会得到太多的价值。你有这些力量反对你: 混乱输入 您需要编写一个映射器,它可以处理所有不同的输入格式(通过检测输入格式,或者使用输

我以前使用过Pig和Hive,但我是Hadoop MapReduce的新手。我需要写一个应用程序,其中有多个小文件作为输入(比如10)。它们有不同的文件结构,所以我想在不同的节点上并行处理它们,以便能够快速处理它们。我知道Hadoop的优点是处理大数据,但这些输入文件虽然小,但需要大量处理,因此我希望利用Hadoop的并行计算能力。这是可能的吗?

这是可能的,但你可能不会得到太多的价值。你有这些力量反对你:

混乱输入 您需要编写一个映射器,它可以处理所有不同的输入格式(通过检测输入格式,或者使用输入文件名来确定所需的格式)

多输出 您需要使用Hadoop的稍微复杂的多输出文件处理功能,或者将输出作为reducer的副作用写入(如果可以确保每个文件将转到不同的节点,则可以使用mapper)

初始化成本高
每个hadoop map reduce作业都会带来高昂的启动成本,在一个小集群上大约30秒,在一个更大的集群上更是如此。仅这一点就可能会使您损失比您希望通过并行性获得的更多的时间。

简而言之:尝试
NLineInputFormat

将所有输入文件复制到所有节点没有问题(如果愿意,可以将它们放到分布式缓存中)。您真正想要分发的是支票处理

使用Hadoop,您可以创建格式为(filename,check2run)或(filename,format,check2run)的(单个!)输入控制文件,并使用
NLineInputFormat
向节点提供指定数量的检查(mapreduce.input.lineinputformat.linespermap控制向每个映射器提供的行数)

注意:Hadoop输入格式决定分割的计算方式
NLineInputFormat
(与
TextInputFormat
不同)不关心块


根据检查的性质,您可能能够计算LinesMap值以覆盖一批映射程序中的所有文件/检查(或者可能根本无法使用此方法:)

这些文件有多小以及您将执行何种处理?这些文件非常小,从1到20 KB不等。我们必须执行许多不同的检查,以确保文件格式正确且未损坏。这可以通过分区(可能基于文件名)实现。请回答我的这个问题,我在对数据进行分区时遇到了一个问题。可能重复是的,我正在考虑相同的解决方案,我确实知道初始化速度慢。我们有一个80节点的集群,所以我猜初始化时间大约为30秒。我们曾经使用从头算来执行相同的操作(它应该非常快),大约需要7-8分钟。所以我希望在Hadoop上也能花同样的时间,如果不是更少的话。请原谅我的无知,但你能用外行的术语解释一下这一切吗(你应该问自己的第一个问题:有没有可能并行化我的问题?根据你的问题,你可以尝试并行化:a)将文件分为几个部分,并将计算应用到文件的各个部分(这是你经常使用Hadoop做的);或者b)如果必须对一个文件执行多个计算,则可以对一个文件单独运行多个计算。如果你能并行化,那么下一个问题就是你怎么做。在我的回答中,我概述了如何在Hadoop中处理案例b)。