【问题标题】:spark - application returns different results based on different executor memory?spark - 应用程序根据不同的执行程序内存返回不同的结果?
【发布时间】:2019-01-18 08:02:29
【问题描述】:

我注意到一些特殊的行为,我有 spark 作业,它读取数据并进行一些分组排序和连接并创建一个输出文件。

问题是当我在纱线上运行相同的作业时,其内存超过了环境的内存,例如集群有 50 GB,我提交 spark-submit 时执行器内存接近 60 GB,驱动程序内存为 4 GB。 我的结果减少了,好像其中一个数据分区或任务在处理过程中丢失了。

driver-memory 4g --executor-memory 4g --num-executors 12

我还注意到驱动程序上的警告消息 -

WARN util.Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf. 

但是当我使用有限的执行程序和内存示例 15GB 运行时,它可以工作并且我得到准确的行/数据。没有警告信息。

driver-memory 2g --executor-memory 2g --num-executors 4

我们是否缺少集群上的某些设置或其他任何建议? 请注意我的工作在这两种情况下都成功完成。 我使用的是 Spark 2.2 版。

【问题讨论】:

    标签: apache-spark hadoop-yarn


    【解决方案1】:

    这是没有意义的(除了调试之外)——当涉及到更多的执行者时计划更大,警告是它太大而不能转换成字符串。如果需要,可以将spark.debug.maxToStringFields 设置为更大的数字(如警告消息中所建议的那样)

    【讨论】:

    • 我关心的不是警告信息。问题是数据分区/任务丢失。当我们使用更多内存运行时,我们得到的行数更少,如果我们使用更少的内存执行相同的代码,它就可以正常工作。
    • 我在 spark 2.2 中没有看到这种行为(我确实在 1.x 中看到了具有类似症状的错误 - 这就是添加文件名中的 guid 的原因)但可能是这样当 Yarn 分配额外的执行程序时(因为您尝试拥有超过可用内存),它会以某种方式获取相同的 id 并覆盖现有文件 - 如果这是问题,您应该在第一次运行时看到更少的文件。跨度>
    • 我看到的数据少了几行,我的数据少了几行。
    • 你知道是否有办法检查或验证同一个 id 是否被覆盖?
    • 在这种情况下,您的文件会更少
    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多