Spark报错:Job aborted/package$TreeNodeException: execute, tree/Input path does not exist

今天调用spark任务报错。错误日志如下

先是看到一个package$TreeNodeException: execute, tree:,但这还不是真正的错误,继续往下看

ERROR [2023-07-04 16:41:33,159] ({main} Logging.scala[logError]:91) - Aborting job e3a9b541-7558-4388-88ef-7130a7e9f96c.
org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
Exchange hashpartitioning(mobile#349, 200)
+- *(1) Filter (isnotnull(is_cancel#350) && isnotnull(mobile#349))
   +- Scan hive dm.dm_cdp_cancel_user [mobile#349, is_cancel#350], HiveTableRelation `dm`.`dm_cdp_cancel_user`, org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe, [clues_id#348, mobile#349, is_cancel#350, dw_insert_dt#351, dw_update_dt#352, job_nm#353, batch_time#354], [dt#355]

	at org.apache.spark.sql.catalyst.errors.package$.attachTree(package.scala:56)

又看到了一个Job aborted,但仍未定位到具体原因

ERROR [2023-07-04 16:41:33,176] ({main} AbstractOfflineWorker.java[work]:144) - tag计算失败败,原因:Job aborted.
 WARN [2023-07-04 16:41:33,356] ({main} JdbcUtils.java[update]:342) - update sql:update om_tag set last_update_dt = ? where id = ?, params:[Tue Jul 04 16:41:33 GMT+08:00 2023, 815]
 WARN [2023-07-04 16:41:33,375] ({main} JdbcUtils.java[update]:342) - update sql:update om_tag set calculate_status=? where id=?, params:[3, 815]
 WARN [2023-07-04 16:41:33,394] ({main} JdbcUtils.java[update]:342) - update sql:update om_tag_exec set exec_status=?,exec_error_message=?,exec_error_code=? where id=? , params:[301, calculate error reason:Job aborted., RUNTIME_UNKNOWN_ERROR, 335307]
org.apache.spark.SparkException: Job aborted.

最后再看到一个报错,是输入的路径不存在

Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://master:8020/user/hive/warehouse/dm.db/dm_cdp_cancel_user/dt=2023-04-02
	at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:287)
	at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229)
	at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315)
	at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:204)

问题排查

报错的表是一个分区表,但是该表的存储策略是每个分区存储全量数据,且分区只保留最近1天的,因此在hive端,分区只有1个,上图报错的分区,是很久之前已经被干掉了分区。因此问题定位到是spark读取hive文件时,仍读取到hive已删除的分区信息,故导致程序报错。
根本原因在于:在drop partition时可能存在删除了hive的分区文件, 但是hive的分区未删除, 导致spark报错。

解决方案

1.先看hive的分区信息
show partitions 表名,查看hive的分区

2.用shell脚本查看分区文件
hadoop fs -ls ${cdp_namenode_address}/user/hive/warehouse/dm.db/dm_cdp_cancel_user

3.做比较,将不一致的地方的分区信息删除(已经被删除的文件对应的分区)
alter table t_name drop partition (dt <= XXX);

重新运行程序,成功!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值