Hadoop 的预期用途似乎是当输入数据是分布式的(HDFS) 并且在映射过程时已经存储在节点本地。
假设我们有不需要存储的数据;数据可以在运行时生成。例如,映射过程的输入是每个可能的 IP 地址。Hadoop 是否能够跨节点有效地分配 Mapper 工作?您是否需要明确定义如何将输入数据(即 IP 地址空间)拆分到不同的节点,或者 Hadoop 是否会自动处理?
Hadoop 的预期用途似乎是当输入数据是分布式的(HDFS) 并且在映射过程时已经存储在节点本地。
假设我们有不需要存储的数据;数据可以在运行时生成。例如,映射过程的输入是每个可能的 IP 地址。Hadoop 是否能够跨节点有效地分配 Mapper 工作?您是否需要明确定义如何将输入数据(即 IP 地址空间)拆分到不同的节点,或者 Hadoop 是否会自动处理?
让我首先澄清你发表的评论。Hadoop 旨在支持跨潜在大量节点的潜在大规模并行计算,无论数据来自何处或去往何处。Hadoop 设计在必要时更倾向于可扩展性而不是性能。确实,聪明地了解数据从哪里开始以及数据的分布方式可以对 hadoop 作业的运行速度/好坏产生重大影响。
对于您的问题和示例,如果您将生成输入数据,您可以选择在第一个作业运行之前生成它,或者您可以在第一个映射器中生成它。如果您在映射器中生成它,那么您可以确定映射器在哪个节点上运行,然后只生成将在该分区中缩减的数据(使用分区器在映射器和缩减器之间引导数据)
这将是任何分布式平台都会遇到的问题。例如,Storm 让您有发言权,哪个 Bolt 实例将处理每个元组。术语可能不同,但您将在 Storm 中实现与 Hadoop 大致相同的 shuffle 算法。
您可能正在尝试在 map reduce 集群上运行非 MapReduce 任务。(例如IP扫描?)可能有更合适的工具,你知道......
很少有人没有意识到 MapReduce 是关于检查点的。它是为大型集群开发的,您可以预期机器在计算过程中会出现故障。通过在架构中内置检查点和恢复功能,可以减少故障和主机缓慢的后果。
这就是为什么在 MapReduce 中一切都是从磁盘到磁盘的原因。之前有检查点,之后有检查点。如果失败,则仅重新运行这部分作业。
通过放弃检查点,您可以轻松地超越 MapReduce。如果您有 10 个节点,您将轻松获胜。如果你有 100 个节点,你通常会赢。如果你有一个主要的计算和 1000 个节点,很可能一个节点失败了,你希望你一直在做类似的检查点......
现在您的任务听起来不像是 MapReduce 作业,因为输入数据是虚拟的。这听起来更像是您应该运行其他一些分布式计算工具;也许只是将您的初始结果写入 HDFS 以供以后通过 MapReduce 处理。
但当然有办法解决这个问题。例如,您可以使用 /16 子网作为输入。每个映射器读取一个 /16 子网并在其上完成工作。如果您意识到不需要生成所有 2^32 个 IP,那么生成的虚假输入并不多,除非您的集群中有那么多节点......
Mappers 的数量取决于 InputFormat 的实现生成的 Splits 的数量。有NLineInputFormat,您可以将其配置为生成与输入文件中的行一样多的拆分。您可以创建一个文件,其中每一行都是一个 IP 范围。我没有亲自使用过它,并且有很多报告说它不能按预期工作。如果您真的需要它,您可以创建自己的 InputFormat 实现,它为您的虚拟数据生成 InputSplits,并根据需要强制使用尽可能多的映射器。