Spark - 动态分配 - shuffle_1_0_0.index(没有那个文件或目录)

Ste*_*han 5 scala shuffle dynamic-allocation ceph apache-spark

在 Spark 2.2.0 上执行我的 scala 作业时,我不时遇到以下错误:

引起:java.io.FileNotFoundException:/spark/temporary/spark-927d72b5-154d-4fd5-a18e-4aefc0e05a59/executor-cdd8da76-bb86-4e4c-bf26-55acbcc761bf15cbc761bf/spark-927fd5-a18e-4aefc0e05a59 0f/shuffle_1_0_0.index(没有那个文件或目录)

我的 spark-submit 命令如下所示:

/spark/bin/spark-submit --verbose --conf spark.local.dir=/spark/temporary --conf spark.dynamicAllocation.enabled=true --conf spark.shuffle.service.enabled=true --conf spark.dynamicAllocation.executorIdleTimeout=2m --conf spark.shuffle.service.index.cache.entries=4096 --conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=3g --conf spark.executor.extraJavaOptions="-XX:ParallelGCThreads=4 -XX:+UseParallelGC" --conf spark.file.transferTo=false --conf spark.shuffle.file.buffer=5MB --conf spark.shuffle.unsafe.file.output.buffer=5MB --conf spark.unsafe.sorter.spill.reader.buffer.size=1MB --conf spark.io.compression.lz4.blockSize=512KB --conf spark.shuffle.registration.timeout=2m --conf spark.shuffle.registration.maxAttempts=5 --conf spark.memory.useLegacyMode=true --conf spark.shuffle.memoryFraction=0.32 --conf spark.storage.memoryFraction=0.18 --conf spark.shuffle.io.maxRetries=10 --conf spark.dynamicAllocation.maxExecutors=3 --conf spark.dynamicAllocation.initialExecutors=3 --conf spark.task.cpus=2 --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2 --master spark://spark-master.spark:7077 --deploy-mode client --class control.TimeLensDriver --executor-cores 2 --executor-memory 2g --driver-memory 2g /spark/spark-job.jar /spark/s3Credential.conf 2017-09-08 7 /spark/public-holydays.json /spark/school-holydays.json /spark/de_postal_codes.json prometheus-pushgateway.monitoring-mida:9091
Run Code Online (Sandbox Code Playgroud)

我在独立模式下使用 Spark Master 和 3 个工人。在每个工人上,我启动了外部 shuffle 服务。spark 作业从 Ceph S3 读取数据,将它们转换并以 parquet 格式将它们保存回 Ceph S3。上面错误消息中的 shuffle 文件保存在 worker 本身而不是 Ceph S3 中。

这是一种奇怪的行为,因为在 10 次运行中有 7 次它运行良好。但在其他情况下,作业失败并显示上述错误消息。

到目前为止我测试了一些东西:

  • 主机上有足够的磁盘空间和内存
  • spark提交的最小配置(仅激活动态分配,没有优化)将无法正常工作
  • 仅当 Spark 作业针对特定输入数据运行时,运行才会失败。所以错误是可重现的。

我不确定我的spark作业的实现是否有必要解决这个问题,因为在我看来这一定是spark的配置问题。