在Scala / Hadoop系统中充分利用多个内核进行并行处理的更好方法是什么?
假设我需要处理1亿份文件。文档不是很大,但处理它们是计算密集型的。如果我有一台拥有100台机器的Hadoop集群,每台机器有10个核心,我可以:
A)向每台机器发送1000个文件,让Hadoop在10个核心中的每个核心(或尽可能多的核心)上启动地图
或
B)向每台机器发送1000个文档(仍然使用Hadoop)并使用Scala的并行集合来充分利用多个核心。 (我会将所有文档放在并行集合中,然后在集合上调用map
)。换句话说,使用Hadoop在集群级别进行分发,并使用并行集合来管理每台计算机内核的分发。
答案 0 :(得分:2)
Hadoop将提供的不仅仅是并行化。它提供了一个分发工作的平台,一个用于处理并发作业的调度程序,一个分布式文件系统,执行分布式减少的能力以及容错。也就是说,这是一个复杂的系统,有时可能难以使用。
如果您打算让多个用户提交许多不同的工作,Hadoop就是最佳选择(两个选项中的一个)。但是,如果您将集群用于始终通过相同的功能处理文档,则可以毫无困难地开发具有Scala并行集合和演员的系统以进行机器间通信。 Scala解决方案可以为您提供更多控制,系统可以实时响应,您不必处理与您的任务无关的大量Hadoop配置。
如果您需要在大量数据(大于单个节点上的数据)上运行各种作业,请使用Hadoop。如果您更详细地描述您的要求,我可以为您提供更多信息。
更新:100万是一个相当小的数字。您可能希望进行一些计算,并查看具有并行集合的单台计算机需要多长时间。这里的优点是开发时间很短!
答案 1 :(得分:1)
Hadoop不是很好处理很多小文件,而是处理少量非常大的文件。有没有什么办法可以在处理之前合并文件,或者它们都完全不同? Hadoop本身负责分发和并行,因此不需要将X文档显式发送到Y机器。而且我认为你不应该只将hadoop用作分配机制,而不是它的用途。您应该使用真实的地图/减少,或者为您想要做的任何事情构建自己的系统,但不要试图根据您的意愿弯曲hadoop。
答案 2 :(得分:1)
答案取决于以下问题 - 您的Scala代码是否能够充分利用所有可用内核。顺便提一下,如果你要处理的文档部分之间有很好的内在同步,或者在没有锁争用的情况下进行parralelyze算法的其他方式 - 那么“B”就是这样。如果是这样的话 - 为每个节点配置一个映射器并让你的映射器使用以最佳方式核心。
如果您从parralelization获得的收益不是那么好,并且在处理中添加更多线程(核心)并不能以线性方式提高性能 - 那么“A”可能是更好的方式。 “A”的效率还取决于RAM的大小 - 每个节点需要足够的RAM用于10个映射器。
我怀疑理想的解决方案可能介于两者之间。所以我的建议是开发mapper,它使用多个线程作为参数,然后做一些测试,增加每个映射器的线程数量,减少每个节点的映射器数量。