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

Posted

技术标签:

【中文标题】使用 Hadoop MapReduce 处理不同节点上的不同文件【英文标题】:Processing different files on separate nodes using Hadoop MapReduce 【发布时间】:2012-12-28 14:46:42 【问题描述】:

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

【问题讨论】:

这些文件有多小,您将执行什么样的处理? 文件非常小,从 1 到 20 KB。而且我们必须执行许多不同的检查以确保文件格式正确且没有损坏。 这可以通过分区来实现吗(可能基于文件名)。请回答我的这个问题,我在分区数据时遇到了问题。 ***.com/questions/14193646/… Getting Filename/FileData as key/value input for Map when running a Hadoop MapReduce Job的可能重复 【参考方案1】:

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

混淆输入

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

多个输出

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

初始化成本高

每个 hadoop map reduce 作业的启动成本都很高,在小型集群上大约需要 30 秒,而在大型集群上则更多。仅这一点可能会比您希望通过并行获得更多的时间。

【讨论】:

是的,我正在考虑相同的解决方案,但我确实知道初始化速度慢。我们有一个 80 个节点的集群,所以我猜初始化时间大约是 30 秒。我们过去使用 Ab Initio 执行相同的操作(它应该非常快),大约需要 7-8 分钟。所以我希望在 Hadoop 上也能花费类似的时间,甚至更少。【参考方案2】:

简而言之:试试NLineInputFormat

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

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

注意:Hadoop 输入格式决定了拆分的计算方式; NLineInputFormat(不像TextInputFormat)不关心块。

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

【讨论】:

请原谅我的无知,但你能用外行的方式解释这一切吗? :( 你应该问自己的第一个问题:有可能并行化我的问题吗?根据您的问题,您可以尝试通过以下方式进行并行化:a)将文件分成几部分,并将您的计算应用于文件的某些部分(这是您经常使用 Hadoop 执行的操作);或 b) 如果您必须对一个文件执行多个计算,那么您可以分别对一个文件运行多个计算。如果你可以并行化,那么下一个问题就是你是如何做到的。在我的回答中,我概述了如何在 Hadoop 中处理案例 b)。

以上是关于使用 Hadoop MapReduce 处理不同节点上的不同文件的主要内容,如果未能解决你的问题,请参考以下文章

MapReuce中对大数据处理最合适的数据格式是什么?

hadoop mapreduce 进程都有哪些

使用 Hadoop 处理来自多个数据源的数据

Spark:超越Hadoop MapReduce

Hadoop MapReduce例子-新版API多表连接Join之模仿订单配货

Hadoop MapReduce编程 API入门系列之处理Excel通话记录(二十)