前段时间写了一个数据导入工具,数据导入的路径为Hadoop-->公司自研的时序数据库。运行一段时间后发现出现Kerberos认证过期的问题。日志如下:
一开始很奇怪,因为额外开了一个线程,每隔8小时更新Kerberos认证,照理说不该出现这个问题。看直接报错,显示是找不到Kerberos票据,更是一头雾水。
直到看到红框框住的这句话,知道问题所在了。代码中有个逻辑为忽略大小为0的文件,是这样写的:
val hadoopConf:Configuration = new Configuration()
hadoopConf.addResource( new Path("core-site.xml"))
hadoopConf.addResource( new Path("hdfs-site.xml"))
hadoopConf.addResource( new Path("hive-site.xml"))
hadoopConf.addResource( new Path("yarn-site.xml"))
val path = new Path("hdfs://hacluster/user/oper/private/123")
val hdfs = FileSystem.get(hadoopConf)
val status = hdfs.listStatus(path)
status.foreach(
file=>{
val filePath = file.getPath().toString;
val fileSize = hdfs.getContentSummary(file.getPath()).getLength()
if (fileSize > 0 ) {
//逻辑代码
} else {
logger.info("path:{}, fileSize = {}.",filePath,fileSize)
}
}
)
这个情况应该是hdfs对象的Kerberos认证过期了,Kerberos认证更新的代码对这个对象不起作用。认清问题后,就知道如何解决这个问题了,不需要边迭代,边判断大小,可以提前过滤掉这些文件。代码如下:
val hadoopConf:Configuration = new Configuration()
hadoopConf.addResource( new Path("core-site.xml"))
hadoopConf.addResource( new Path("hdfs-site.xml"))
hadoopConf.addResource( new Path("hive-site.xml"))
hadoopConf.addResource( new Path("yarn-site.xml"))
val path = new Path("hdfs://hacluster/user/oper/private/123")
val hdfs = FileSystem.get(hadoopConf)
val status = hdfs.listStatus(path).filter(file=>(hdfs.getContentSummary(file.getPath()).getLength())>0).map(p=>p.getPath.toString)
hdfs.close()
FileSystem.closeAll()
status.foreach(
file=>{
//逻辑代码
}
)
重新打包程序,上传并运行。36小时后,程序仍无异常,问题解决。
来源:oschina
链接:https://my.oschina.net/k8king/blog/3163768