Spark Sql 分区损坏的问题解决

Spark查询分区表

spark-sql -e

"SELECT
 *
FROM
    td_fixed_http_flow
WHERE
    dt = '2018-12-02'
AND HOUR = '16' ;"

出现异常:
Caused by: java.io.FileNotFoundException: File hdfs://rzx121:8020/apps/hive/warehouse/td_fixed_http_flow/dt=2018-11-17/hour=17 does not exist.
    at org.apache.hadoop.hdfs.DistributedFileSystem$DirListingIterator.(DistributedFileSystem.java:1081)
    at org.apache.hadoop.hdfs.DistributedFileSystem$DirListingIterator.(DistributedFileSystem.java:1059)
    at org.apache.hadoop.hdfs.DistributedFileSystem$23.doCall(DistributedFileSystem.java:1004)
    at org.apache.hadoop.hdfs.DistributedFileSystem$23.doCall(DistributedFileSystem.java:1000)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.listLocatedStatus(DistributedFileSystem.java:1018)
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1736)
    at org.apache.hadoop.hive.shims.Hadoop23Shims.listLocatedStatus(Hadoop23Shims.java:668)
    at org.apache.hadoop.hive.ql.io.AcidUtils.getAcidState(AcidUtils.java:389)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.callInternal(OrcInputFormat.java:672)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.access$600(OrcInputFormat.java:640)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator$1.run(OrcInputFormat.java:662)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator$1.run(OrcInputFormat.java:659)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.call(OrcInputFormat.java:659)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.call(OrcInputFormat.java:640)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

问题原因:定期清除hdfs历史数据,执行过 hadoop fs -rmr /apps/hive/warehouse/td_fixed_http_flow_hour/dt=2018-11-17/hour=17

这个问题在执行hive sql的时候不会出现问题

hive -e 

"SELECT
 *
FROM
    td_fixed_http_flow
WHERE
    dt = '2018-12-02'
AND HOUR = '16' ;"

发现没有报错,hive不会去查找分区中hdfs不存在的目录

那为什么spark sql会报错呢?

问题的根源在于Spark加载hive分区表数据会根据show partitions中的分区去加载,发现目录缺失就会出错了。

解决办法:

1、损坏分区数据不参与计算(hive采用这种方式解决)

在Spark程序中设置

spark.sql.hive.verifyPartitionPath=true;

表示忽略这个损坏的分区数据、

或者在

spark-default.conf

spark.sql.hive.verifyPartitionPath=true;中设置

2、重新建分区overwrite或者drop分区,下面提供drop分区的方式

alter table td_fixed_http_flow_hour  drop partition (dt='2018-11-17',hour='17);

 

 

 

 

你可能感兴趣的:(云计算)