_temporary目录导致加载动态分区报错
在执行Spark任务时发生如下错误:
当Spark的Job提交后,在调用loadDynamicPartitions方法时抛出以上错误。
在Hive中增加日志,检查加载动态分区时所加载的目录信息:
Hive的getPartition方法中增加日志:
发现在解析_temporary目录时,就会抛出之前的异常信息了。
_temporary目录时Spark Write Job写数据时的临时目录,也是用来保证数据提交一致性的一个目录。该目录是在newTaskTempFile方法中,调用FileOutputCommitter的workPath得到的。理论上来说,这个目录在Job提交后(调用commitJob)之后,是会进行清理的,但是因为推测执行的原因,commitJob之后,可能因为某些推测执行的task仍然在运行,这个目录没有被删除掉。
目前的解决方案是在调用loadDynamicPartition方法之前,先判断_temporary是否存在,如果存在,则删除一次。因为这个时候已经commitJob了,所以认为_temporary已经没有用了。增加此逻辑后,对比任务的执行结果,条数一致,认为可行。