apache-spark - SPARK : one powerful machine Vs. 几台较小的机器

标签 apache-spark amazon-ec2 apache-spark-sql

我使用的是一台具有 60GB 内存和 32 个核心的机器,在 AWS EC2 上运行 Spark 1.6.1。

我的数据包含大量记录,我想处理具有以下简单模式的 DataFrame,并且它有 1,000,000,000(十亿)条记录:

userID: Long
phrase: String
timestamp: Timestamp

我正在执行一些昂贵的操作链,例如 groupBy、排序、过滤...等。

这些操作会导致大量的随机写入和读取,并且缓存 DataFrame 或重新分区并没有多大帮助。

我发现很难理解为什么会发生这种情况,因为我知道机器能够将完整的数据加载到内存中。

当我单击 Spark UI 上的执行程序选项卡时,我会看到以下内容:

enter image description here

这是当我使用一台功能强大的机器时看到的正常 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/

相关文章:

Java Spark 和 cassandra 连接中的 java.lang.AbstractMethodError

apache-spark - 在 Spark 2.1.0 中启用 _metadata 文件

amazon-web-services - 检索通过 CFT 创建的 EC2 托管 Apache 应用程序的 IP 地址和端口号

amazon-web-services - 现有 key 对不在 AWS Cloudflormation 中

scala - 使用具有常量值的 var 在 Spark DataFrame 中创建新列

apache-spark - 为 spark thrift 服务器提供仓库目录的路径

scala - Spark Scala 代码性能调整内存开销错误

ec2 上的 R 程序似乎很慢?

apache-spark - 在 PySpark 数据帧上使用 groupBy 计算百分位数

scala - 如何根据条件(组中的值)更新列?