R + Hadoop 在任何情况下都能克服 R 的内存限制吗?

数据挖掘 机器学习 r 大数据 apache-hadoop
2022-02-14 17:31:12

我是 R 用户,我有兴趣学习/了解 Hadoop 的实际工作原理。为此,我之前阅读了有关 Hadoop 的信息,但无法为我的问题找到令人满意的答案。

R + Hadoop 在任何情况下都能克服 R 的内存限制吗?

答案可能很清楚,因为该问题的公认答案 暗示了这一点,但对我来说并非如此。更准确地说:

我可以使用 R + Hadoop 一次将模型拟合到一个非常大的数据集吗?我的意思是计算需要整个数据,而不需要任何可以以某种方式并行化的独立子进程?

当使用计算机集群进行计算时,我看不出这是如何工作的。如果有可能:它是如何工作的?

2个回答

R+Hadoop 本身实际上并没有给您带来任何巨大的直接好处。您可以使用 Hadoop 流在 Hadoop 集群上的所有节点上运行并行 R 作业,但这取决于您的问题本质上是可并行化的。您需要利用分布式编程语言,它可以让您在 Hadoop 集群上的所有节点上运行单个程序。Apache Spark 之类的东西在这里发挥了作用。在这里学究很重要,因为 Apache Spark 并非天生依赖于 Hadoop(您可以在没有任何 Hadoop 功能的情况下独立构建和编译它)。因此,为什么有些人认为它是 Hadoop 的替代品。

通过 SparkR 界面,您可以直接从 R 访问它,只需创建必要的工具(即library(sparkR),如果我没记错的话,导入,然后设置您的sparkContextand SQLContext)。这意味着,如果设置正确,将代码从 1 台机器扩展到 100 台机器所需要做的就是添加更多指向SparkMaster.

回答你的问题。我会给出一个类似的答案来更好地澄清它。Apache Spark也是市场上最著名的大数据工具之一。它也使用内存计算来快速运行任务,但也利用集群计算来更好地分配工作负载。

与此类似,R+ Hadoop也以同样的方式工作。R 有效地做的是定义要使用的任务或机器学习算法,并在 Hadoop 集群的节点上进行转换,以更好地利用并行化方面。

由于 R 语言的正常工作非常依赖 RAM,这使得海量数据的处理时间呈指数级增长。通常,R 通过允许在内核中进行多线程来解决这个问题,这样它就可以尽可能优化地运行任务。但是正如你所知道的,这提供了它可以处理多少数据的上限。R + Hadoop 所做的是它提供了更多节点,因此本质上可以转换为可用于运行以下任务的更多内核。

编辑: 根据要求对最后一点进行更多详细说明

简而言之,将R视为一种为数据分析而构建的语言,它利用多线程更有效地执行所需的分析任务。这种多线程特性使您可以同时将不同的任务作为不同的线程运行,从而尝试在 R 的有限能力范围内实现尽可能多的并行化。

并回答您的问题,如果没有时间限制,R 是否可以执行与 R+Hadoop 提供的相同任务

答案是理论上是,实际上不是!直觉上,我们可能会认为 R 可以通过花费更多时间来处理此类任务。但情况并非总是如此。这更多地取决于任务。

例如,如果 R 正在对几百万条记录的数组中出现的次数进行简单的频率计数,您显然可以说即使有几个线程,它也可能比 R+Hadoop 慢,并在一定数量后完成任务时间。但是如果任务是说矩阵的特征值分解,这样的转换需要在矩阵的元素级别进行大量计算。假设该矩阵的大小是几百万 x 几百万,这种类型的计算肯定会导致任何普通应用程序出现内存错误,因为它会限制它必须暂时保存到 RAM 中的所有数据。这个瓶颈问题有时可能会导致整个系统出现故障,但最简单的情况是内存错误。

使用 R+Hadoop 解决了这样的问题,因为它允许您将相同的策略分布在具有相应内核的多台计算机上。因此,与在同一个应用程序上运行它相比,它可以让您更轻松地处理负载,这样您还可以防止我上面提到的错误。这就是分布式计算的力量。