HDFS_DELEGATION_TOKEN 还原及解决方案

article/2025/8/23 5:48:52

HDFS_DELEGATION_TOKEN 这个BUG在很多文章中都出现着,讲了很多原理,但是只给出了官方引用地扯,完全没有给出如何解决,我们线上的业务就有着这样的问题,7天一到马上出现这问题了,官方明明说这个bug修复了呀,因为我们使用的版本是比较新的,理论上不会有这样的问题才对,可是偏偏就有了,没办法,只能硬上了,花了两天的时间找到了解决这个问题的办法,下面会还原这个错误及给出解决方案。

版本列表

HDP

测试用例配置

添加 hdfs-site.xml 配置

dfs.namenode.delegation.key.update-interval=60000 #1分钟
dfs.namenode.delegation.token.max-lifetime=180000 #3分钟
dfs.namenode.delegation.token.renew-interval=60000 #1分钟

修改 /etc/krb5.conf ticket过期为1小时

...
ticket_lifetime = 1h
...

代码内有kerberos认证

class App {System.setProperty("java.security.krb5.conf", "/etc/krb5.conf")System.setProperty("sun.security.krb5.debug", "false")val hConf = new ConfigurationhConf.addResource("hbase-site.xml")UserGroupInformation.setConfiguration(hConf)UserGroupInformation.loginUserFromKeytab("hbase-bd@EXAMPLE.COM", "/etc/security/keytabs/hbase.headless.keytab")val sparkConf = new SparkConf()//      .setMaster("local[12]").setAppName("HDFS_DELEGATION_TOKEN")val spark = SparkSession.builder.config(sparkConf).getOrCreate()hConf.set("hbase.mapreduce.inputtable", "test_log")def run(args: Array[String]): Unit = {val sc = spark.sparkContextimport spark.implicits._val userRDD: RDD[Log] = sc.newAPIHadoopRDD(hConf,classOf[TableInputFormat],classOf[ImmutableBytesWritable],classOf[Result]).flatMap {rdd => {val map = HbaseUtil.result2Map(rdd._2)val log = Log(map.get("uid"))Array(log)}}userRDD.toDS().cache().createTempView("log")spark.sql("""select * from log""".stripMargin).show(false)spark.catalog.dropTempView("log")userRDD.unpersist()}
}
case class Log(uid: String)
object App {def main(args: Array[String]): Unit = {val app = new App()while (true) {app.run(args)TimeUnit.MINUTES.sleep(3)}}
}

测试百度跟谷歌中最最最多出现的解决方案

 --conf spark.hadoop.fs.hdfs.impl.disable.cache=true--conf mapreduce.job.complete.cancel.delegation.tokens=false
  1. 测试提交
spark-submit --master yarn \--class com.dounine.hbase.App \--executor-memory 1g \--driver-memory 1g \--keytab /etc/security/keytabs/hbase.headless.keytab \--principal hbase-bd@EXAMPLE.COM \build/libs/hdfs-token-1.0.0-SNAPSHOT-all.jar
  1. 测试提交
...--conf spark.hadoop.fs.hdfs.impl.disable.cache=true \--conf mapreduce.job.complete.cancel.delegation.tokens=false \
...
  1. 测试提交
...--conf mapreduce.job.complete.cancel.delegation.tokens=false \
...
  1. 测试提交
...--conf spark.hadoop.fs.hdfs.impl.disable.cache=true \
...

1,2,3,4 测试结果
时间观察3分钟 => 正常
时间观察10分钟 => 正常
时间观察30分钟 => 正常
时间观察60分钟 => 正常
时间观察120分钟 => 正常
测试结论 => 与1、2、3、4 --conf 配置无关

好吧,我已经怀疑人生、可能是我打开的方式不对

继续测试

将认证代码放入run方法内

def run(args: Array[String]): Unit = {System.setProperty("java.security.krb5.conf", "/etc/krb5.conf")System.setProperty("sun.security.krb5.debug", "false")val hConf = new ConfigurationhConf.addResource("hbase-site.xml")UserGroupInformation.setConfiguration(hConf)UserGroupInformation.loginUserFromKeytab("hbase-bd@EXAMPLE.COM", "/etc/security/keytabs/hbase.headless.keytab")val sparkConf = new SparkConf()//      .setMaster("local[12]").setAppName("HDFS_DELEGATION_TOKEN")val spark = SparkSession.builder.config(sparkConf).getOrCreate()hConf.set("hbase.mapreduce.inputtable", "test_log")
....

时间观察3分钟 => 正常
时间观察6分钟 => 异常

18/12/29 16:50:31 ERROR AsyncEventQueue: Listener EventLoggingListener threw an exception
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.token.SecretManager$InvalidToken): token (token for hbase: HDFS_DELEGATION_TOKEN owner
=hbase-bd@EXAMPLE.COM, renewer=yarn, realUser=, issueDate=1546072104965, maxDate=1546072704965, sequenceNumber=15985, masterKeyId=748) is expired, curr
ent time: 2018-12-29 16:32:29,829+0800 expected renewal time: 2018-12-29 16:31:24,965+0800at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1497)at org.apache.hadoop.ipc.Client.call(Client.java:1443)at org.apache.hadoop.ipc.Client.call(Client.java:1353)at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)at com.sun.proxy.$Proxy11.fsync(Unknown Source)at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.fsync(ClientNamenodeProtocolTranslatorPB.java:980)at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:422)at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:165)at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:157)at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:359)at com.sun.proxy.$Proxy12.fsync(Unknown Source)
...

问题发现

通过几十遍不断的调整位置、最终确认的问题所在

UserGroupInformation.setConfiguration(hConf)
UserGroupInformation.loginUserFromKeytab("hbase-bd@EXAMPLE.COM", "/etc/security/keytabs/hbase.headless.keytab")

是由于以上两句kerberos认证代码导致的结果
跟下面的配置冲突了

--principal $principal --keytab $keytab

解决方案

删除掉代码中的这两句认证即可,使用--principal $principal --keytab $keytab

UserGroupInformation.setConfiguration(hConf)
UserGroupInformation.loginUserFromKeytab("hbase-bd@EXAMPLE.COM", "/etc/security/keytabs/hbase.headless.keytab")

开发环境,可以加一个判断使用以上两句代码,简单粗暴


http://chatgpt.dhexx.cn/article/TB1ii95x.shtml

相关文章

指定IPv6服务器位置,思科IPv6技术,用prefix delegation获得ipv6地址

目录 DHCP PD是DHCPv6的扩展技术,该技术用于以下场景:位于ISP内的DHCP服务器给客户内的子网自动化的分配前缀,如下图所示,DHCP服务器可以给CPE(customer premises equipment )广播网段分配前缀,当然还缺少一个接口ID来组成完整的IPv6地址,该接口ID可以手工指定 如图所示,…

【hadoop】一文讲透hdfs的delegation token

1.概述 转载并且补充:一文讲透hdfs的delegation token 最近我也在研究这个,学习一下。 1.1 起因 我最近在做FLink kerberos认证。我在flink配置文件中配置正确的认证方式,然后我都是RichSinkFunction 我在RichSinkFunction中构建了new Kaf…

Hadoop授权令牌解释(原标题 Hadoop Delegation Tokens Explained)

转载:https://blog.cloudera.com/hadoop-delegation-tokens-explained/ 很好的文章,但是要翻墙转载给国内的伙伴,有问题请联系删除 第一部分谷歌翻译版;下边有英语版 Apache Hadoop的安全性是在2009年左右设计和实施的&#xf…

委派模式 Delegation

委派模式不属于23种设计模式,但在Spring种又是很常用的一种设计模式,比如DispatcherServlet 就使用了委派设计模式。 什么是委派模式 顾名思义,委派模式含有委派类和被委派类。委派类负责任务的调度和任务分配,将任务分配给被委派…

C++面向对象(四)Inheritance, Composition, Delegation

C面向对象(四)Composition, Delegation, Inheritance 一、Composition(复合)- 关系表示为:has-a- 其构造和析构的关系 二、Delegation(委托)- 其关系表示为:composition by reference 三、Inheritance(继承)- 其表示关系为&#x…

Active Directory 03 - Delegation(委派),MS-SFU 规范以及 Protocol Transition

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…

ichunqiu云境 - Delegation Writeup

0x1 Info 靶场地址:https://yunjing.ichunqiu.com/ranking/summary?idBzMFNFpvUDU 0x2 Recon Target external IP 39.98.34.149 Nmap results 关注80端口的http服务,目录爆破(省略)找到 /admin 使用弱口令登录进入后台&am…

Spark与hdfs delegation token过期的排查思路总结

背景 hadoop delegation token的问题相对比较混乱和复杂,简单说下这东西的出现背景,最早的hadoop的因没有的完善的安全机制(安全机制主要包括:认证 鉴权,hadoop这里主要是身份认证机制没有),所…

Hadoop Delegation Tokens详解

转载自:《Hadoop Delegation Tokens详解》 https://www.jianshu.com/p/617fa722e057 本文是cloudera公司的一篇技术博客,原文地址:Hadoop Delegation Tokens Explained 译文 Hadoop Security在2009年被设计并实现,此后趋于稳定…

delegation java_SQL Server配置delegation实现double-hop

参考文献 前言 在上一篇博客SQL Kerberos的原理及实验中讲到了windows验证的两种模式分别是NTLM和Kerberos,那么他们有何区别,在功能上又有何不同。 NTLM是一种比较简单的方法,能够在大部分情况下完成任务。但是它只能完成单跃点认证(只有一个…

一文讲透hdfs的delegation token

【背景】 前一段时间总结了hadoop中的token认证、yarn任务运行中的token,其中也都提到了delegation token。而最近也遇到了一个问题,问题现象是:flink任务运行超过七天后,由于宿主机异常导致任务失败,继而触发任务的重…

hdfs delegation token 过期问题分析

什么是delegation token delegation token其实就是hadoop里一种轻量级认证方法,作为kerberos认证的一种补充。理论上只使用kerberos来认证是足够了,为什么hadoop还要自己开发一套使用delegation token的认证方式呢?这是因为如果在一个很大的…

Delegation Token

Delegation Token 为什么要用delegation tokenDelegation Token 生命周期NameNode中Delegation Token的实现 Hadoop最初的实现中并没有认证机制,这意味着存储在Hadoop中的数据很容易泄露。在2010年,安全特性被加入Hadoop(HADOOP-4487&#xf…

用委托机制(delegation)来定制行为

用委托机制(delegation)来定制行为 应用程序的委托是Cocoa最重要的设计模式——委托机制的一个例子。 委托机制的想法在于:一个对象能有单一的委托对象,可以在某些事件发生的时候调用它。从委托的角度来看,这就是某种…

设计模式--委托模式( Delegation)

1、模式定义 委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能。 假设我们有一个 TeamLead 类,将其既定任务委托给一个关联辅助对象 JuniorDeveloper 来完成&#x…

委托(delegation)的使用方法

1,组合和委托 委托是一个对象请求另一个对象的功能,是复用的一种常见形式。 2,委托和继承 3,使用委托的好处 从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针” 通俗的…

线性代数:05 实对称矩阵与二次型

本讲义是自己上课所用幻灯片,里面没有详细的推导过程(笔者板书推导)只以大纲的方式来展示课上的内容,以方便大家下来复习。 本章是特征值与特征向量知识的延续,根据谱定理可知实对称矩阵可以正交对角化,对…

矩阵空间、秩1矩阵

今天要介绍一种新的向量空间,即矩阵空间,之前碰到的所有向量空间,都是n维的实数空间,现在我们将矩阵当成向量,比如说将3*3的矩阵看作向量,这相当于从原来的n维为扩展到n*n维,那么明明是矩阵为什…

【线性代数】详解正定矩阵、实对称矩阵、矩阵特征值分解、矩阵 SVD 分解

前言 本文主要针对线性代数中的正定矩阵、实对称矩阵、矩阵特征值分解以及矩阵 SVD 分解进行总结。 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 正定矩阵 1. 概念 首先正…

【线性代数】矩阵及其特性

【线性代数】矩阵及其特性 写在前面只拉伸不旋转的方向特征值和特征向量相似和对角化正交,对称矩阵 拉伸最大的方向二次型理论从曲线而来合同矩阵正定二次型 参考资料 写在前面 本文是笔者用于复习本科期间所学线性代数,试图用一种更易接受的方式加强记…