Pyspark,执行者在执行连接时失去连接

Posted

技术标签:

【中文标题】Pyspark,执行者在执行连接时失去连接【英文标题】:Pyspark, executors lost connectivity when performing a join 【发布时间】:2020-10-08 14:44:33 【问题描述】:

我的 mesos-spark 集群:

每次我在加入后尝试执行 .count() 时,执行程序都会崩溃,没有加入的计数工作正常,不知道为什么,但在失败的查询中我看到:

在执行者日志中:

我没有看到具体的 OOM 问题,这是怎么回事?似乎只有在加入时才会发生。

遵循@busfighter 的建议,在加入之前将数据帧设置为 StorageLevel.MEMORY_ONLY,并使用 coalesce() 减少分区。 还是一样的错误。

编辑 1

尝试了所有的cmets,没有:

    将数据保存到内存中 重新分区为 12 个分区(原为 200),补充一点,在检查 spark/jobs Web UI 后,我的集群上的 Spark(Mesos) 永远不会专门删除执行程序 将 spark.sql.autoBroadcastJoinThreshold 值更改为默认值小 20

编辑 2

在任何时候,当任务失败时,执行者都会被移除,他们只是在随机播放时超时:

编辑 3

看到崩溃的时候数据量真的很小,感觉迷茫,找不到executor日志看看是不是因为OOM而被杀死:

编辑 4

一些重要说明:

只有 1 个从属设备工作正常(需要更多时间),但不会崩溃,我认为这不是 OOM 问题。 代码的其他部分,不涉及连接数据(仅读取和转换工作即可)

PySpark 上使用的配置

conf = (SparkConf()
        .setAppName('daily_etl')
        .setMaster(XXXXX)
        .set("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.11:2.4.1")
        .set('spark.mesos.executor.home','/opt/spark')
        )

spark = SparkSession.builder\
    .config(conf=conf) \
    .getOrCreate()

编辑 5

错误截图:

编辑 6

添加 Mesos UI 的屏幕截图

编辑 7

设法缩小问题范围,由于某种原因 BlockManager 正在侦听 localhost,因此其他执行程序无法连接:

不知道为什么,但会创建另一个主题。

【问题讨论】:

我猜问题出在您的存储级别和分区上。当您进行连接时,它开始洗牌,如果存储级别不是 memory_only,它会尝试读取不适合内存的分区。您可以尝试将存储级别设置为 MEMORY_ONLY 并将您的框架重新分区到更小的分区。 @busfighter 感谢您的回复!有没有办法在日志中找到这个?我很震惊,有这么多小数据会发生这种情况(集群中只有 20 千兆的数据不到 1 千兆) 检查这个spark.sql.autoBroadcastJoinThresholdspark.apache.org/docs/latest/sql-performance-tuning.html 你能添加你的代码吗? @JohnDoe 发布了我用于提交的配置,感谢您的帮助 【参考方案1】:

请试试这个:

conf = (SparkConf()
        .setAppName('daily_etl')
        .setMaster(XXXXX)
        .set("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.11:2.4.1")
        .set("spark.mesos.executor.home","/opt/spark")
        .set("spark.driver.memory", "16G")
        .set("spark.executor.memory","8G")
        .set("spark.sql.autoBroadcastJoinThreshold", "-1")
        )

也可以重新分区

df = df.repartition(2000)

值取决于集群

【讨论】:

您好,这不起作用。我的执行者有每个 4G Ram,我不能设置这么多,我的驱动程序 1。我认为这不是容量问题,因为它适用于单个从站。最后一个“集合”中还有一个小的语法错误,键和值缺少“。无论如何感谢您的帮助,但问题仍然存在。 您的执行人failed to connect to..似乎有连接问题。你能用另一个脚本测试它是否真的在执行器上执行吗?您是否有权访问 Mesos-UI 来监控您的集群? 感谢您的帮助!我正在考虑运行一个非常简单的 pypspark 脚本来强制我的奴隶之间进行合作,但我不知道该怎么做!是的,我有一个 Mesos 用户界面,所有从站都正确连接到主站(它们显示在从站选项卡上),但我认为问题在于它们之间的对话,请参见最后的屏幕截图! 我不熟悉 Mesos(使用 Yarn),但请查看:hub.packtpub.com/how-to-run-spark-in-mesos 集群模式

以上是关于Pyspark,执行者在执行连接时失去连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hive 仓库连接器在 pyspark 中执行 HQL 文件

如何对 pyspark 数据框执行连接操作?

执行连接在多个按键pyspark只有非重复相同的列名

如何与前一组(月)的同一行执行自连接以在 Pyspark 中引入其他列

我们如何使用 jdbc 执行连接查询,而不是使用 pyspark 获取多个表

如何避免pyspark中加入操作中的过度洗牌?