Spark集群作业报错:Parquet文件part-00005不存在求助
在10节点Spark+Hadoop集群(版本2.4.4,集群模式)中重复执行作业均失败,抛出SparkException,提示Parquet文件的part-00005分片不存在。作业核心流程为:从HDFS读取文件转换为DataSet,写入HDFS为Parquet文件,随后读取该文件执行聚合操作。
作业代码
System.out.println("Creating parquet file from the created RDD..."); Dataset<Row> testDF = spark.createDataFrame(testRDD, Test.class); System.out.println("Writing to parquet file..."); testDF.write().mode(SaveMode.Overwrite).parquet(inputFile + ".parquet"); System.out.println("Loading parquet file to a Java Dataset..."); Dataset<Row> parquetFileDF = spark.read().parquet(inputFile + ".parquet"); parquetFileDF.createOrReplaceTempView("Test"); Dataset<Row> df1 = spark.sql(query);
报错详情
Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 3 in stage 2.0 failed 4 times, most recent failure: Lost task 3.3 in stage 2.0 (TID 44, 172.0.0.0, executor 4): java.io.FileNotFoundException: File file:/home/user/spark-2.4.4-bin-hadoop2.7/work/driver-20230223072100-0000/CP712292-202302171800-23.0.0.0-312-1676688839-filter.parquet/part-00005-dd53c462-fc3b-4c76-b4b4-42afd8aedcca-c000.snappy.parquet does not exist
排查方向
路径配置错误:本地路径替代HDFS路径
报错路径为file:/home/user/...,属于本地文件系统路径,但集群模式下作业应读写HDFS。检查inputFile变量值,确认是否为HDFS完整路径(如hdfs://namenode:9000/xxx/xxx)。集群中driver与executor本地文件系统隔离,若写入本地路径,仅执行写入任务的executor本地有文件,其他节点无法访问,导致读取失败。写入未完成即触发读取
Spark写入Parquet的操作虽为action,但可能存在元数据未及时同步的情况。可在写入后调用spark.catalog.refreshByPath(inputFile + ".parquet"),强制刷新路径元数据,确保读取时能获取完整的文件列表。文件权限问题
登录集群执行hdfs dfs -ls <parquet完整路径>,确认part-00005分片是否存在,同时检查目录及文件的权限设置,确保executor运行用户具备读取权限。权限不足时,也可能触发文件不存在的报错。元数据缓存干扰
读取Parquet前,添加配置禁用元数据缓存:Dataset<Row> parquetFileDF = spark.read() .option("spark.sql.parquet.cacheMetadata", "false") .parquet(inputFile + ".parquet");强制Spark重新扫描目标目录,获取最新的文件信息。
节点磁盘异常
检查报错中提到的executor节点(172.0.0.0,executor4)的磁盘状态,确认是否存在磁盘空间不足、文件系统损坏或临时文件被清理的情况。若写入时误使用本地路径,该节点的磁盘问题可能导致分片文件丢失。
内容的提问来源于stack exchange,提问作者Arjun

