我使用的是一台具有 60GB 内存和 32 个核心的机器,在 AWS EC2 上运行 Spark 1.6.1。
我的数据包含大量记录,我想处理具有以下简单模式的 DataFrame,并且它有 1,000,000,000(十亿)条记录:
userID: Long
phrase: String
timestamp: Timestamp
我正在执行一些昂贵的操作链,例如 groupBy、排序、过滤...等。
这些操作会导致大量的随机写入和读取,并且缓存 DataFrame 或重新分区并没有多大帮助。
我发现很难理解为什么会发生这种情况,因为我知道机器能够将完整的数据加载到内存中。
当我单击 Spark UI 上的执行程序选项卡时,我会看到以下内容:
这是当我使用一台功能强大的机器时看到的正常 View ,还是我错过配置 Spark 集群的情况?
对于 EC2 上 Spark 的最佳配置有什么建议吗?
谢谢
最佳答案
如果这听起来有点居高临下,我很抱歉,但是适合内存的数据负载几乎不是一个巨大的数据集。我这么说的原因是 Spark 不是为小数据负载而构建的,您需要支付 Spark 内置的开销,以使其能够处理大型数据集和分布式环境。例如group by 通常意味着数据需要传送到远程计算机,因此 shuffle 阶段会组织数据以进行传送,然后由处理 shuffle 后分区的远程计算机读取。在您的情况下,您会看到所有这一切都发生在一台机器上。
由于所有内容都适合一台机器,您可能需要检查替代解决方案 - 阅读 this例如
也就是说,您似乎没有利用机器上的所有内存(机器上的内存存储为 20G 与 60G)。由于您似乎在本地模式下运行 Spark,因此将驱动程序内存设置为更高的值(--driver-memory 56G
或类似的值),并确保使用 local[32]
这样你就可以让所有核心运行起来
关于apache-spark - SPARK : one powerful machine Vs. 几台较小的机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012818/