问题现象
通过 Kerberos 认证不落地导出数据到 HDFS,数据可以正常导出,但会有报错信息,
信息如下:
gbase> show warnings \G;
*************************** 1. row ***************************
Level: Error
Code: 1708
Message: [133.96.79.145:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: Can't open file: 'Export operation failed with error - I/O operation
on hdp://ldapuser@133.96.79.207:50070/user/bdoc/4/services/hdfs/58/datasync/o
m_test_outfile_20171129/om_test_outfile_20171129_16 failed with error - ' (e
rrno: 2)
SQL: SELECT /*133.96.79.143_16565_5_2017-11-29_10:34:23*/ /*+ TID('599
815447') */ `om.test_171124`.`name` AS `name`, `om.test_171124`.`age` AS `
age` INTO OUTFILE 'hdp://133.96.79.207:50070/user/bdoc/4/services/hdfs/58/d
atasync/om_test_outfile_20171129?user=ldapuser&groupnum=15&filenum=&cre
atedir=1' outfilemode by hdfs writemode by overwrites FIELDS TERMI
NATED BY '|' ENCLOSED BY '' LINES STARTING BY '' TERMINA
TED BY '\n' FROM `om`.`test_171124_n16` `om.test_171124`
1 row in set (Elapsed: 00:00:00.00)
ERROR:
No query specified
已经确定 hdfs 中已经有导出的数据,但是集群依然报错。
原因分析
通过对日志分析及模拟测试,确定问题的原因为:
Hadoop 集群在接收到并发的 token 请求后,有可能报错(不通过 8a 导出功能,脚
本就能复现)。
通过筛查现场 Hadoop 日志,发现共有两种报错的堆栈,都是由 jdk 层 jgss 模块引
发,目前暂未找到从部署上规避此问题的方法。
两种报错:
GSSException: No valid credentials provided (Mechanism level: Failed to fin
d any kerberos credentails).
GSSException:Failure unspecified at GSS-API level (Mechanism level: Requ
est a replay (34)).
其中报错 2 已明确是因为 jdk 层 jgss 模块为防止 replay 攻击的实现机制导致,而报
错 2 的具体原因目前还不清楚,推测与使用相同 Kerberos 凭据向 Hadoop 进行高并
发认证相关.
解决方法
两种报错的解决方案如下,解决方案可以二选一:
GSSException: No valid credentials provided (Mechanism level: Failed to find any
kerberos credentails).
1. 修改用户应用程序,在加载和导出 SQL 中使用 Hadoop 的 Namenode 主机
名代替 IP 地址;
2. 升级部署的 Hadoop 版本到 2.8.0 版本。
GSSException:Failure unspecified at GSS-API level (Mechanism level: Request a
replay (34))
1) 升级 Hadoop 集群 java 环境到 1.8.0 版本;
2) 修改 GBase 8a MPP Cluster 连接 Hadoop 的实现,支持单点登录和 token 维
护。