说任何统计学习算法(线性/逻辑回归、SVM、神经网络、随机森林)都可以在 Map Reduce 框架内实现是否正确?还是有限制?
我想可能有一些算法无法并行化?
说任何统计学习算法(线性/逻辑回归、SVM、神经网络、随机森林)都可以在 Map Reduce 框架内实现是否正确?还是有限制?
我想可能有一些算法无法并行化?
确实有:
我建议您可以在 Map Reduce 中实现几乎任何类型的数据处理,只要有足够的时间对其进行编码,但是您将获得的并行化程度将取决于您的数据是什么以及您正在对它做什么.
我可以想象一个简单的场景,其中并行化会大大减少。例如,如果连接键(1、2、3 和 4)均匀分布在您的映射器节点上,并且每个 (4) 的数量相同,则具有 4 个映射器和 4 个减速器节点的简单 JOIN 任务将高度并行化- 然后 4 个 reducer 将为每个连接键获得相等的工作份额:
Mapper 1 2 3 4 | 1 2 3 4 | 1 2 3 4 | 1 2 3 4
/ \ / \ / \ / \
v v v v v v v v
Reducer 1 1 1 1 | 2 2 2 2 | 3 3 3 3 | 4 4 4 4
但是,如果您的大多数连接键都相同(例如几乎所有 1),则处理 1 的减速器将被淹没:
Mapper 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 2
/ / / / /
v v v v v
Reducer 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | 2 | nothing! | nothing!
因为 1 个 reducer 完全被淹没而其他人什么都不做,所以当 Hadoop 停止并等待 reducer 完成时,您将失去大部分并行化。
警告:可能有更复杂的 Map Reduce 实现可以处理这类问题,我只知道 Hadoop 的基础知识。
我也知道这与统计学习算法无关(我对此几乎一无所知),但我想这个原理仍然是正确的——一些算法或数据不会分成高度并行的子任务。
不。
根据定义,Map reduce一次只能处理一条记录。
因此,您无法在不滥用编程模型的情况下计算距离/相似度矩阵。SVM 等方法确实需要成对相似性。
不过,这种滥用确实很常见(这就是 map reduce 已死的原因)。最容易的是,您可以将每个对象映射到键 0,并在“reducer”中完成所有工作。更聪明的方法将数据划分为 k 个分区,因此它们至少可以并行运行一些工作。
但所有这些方法都是丑陋的 hack,它们绕过了为 map reduce 做出的深思熟虑的设计决策:在 map reduce 中,必须独立处理每条记录,以允许平台自动优化并行性和恢复。在上面的 hack 中,map 阶段被滥用来将数据拆分为手动选择的并行度,然后 reducer 是简单的并行作业。它不再是 mapreduce,而是对分区数据进行并行编程的抽象模型。
在所有早期的炒作之后,mapreduce 现在已经死了。诸如 Apache Mahout 之类的工具不再接受 mapreduce,但希望您转向更灵活的范式,这些范式不需要这种滥用的 hack。
是否所有可处理的问题都可以有效地并行化(有效地 = 实现速度增益)是计算机科学中的一个悬而未决的问题。假设 AC != P 则并非所有算法都可以以一种导致速度增益的方式进行 Map Reduce。