我刚刚在这里阅读了一些关于 Hadoop 的优秀文档。看来 Hadoop 与其他计算成本高的数据处理(例如异构计算)方法相比的主要优势之一是它的可扩展性。它利用大量成本适中的硬件,而不是任何强大但昂贵的机器。
假设我们可以选择使用高性能但昂贵的机器进行 Hadoop 计算。Hadoop 能否有效利用这些昂贵的资源?它会自动利用额外的EC2 计算单元,还是您必须自己进行并行编程?性能机器有多大提升?有没有一种方法可以量化更多EC2的价格带来的性能提升?
我刚刚在这里阅读了一些关于 Hadoop 的优秀文档。看来 Hadoop 与其他计算成本高的数据处理(例如异构计算)方法相比的主要优势之一是它的可扩展性。它利用大量成本适中的硬件,而不是任何强大但昂贵的机器。
假设我们可以选择使用高性能但昂贵的机器进行 Hadoop 计算。Hadoop 能否有效利用这些昂贵的资源?它会自动利用额外的EC2 计算单元,还是您必须自己进行并行编程?性能机器有多大提升?有没有一种方法可以量化更多EC2的价格带来的性能提升?
Hadoop 框架会在可用时自动利用多个内核。你不必自己做并行编程,这实际上是Hadoop的卖点之一:你只需要编写一次你的工作,而不用担心线程同步逻辑,然后根据你的集群的配置它会尝试尽可能多地使用所有内核。
例如,假设您有一个在数 TB 数据集上运行的作业,在计算拆分后需要运行 100 个任务。现在,如果您想在 10 个 m1.small 节点(只有 1 个核心)上运行您的作业,您的集群一次将有 10 个任务的容量(每个节点 1 个任务)。但是,如果您想在例如 10 个 m1.large 节点(2 x 2 核)上运行它,您一次将有 40 个任务的容量,因此您的工作将比使用相同的节点快大约 4 倍m1.small 的数量,因为它将利用额外的内核。
此外,我听说有人在 Hadoop 上使用 CUDA(这里有一些信息),并且亚马逊有一些集群 GPU 实例,所以在这种情况下,您也可以利用 GPU。
底线是,在使用 Hadoop 时,您应该根据内核数量而非机器数量进行推理。显然你想找到一个好的折衷方案,我在过去见过一个集群,其中每个节点都有很多核心,但磁盘 I/O 不是很好,所以这在集群中引起了很多争用,我们有减少每个节点的最大任务数(您可以在 Hadoop 配置中通过参数mapred.tasktracker.map.tasks.maximum
和控制mapred.tasktracker.reduce.tasks.maximum
)。
我个人发现 m1.xlarge 实例在一些 Hadoop 集群中运行良好,而高 CPU 实例对我来说导致了过多的磁盘争用。