【问题标题】:Spark 2.2 fails with more memory or workers, succeeds with very little memory and few workersSpark 2.2 在内存或工作人员较多的情况下失败,在内存和工作人员很少的情况下成功
【发布时间】:2018-11-29 19:30:27
【问题描述】:

我们有一个使用 Scala 编写的 Spark 2.2 作业,在 YARN 集群中运行,它执行以下操作:

  1. 将数千个小型压缩 parquet 文件(每个约 15kb)读取到两个数据帧中
  2. ​将数据框加入一列
  3. Foldleft 覆盖所有列以清理一些数据
  4. 删除重复项
  5. 将结果数据框写入镶木地板

以下配置通过 java.lang.OutOfMemory java 堆空间失败:

  • ​--conf spark.yarn.am.memory=4g
  • --conf spark.executor.memory=20g
  • --conf spark.yarn.executor.memoryOverhead=1g
  • --conf spark.dynamicAllocation.enabled=true
  • --conf spark.shuffle.service.enabled=true
  • --conf spark.dynamicAllocation.maxExecutors=5
  • --conf spark.executor.cores=4
  • --conf spark.network.timeout=2000

但是,如果我们完全删除 spark.executor.memory,这项工作可以可靠地工作。这给了每个执行者 1g 的 ram。

如果我们执行以下任何操作,此作业也会失败:

  • 增加执行者
  • 增加默认并行度或 spark.sql.shuffle.partitions

谁能帮我理解为什么更多的内存和更多的执行程序会由于 OutOfMemory 导致作业失败? ​

​

【问题讨论】:

    标签: scala apache-spark memory hadoop-yarn


    【解决方案1】:

    手动设置这些参数会禁用dynamic allocation。尽量不要管它,因为它推荐给初学者。在您可以在 PROD 设置中微调集群大小之前,它对于实验也很有用。

    在 Spark 上投入更多内存/执行程序似乎是个好主意,但在您的情况下,它可能会导致额外的 shuffle 和/或 HDFS I/O 吞吐量降低。这个article 虽然有点过时并且面向 Cloudera 用户,但解释了如何通过调整执行器大小来调整并行性。

    【讨论】:

    • 动态分配也调整执行器内存?我认为这只是执行程序的数量,每个执行程序都具有配置的内核和内存数量。无论如何,我现在正在运行一个测试,其中有 2 个执行器,每个执行器都有 30gb 的内存,与每个执行器 1gb 的内存相比,它的速度非常慢。这是您提到的吞吐量下降吗?这是怎么回事?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2018-04-03
    • 2013-03-10
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多