问题描述
我的mesos-spark群集:
每次连接后我尝试执行.count()时执行器都崩溃了,没有连接的计数效果很好,不知道为什么,但是在失败的查询中我看到了
在执行程序日志中:
我看不到OOM的特定问题,这是怎么回事?似乎只有在建立连接时才会发生。
按照@busfighter的建议进行操作,并在加入和使用coalesce()减少分区之前,将数据帧设置为StorageLevel.MEMORY_ONLY。 还是一样的错误。
编辑1
尝试所有评论,一无所有:
- 保存数据
- 重新分区为12个分区(以前是200个分区),要补充一点的是,在检查spark / jobs Web UI之后,执行者永远不会被我的集群上的Spark(Mesos)特别删除
- 将值spark.sql.autobroadcastJoinThreshold更改为默认值小20个
编辑2
在任何时候,当任务失败时,执行器都将被删除,它们只是在随机播放上超时:
编辑3
看到数据崩溃时,它的数据量确实很小,感觉丢失了,并且由于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正在侦听本地主机,因此其他执行程序无法连接:
解决方法
请尝试以下操作:
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)
值取决于群集