hadoop - Spark 执行器在内存不足后挂起

标签 hadoop apache-spark

我有一个运行在EMR上的spark应用程序(16个节点,1个主节点,15个核心,r3.2xlarge实例)。对于Spark执行程序配置,我们使用动态分配。

在将数据加载到RDD时,我看到有时候,当有大量数据(700 Gb)时,Spark会用完内存,但不会使App失败。而是应用程序卡在那里。我不确定为什么会这样,但这是我的理论:-

  • 我们使用可能正在缓存事物的数据帧。
  • Spark 标记spark.dynamicAllocation.cachedExecutorIdleTimeout设置为无穷大

  • 我的理论是,在创建数据帧时可能正在缓存事物,但是永远不会放弃缓存,这会导致Spark挂起。

    有两种解决方案
  • 增加群集大小(更糟的情况)
  • 找出向Spark应用添加超时的方法。
  • 以编程方式取消EMR步骤(找不到执行此操作的API)

  • 关于如何进行的任何线索?

    最佳答案

    可能还有其他两种可能性。分区太大,或者偏斜严重(分区大小变化很大)。

    尝试使用重新分区来增加分区的数量(并因此减小其大小)。这将在您的执行器中随机地重新整理数据(可以很好地减少偏斜,但速度较慢)。理想情况下,我希望我的分区在64Mo左右,具体取决于您的计算机。

    关于hadoop - Spark 执行器在内存不足后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397500/

    相关文章:

    java - 如何在 Hadoop 中使用 CompressionCodec

    hadoop - hadoop 本身是否包含容错故障转移功能?

    java - Spark 1.4.0 计算类路径.sh

    带有 Hadoop HBASE 的 Spring Boot REST

    hadoop - 在 Mapreduce 程序中,我们可以使用数据结构作为值吗?

    hadoop - 由于 UTC 时间, hive 中的日期转换问题

    apache-spark - 如何在 Python 中从 pySpark 添加 SparkListener?

    scala - 激发多个上下文

    java - 在 Spark Streaming Java 中提取嵌套 JSON 值

    java - 为什么使用 Dataset 的 PageRank 作业比 RDD 慢得多?