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

时间:2012-12-28 14:46:43

标签: java hadoop mapreduce cloudera

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

2 个答案:

答案 0 :(得分:0)

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

混淆输入

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

多个输出

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

初始化成本高

每个hadoop map减少工作都需要大量的启动成本,在小型集群上大约需要30秒,在更大的集群上需要更多。仅此一点可能会失去你所希望通过并行获得的更多时间。

答案 1 :(得分:0)

简而言之:尝试NLineInputFormat

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

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

注意:Hadoop输入格式决定了如何计算拆分; NLineInputFormat(与TextInputFormat不同)并不关心块。

根据检查的性质,您可以计算linepermap值以涵盖一波映射器中的所有文件/检查(或者可能根本无法使用此方法:))