Pyspark 作业在读取 AWS EMR 中包含数十亿条记录的镶木地板文件时失败

Pyspark job failing while reading parquet file with billions of records in AWS EMR

我正在尝试使用两个带子句的 spark sql 从配置单元 table 读取两个分区,并在两个分区上使用左外连接来获取增量,两个分区都有 270 亿记录大小为900GB,每个90GB的分区有10个文件。文件格式为 parquet,压缩迅速。

我是 运行 具有 28 个节点的 aws emr r4.16xlarge 集群中的 pyspark 作业。我尝试了各种 spark 配置,但每次作业都因 Job aborted due to stage failure: most recent failure: Lost task java.io.IOException: No space left on device 错误

而失败

我尝试了各种 spark 配置,如果我没记错的话,我猜作业是 运行 out of tmp space in the worker nodes,我尝试设置“spark.sql.shuffle.partitions=3000" 但即便如此,它还是失败了,知道我该如何解决这个问题吗?

到目前为止尝试过的 spark 配置

try:1
    --executor-cores 5 --num-executors 335 --executor-memory 37G --driver-memory 366G

try:2
    '--driver-memory 200G --deploy-mode client --executor-memory 40G --executor-cores 4 ' 
                   '--conf spark.dynamicAllocation.enabled=true ' \
                   '--conf spark.shuffle.service.enabled=true ' \
                   '--conf spark.executor.memoryOverhead=30g '  \
                   '--conf spark.rpc.message.maxSize=1024 '\
                   '--conf spark.sql.shuffle.partitions=3000 ' \
                   '--conf spark.sql.autoBroadcastJoinThreshold=-1 ' \
                   '--conf spark.driver.maxResultSize=4G '\
                   '--conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2' 

try:3
'--driver-memory 200G --deploy-mode client --executor-memory 100G --executor-cores 4 ' \
               '--conf spark.dynamicAllocation.enabled=true ' \
               '--conf spark.shuffle.service.enabled=true ' 

以我有限的spark经验,这个错误的原因可能是临时性不足space。可以尝试修改spark-env.sh配置

export SPARK_WORKER_DIR=dir_have_enough_space
export SPARK_LOCAL_DIRS=dir_have_enough_space

我使用了 this article 中提供的解决方案,但分配 EBS 卷的过程可能因您的引导过程而异