1

在 Scala/Hadoop 系统中充分利用多核进行并行处理的更好方法是什么?

假设我需要处理 1 亿份文档。文档不是很大,但处理它们是计算密集型的。如果我有一个 Hadoop 集群,其中有 100 台机器,每台机器有 10 个内核,我可以:

A) 向每台机器发送 1000 个文档,让 Hadoop 在 10 个核心(或尽可能多的可用核心)上启动映射

或者

B) 向每台机器发送 1000 个文档(仍然使用 Hadoop)并使用 Scala 的并行集合来充分利用多核。(我会将所有文档放在一个并行集合中,然后调用map该集合)。换句话说,在集群级别使用 Hadoop 进行分发,并使用并行集合来管理对每台机器内核心的分发。

4

3 回答 3

2

Hadoop 将提供的不仅仅是并行化。它提供了一个分发工作的平台、一个用于处理并发作业的调度程序、一个分布式文件系统、执行分布式归约的能力和容错能力。也就是说,这是一个复杂的系统,有时可能难以使用。

如果您计划让多个用户提交许多不同的作业,Hadoop 是您的最佳选择(在这两个选项中)。但是,如果您致力于让集群始终通过相同的功能处理文档,那么您可以轻松地开发一个具有 Scala 并行集合和参与者的系统以进行机器间通信。Scala 解决方案会给您更多控制权,系统可以实时响应,并且您不必处理大量与您的任务无关的 Hadoop 配置。

如果您需要在大量数据上运行不同的作业(大于单个节点上的数据),请使用 Hadoop。如果您更详细地描述您的要求,我可以为您提供更多信息。

更新:一百万是一个相当小的数字。您可能想要进行一些计算,看看在具有并行集合的单台机器上需要多长时间。这里的优点是开发时间最短!

于 2012-03-16T01:27:23.413 回答
1

Hadoop对于处理大量的小文件不是很好,但是对于处理少量的非常大的文件。有什么方法可以在处理文件之前合并文件,还是它们完全不同?Hadoop 自己负责分布和并行性,因此无需将 X 文档显式发送到 Y 机器。而且我认为你不应该只将hadoop用作分发机制,这不是它的用途。您应该使用真正的 map/reduce,或者为您想要做的任何事情构建自己的系统,但不要试图让 hadoop 屈服于您的意愿。

于 2012-03-16T06:53:12.493 回答
1

答案取决于以下问题 - 您的 Scala 代码是否能够充分利用所有可用的内核。可能如果您在要处理的文档部分之间具有良好的内在同步,或者在没有锁争用的情况下使用其他方式来并行化算法 - 那么“B”是一种方式。如果是这样 - 为每个节点配置一个映射器并让您的映射器利用以最佳方式获得核心。
如果您从并行化中获得的收益不是那么好,并且在处理中添加更多线程(核心)并不能以线性方式提高性能 - 那么“A”可能是更好的方式。“A”的效率" 还取决于 RAM 的大小 - 每个节点需要足够的 10 个映射器的 ram。
我可以怀疑理想的解决方案可能介于两者之间。所以我的建议是开发将线程数作为参数的映射器,然后进行一些测试,增加每个映射器的线程数并减少每个节点的映射器数。

于 2012-03-17T11:24:26.047 回答