2013-05-27 52 views
2

Hadoop的预期用途看来是当输入数据是distributed(HDFS),并在该映射处理时已经存储的本地节点。当输入数据不存储时,Hadoop/MapReduce如何缩放?

假设我们有没有需要存储的数据;数据可以在运行时生成。例如,映射过程的输入是每个可能的IP地址。 Hadoop是否能够跨节点高效地分发Mapper工作?您是否需要明确定义如何将输入数据(即IP地址空间)拆分到不同的节点,或者Hadoop是否自动处理?

+0

您打算如何为其提供数据? “假设它没有被存储”意味着你必须编写一个'InputFormat',如果你想要生成一个包含所有可能的IP的文件,那么HDFS就会将它分割成块。无论如何你都被迫分裂它。 – TC1

回答

4

让我先澄清你所做的评论。 Hadoop被设计为支持潜在大量节点上的潜在大规模并行计算,而不管数据来自何处。 Hadoop设计在必要时有利于扩展性能。的确,聪明的数据开始位置以及数据分布的方式可以使Hadoop作业的运行效果变得非常好。

要你的问题,例如,如果你会产生输入数据你第一份工作的运行,也可以在第一映射器内生成之前生成它的选择。如果你在映射器内生成它,那么你可以找出映射器运行的是什么节点,然后只生成该分区中将减少的数据(使用分区器在映射器和缩减器之间引导数据)

这就是成为任何分布式平台都会遇到的问题。例如,Storm可以让你有一些发言权,其中的bolt实例将会处理每个元组。术语可能会有所不同,但您将在Storm中执行与Hadoop大致相同的shuffle算法。

+0

假设你的意思是[Storm](http://storm-project.net/),(幸运的是)它不在Apache下。 – TC1

1

你大概跑地图上的非MapReduce任务的减少集群即可。 (例如IP扫描?)可能有更适合的工具,你知道...

很少有人没有意识到的事情是MapReduce约为检查点。它是为大型集群开发的,您可能希望计算过程中机器出现故障。通过在体系结构中内置检查点和恢复功能,这可以减少故障的后果并降低主机速度。

这就是为什么一切从磁盘转移到磁盘中的MapReduce。它之前是检查点,之后是检查点。如果失败了,只有这部分工作重新运行。

如果保留离开检查点轻松跑赢大市的MapReduce。如果你有10个节点,你会轻松获胜。如果你有100个节点,你通常会赢。如果你有一个主要的计算和1000个节点,那么很有可能一个节点出现故障,你希望你一直在做相似的检查点...

现在你的任务听起来不像一个MapReduce作业,因为输入数据是虚拟的。这听起来更像是你应该运行其他分布式计算工具;也许只需将初始结果写入HDFS 后面通过MapReduce处理。

但当然有办法破解这个。例如,您可以使用/ 16个子网作为输入。每个映射器都读取一个/ 16子网,并完成它的工作。如果你意识到你不需要生成所有2^32 IP,除非在群集中有很多节点,否则生成的假输入并不是那么多...

1

映射器的数量取决于拆分的数量由InputFormat的实现生成。 有NLineInputFormat,您可以将其配置为生成与输入文件中的行一样多的分割。您可以创建一个文件,其中每行都是IP范围。我没有亲自使用它,并且有许多报告说它不能按预期工作。 如果您真的需要它,您可以创建自己的InputFormat实现,它可以为您的虚拟数据生成InputSplits,并根据需要强制执行尽可能多的映射器。