问题:
最近CDH集群增加了kerberos认证,发现了JavaWeb应用启动后,超过24小时后,kerberos凭证过期导致查询Hbase失败的问题。
Spark程序连接CDH时,通过principal和keytab配置方式,内部会将凭证到hdfs上,供Executor和Driver使用。当凭证Ticket快要失效时,会通过Keytab重新生成凭证。
spark2-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 3 \
--driver-memory 4g \
--executor-memory 4g \
--executor-cores 2 \
--conf spark.default.parallelism=10 \
--conf spark.shuffle.file.buffe=1024k \
--conf spark.executor.memoryOverhead=4096 \
--class com.hypers.streaming.PanoramaMain \
--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails" \
--principal xxxx \
--keytab xxxx.keytab \
xxxx.jar
但我们自己开发的JavaWeb服务没有该机制,导致Ticket在程序运行时过期失效,最终查询Hbase时提示没有有效凭证,查询失败。
源码调试:
本地调试源码验证后,发现确实是因为Ticket的到期时间每次启动时候都会指定成一个固定的时间,后续也没有进行更新,最终过期导致应用查询Hbase失败。
重新编译了源码,增加了Ticket凭证相关的日志,最终确认了问题就是Ticket没有更新到期有效时间,导致认证过期。打印的日志如下:
checkTGTAndReloginFromKeytab! shouldRenewImmediatelyForTests:false, Time.now():1606492834061, getRefreshTime(tgt):1606526141000, tgt:Ticket (hex) =
0000: 61 82 01 40 30 82 01 3C A0 03 02 01 05 A1 0D 1B a..@0..<........>
0010: 0B 45