在 Scala/Hadoop 系统中充分利用多核进行并行处理的更好方法是什么?
假设我需要处理 1 亿份文档。文档不是很大,但处理它们是计算密集型的。如果我有一个包含 100 台机器的 Hadoop 集群,每台机器有 10 个内核,我可以:
A) 向每台机器发送 1000 个文档,让 Hadoop 在 10 个核心(或尽可能多的可用核心)中的每一个上启动一个映射
或
B) 向每台机器发送1000个文档(仍然使用Hadoop)并使用Scala的并行集合来充分利用多核。 (我会将所有文档放在一个并行集合中,然后对该集合调用 map
)。换句话说,使用 Hadoop 在集群级别进行分发,并使用并行集合来管理分发到每台机器内的核心。
最佳答案
Hadoop 将提供的不仅仅是并行化。它提供了一个分发工作的平台、一个处理并发作业的调度程序、一个分布式文件系统、执行分布式归约的能力和容错能力。也就是说,这是一个复杂的系统,有时很难使用。
如果您计划让多个用户提交许多不同的作业,Hadoop 是最佳选择(在两个选项中)。但是,如果您致力于让集群始终通过相同的功能处理文档,那么您可以毫不费力地开发一个具有 Scala 并行集合和参与者的系统以进行机器间通信。 Scala 解决方案将为您提供更多控制权,系统可以实时响应,并且您不必处理大量与您的任务无关的 Hadoop 配置。
如果您需要在大量数据(大于单个节点上容纳的数据)上运行各种作业,请使用 Hadoop。如果您更详细地描述您的要求,我可以为您提供更多信息。
更新:一百万是一个相当小的数字。你可能想做一些计算,看看在一台机器上使用并行收集需要多长时间。这里的优势是开发时间最短!
关于scala - 将工作分配给多个核心 : Hadoop or Scala's parallel collections?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730028/