Nat*_*ndt 3 amazon-web-services emr hadoop-yarn apache-spark apache-spark-mllib
我正在努力优化 Spark 集群(在 AWS EMR 上运行)的性能,该集群使用 ALS 矩阵分解算法执行协作过滤。我们正在使用相当多的因素和迭代,因此我正在尝试特别优化这些步骤。我试图理解当我有足够的可用内存时为什么要使用磁盘空间。这是可用的总集群内存:
这是剩余磁盘空间(注意磁盘利用率的下降):
我尝试查看 Yarn 管理器,它看起来显示每个节点从属有:110 GB(已用)4 GB(可用)。您还可以查看第一个映像上分配的总容量 (700 GB)。我还尝试更改 ALS 源并强制将 MEMORY_AND_DISKintermediateRDDStorageLevel更改finalRDDStorageLevel为 MEMORY_ONLY,但这不会影响任何内容。
我没有将 RDD 保留在代码中的其他任何位置,因此我不确定此磁盘利用率来自何处。我想更好地利用集群上的资源,有什么想法吗?如何更有效地利用可用内存?
在某些情况下,spark 将使用磁盘使用而不是内存
如果你有随机播放操作。Spark 仅将打乱后的数据写入磁盘,因此如果您进行打乱操作,那么您就不走运了
执行器内存低。如果执行程序内存较低,则 Spark 用于保存数据的内存较少,因此会将数据从内存溢出到磁盘。然而,正如您所建议的,您已经尝试过执行器内存从 20G 到 40G。我建议将执行程序内存保持在 40G 以内,否则 JVM GC 可能会使您的进程变慢。
如果你没有 shuffle 操作,spark.memory.fraction如果你使用的是 Spark 2.2,不妨进行调整
来自文档
spark.memory.fraction( doc ) 将 M 的大小表示为(JVM 堆空间 - 300MB)(默认为 0.6)的一部分。其余空间 (40%) 保留用于用户数据结构、Spark 中的内部元数据,以及在稀疏和异常大的记录情况下防止 OOM 错误。
因此,您可以将 Spark.memory.fraction 设置为 0.9 并查看行为。
MEMORY_ONLY最后,除了存储级别之外,还有其他选项,例如MEMORY_ONLY_SER将序列化数据并存储在内存中。此选项减少了内存使用量,因为序列化对象大小远小于实际对象大小。如果您发现大量溢出,您可以选择此存储级别。| 归档时间: |
|
| 查看次数: |
3779 次 |
| 最近记录: |