Apache spark 在saveAsNewApihadoopFile过程中,由于超出内存限制,纱线会杀死执行器

Apache spark 在saveAsNewApihadoopFile过程中,由于超出内存限制,纱线会杀死执行器,apache-spark,Apache Spark,我目前正在尝试从Spark将数据批量加载到HBase中,主要使用以下示例: 然而,我在开始时对数据的聚合要复杂一些 源文件是大约40GB的AVRO记录,具有相当数量(可能为空)的字段(>200)。我的整个过程都在进行中,但在saveasnewapiHadoop过程中,由于超过内存限制,文件容器开始被杀死。我尝试了更多的分区(最多4000个),但仍然有容器失败,当我给执行器更多内存(每个4 GB)时也会发生同样的情况。而且我得到了非常高的GC时间,这反过来又使整个过程非常缓慢 以下是一些问题:

我目前正在尝试从Spark将数据批量加载到HBase中,主要使用以下示例:

然而,我在开始时对数据的聚合要复杂一些

源文件是大约40GB的AVRO记录,具有相当数量(可能为空)的字段(>200)。我的整个过程都在进行中,但在saveasnewapiHadoop过程中,由于超过内存限制,文件容器开始被杀死。我尝试了更多的分区(最多4000个),但仍然有容器失败,当我给执行器更多内存(每个4 GB)时也会发生同样的情况。而且我得到了非常高的GC时间,这反过来又使整个过程非常缓慢

以下是一些问题:

有人知道我如何进一步了解这份工作,以确切了解执行人需要如此多内存的原因吗?或者我能做些什么来缓解它

我是否需要在调用saveAsNewApihadoopFile之前先执行一个操作,以缩小问题范围并避免不必要的数据重新分布(我的工作流程的一部分是重分区和或重分区)


谢谢

首先,您可以尝试调整
spark.warn.executor.memoryOverhead
和“内存分数”相关设置

关于评测,有几个选项取决于您与实际节点及其JVM和日志的接近程度:

  • 如果可能的话,尝试在executors JVM上启用JMX,并使用VisualVM之类的工具连接到其中任何一个,以便能够查看实际的统计数据
  • 在访问受限的情况下,您可以从executor JVM执行或请求内存转储
  • 最后一种方法-通过
    spark.executor.extraJavaOptions启用内存评测,并使用下一个选项进行调整(检查它们是否适合您选择的GC):
-XX:+UnlockDiagnosticVMOptions-XX:+PrintGCDetails-XX:+PrintFlagsFinal-XX:+PrintReferenceGC-XX:+PrintGCTimeStamps-XX:+PrintAdaptiveSizePolicy-XX:+G1SummaryEconMark
因此,您将能够在executor日志中获得诊断输出