问题类别
按照发生情况的情况进行分类总结,发现问题可以分为以下三类。
- Spark 框架自身的问题
- Hadoop 全家桶的问题
- 开发者使用的库的问题
已知问题
- Hadoop-common-2.6.0 的 UGI 存在bug,代码为HADOOP-107861,该问题在 CDH 发行版(2.6.0-CDH5.12.1)中已经修复,但 Apache 版本在2.6.1之前存在问题。
- HDFS 也存在一个 HDFS_DELEGATION_TOKEN 过期的 bug,代码为HDFS-92762,问题在 CDH 发行版中已经修复,但 Apache 在 2.7.1 之前的版本存在问题。
- Spark 存在一个 HDFS_DELEGATION_TOKEN 过期的 bug,代码为SPARK-233613,该问题会导致Driver重启后,如果超过7天,就会挂掉一次。SPARK 2.4.0 之前存在该问题。
排查方法
目标
基本目标是能正常访问HDFS, Hbase, Hive等,才能确保程序不会挂掉 。
最好的情况是能安全稳定长期运行Spark,Flink等 long-running applications。
Spark 框架以及 Hadoop 全家桶的排查方法
- 首先,确保所用的 Hadoop 库、Hdfs 库没有问题,其次再排查有无直接使用 Hadoop HDFS库的情况。
- 接着,确保流式计算框架携带的任何包含 Hadoop有关的包(hadoop-common,hadoop-hdfs)没有问题。
- 最后,升级流式计算框架并避开有 BUG的版本,保证框架层面不会有问题。
携带的情况举例
SPARK_HOME/jars/ 内也可能有含有上述bug的 hadoop-xxxx.jar。
开发者使用的库的问题
用户打包的应用程序内可能会有 hadoop-xxxx.jar,或者shade导致的内嵌字节码文件。
使用提示
- 常见的
--conf spark.hadoop.fs.hdfs.impl.disable.cache=true
这个选项,只能回避 HDFS-9276 的BUG。
异常案例
下方只是一个常见的触发 HDFS_DELEGATION_TOKEN 过期的bug。
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.token.SecretManager$InvalidToken): token (token for research: HDFS_DELEGATION_TOKEN owner=research@RTC.SLANKKA.COM, renewer=yarn, realUser=, issueDate=1690268368213, maxDate=1690873168213, sequenceNumber=211804054, masterKeyId=2078) is expired, current time: 2023-08-01 15:00:20,416+0800 expected renewal time: 2023-08-01 14:59:28,213+0800
at org.apache.hadoop.ipc.Client.call(Client.java:1504)
at org.apache.hadoop.ipc.Client.call(Client.java:1441)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:771)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
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:260)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
at com.sun.proxy.$Proxy11.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2126)
at org.apache.hadoop.hdfs.DistributedFileSystem$20.doCall(DistributedFileSystem.java:1262)
at org.apache.hadoop.hdfs.DistributedFileSystem$20.doCall(DistributedFileSystem.java:1258)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1258)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:425)
at org.apache.hadoop.fs.viewfs.ChRootedFileSystem.getFileStatus(ChRootedFileSystem.java:226)
at org.apache.hadoop.fs.viewfs.ViewFileSystem.getFileStatus(ViewFileSystem.java:379)
本文作者:一杯半盏,首发自【Flink系列十八】HDFS_DELEGATION_TOKEN过期的问题解决汇总 - 一杯半盏 - 博客园 (cnblogs.com)
参考
Footnotes
-
HADOOP-10786 issues.apache.org/jira/browse… ↩
-
HDFS-9276 issues.apache.org/jira/browse… ↩
-
SPARK-23361 issues.apache.org/jira/browse… ↩