总结:代码bug导致,修改源码重新编译
解决方法
注意:使用UserGroupInformation.getCurrentUser().hasKerberosCredentials()判断认证是否过期无效
一 只解决worker节点
定位 org.apache.dolphinscheduler.common.utils.HadoopUtils#copyHdfsToLocal
//在使用fs前添加判断是否Kerberos过期
try {
this.fs.getFileStatus(new Path("/"));
} catch (IOException e) {
logger.warn("当前进程号:" + Thread.currentThread().getId() + "\t测试获取hdfs文件信息失败,更新fs");
this.fs = getInstance().fs;
}//源码未改动 定位用
return FileUtil.copy(fs, srcPath, dstPath, deleteSource, fs.getConf());
二 解决所有
org.apache.dolphinscheduler.common.config.StoreConfiguration修改HDFS的对象
@Bean
public StorageOperate storageOperate() {
switch (PropertyUtils.getString(RESOURCE_STORAGE_TYPE)) {
case STORAGE_S3:
return S3Utils.getInstance();
case STORAGE_HDFS:
HadoopUtils hadoopUtils = HadoopUtils.getInstance();
hadoopUtils.instanceMonitor();
return hadoopUtils;
default:
return null;
}
}
org.apache.dolphinscheduler.common.utils.HadoopUtils添加方法instanceMonitor
public void instanceMonitor() {
logger.warn("创建HadoopUtils实例监控线程...");
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
try {
this.fs.getFileStatus(new Path("/"));
} catch (IOException e) {
logger.warn("当前进程号:" + Thread.currentThread().getId() + "\t测试获取hdfs文件信息失败,更新fs");
this.fs = getInstance().fs;
}
}, 3, 1 * 60, TimeUnit.SECONDS);
}
只对Bean中的fs定时更新,其他的都是调用getInstance,会自动更新,重新编译后复制到不同模块的lib目录下
问题描述
DolphinScheduler周期性的报错
GSS initiate failed
Caused by: org.ietf.jgss.GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
执行spark2任务报错,执行shell的spark-submit正常,操作资源管理正常
解决过程
1.下载,搭建DolphinScheduler源码(参见官网)
2.idea远程调试,修改worker-server/bin/start.sh
JAVA_OPTS=后面中添加
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006
3.idea以debug模式启动,模块选择worker-server
问题原因
HadoopUtils的内部虽然有LoadingCache会定时更新,但是fs对象所属的HadoopUtils的实例对象没有定时更新,导致fs一直没有更新,只有每次通过getInstance()获取的才能更新
debug时,alt+u执行fs=getInstance().fs后报错消失