在EMR SparkException上使用spark 2.4的pyspark:无法广播大于8GB的表

时间:2019-11-19 18:20:41

标签: apache-spark pyspark pyspark-sql

我已经检查了与此错误相关的其他帖子,但发现没有任何作用。

我要做什么:

df = spark.sql("""
SELECT DISTINCT
  action.AccountId
  ...
  ,to_date(date) as Date
FROM sc_raw_report LEFT JOIN adwords_accounts ON action.AccountId=sc_raw_report.customer_id
WHERE date >= to_date(concat_ws('-',2018,1,1))
GROUP BY action.AccountId
  ,Account_Name
  ...
  ,to_date(date)

  ,substring(timestamp,12,2)
""")

df.show(5, False)

,然后是saveAsTable。。尽管如此,它仍返回错误:

  

py4j.protocol.Py4JJavaError:调用o119.showString时发生错误。   :org.apache.spark.SparkException:在awaitResult中抛出异常:   [...]   原因:org.apache.spark.SparkException:无法广播大于8GB的表:13 GB

我尝试过: 'spark.sql.autoBroadcastJoinThreshold': '-1'

但是它什么也没做。

adwords_account表非常小,并且在sc_raw_report上打印df.count()返回:2022197

emr-5.28.0 spark 2.4.4 我的集群核心:15个r4.4xlarge(16个vCore,122个GiB内存,仅EBS存储) 主要:r5a.4xlarge(16个vCore,128个GiB内存,仅EBS存储)

使用配置来提交火花-部署模式集群:

  

-conf spark.hadoop.fs.s3a.impl = org.apache.hadoop.fs.s3a.S3AFileSystem --conf fs.s3a.attempts.maximum = 30 --conf spark.sql.crossJoin.enabled = true --executor-cores 5 --num-executors 5 --conf spark.dynamicAllocation.enabled = false --conf spark.executor.memoryOverhead = 3g --driver-memory 22g --executor-memory 22g --conf spark。 executor.instances = 49 --conf spark.default.parallelism = 490 --conf spark.driver.maxResultSize = 0 --conf spark.sql.broadcastTimeout = 3600

有人知道我可以在这里做什么吗?

编辑:其他信息: 升级到16个实例或r4.8xlarge(32CPU,244RAM)也没有任何作用。

具有步骤的图形,然后在引发广播错误之前进入空闲状态 enter image description here

执行人员在撞车事故发生前几分钟报告: enter image description here

配置:

spark.serializer.objectStreamReset  100
spark.sql.autoBroadcastJoinThreshold    -1
spark.executor.memoryOverhead   3g
spark.driver.maxResultSize  0
spark.shuffle.service.enabled   true
spark.rdd.compress  True
spark.stage.attempt.ignoreOnDecommissionFetchFailure    true
spark.sql.crossJoin.enabled true
hive.metastore.client.factory.class com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory
spark.scheduler.mode    FIFO
spark.driver.memory 22g
spark.executor.instances    5
spark.default.parallelism   490
spark.resourceManager.cleanupExpiredHost    true
spark.executor.id   driver
spark.driver.extraJavaOptions   -Dcom.amazonaws.services.s3.enableV4=true
spark.hadoop.fs.s3.getObject.initialSocketTimeoutMilliseconds   2000
spark.submit.deployMode cluster
spark.sql.broadcastTimeout  3600
spark.master    yarn
spark.sql.parquet.output.committer.class    com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter
spark.ui.filters    org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter
spark.blacklist.decommissioning.timeout 1h
spark.sql.hive.metastore.sharedPrefixes com.amazonaws.services.dynamodbv2
spark.executor.memory   22g
spark.dynamicAllocation.enabled false
spark.sql.catalogImplementation hive
spark.executor.cores    5
spark.decommissioning.timeout.threshold 20
spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem true
spark.hadoop.yarn.timeline-service.enabled  false
spark.yarn.executor.memoryOverheadFactor    0.1875

1 个答案:

答案 0 :(得分:0)

ShuffleMapStage之后,需要将随机播放块的一部分放在broadcasted的{​​{1}}处。 请确保driver(在您的情况下为Driver中的AM)具有足够的内存/开销。

您可以发布YARN运行时配置吗?