Hadoop上Kerberos认证过期问题解决

别说谁变了你拦得住时间么 提交于 2020-02-27 23:06:22

前段时间写了一个数据导入工具,数据导入的路径为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小时后,程序仍无异常,问题解决。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!