使用PolyBase从SQL Server向Hadoop创建外部表报错求助
我来一步步拆解你遇到的问题,先分析那两个错误,再重点聊你关心的数据库范围凭据里的IDENTITY和Secret相关疑问:
先看你遇到的两个错误
1. 初始的EOFException错误
Msg 105019, Level 16, State 1, Line 1
EXTERNAL TABLE访问因内部错误失败:'调用HdfsBridge_IsDirExist时引发Java异常:访问外部文件时发生错误[本地主机与目标主机xxxxx:1111间出现End of File Exception:java.io.EOFException]'
这个错误本质是PolyBase和Hadoop集群的身份验证握手失败:1111是Hadoop NameNode的IPC RPC端口,出现EOFException说明连接建立后,Hadoop集群直接断开了连接——大概率是你的集群启用了Kerberos认证,但PolyBase初始配置没开Kerberos支持,导致身份验证不通过被拒绝。
2. 开启Kerberos配置后的「无法实例化LoginClass」错误
Msg 105019, Level 16, State 1, Line 1
EXTERNAL TABLE访问因内部错误失败:'调用HdfsBridge_Connect时引发Java异常:访问外部文件时发生错误[无法实例化LoginClass]'
这个错误是因为你开启了Kerberos配置,但要么配置不完整,要么数据库范围凭据的信息和Kerberos要求不匹配,导致PolyBase无法加载Kerberos登录类完成认证流程。
重点解答:数据库范围凭据的IDENTITY和Secret
你的怀疑完全正确,这个凭据直接和Hadoop的认证体系绑定,不同的认证模式下,两者的取值完全不同:
情况1:Hadoop集群启用Kerberos认证
如果你的Hortonworks集群是Kerberos-enabled的(这是生产环境的常见配置):
IDENTITY必须是完整的Kerberos主体名称,格式为用户名@KERBEROS_REALM(比如prashanth@HORTONWORKS.COM,注意Realm必须大写,要和集群的Kerberos Realm完全一致)Secret不是普通密码,而是该Kerberos主体对应的密码(注意密码的大小写、特殊字符必须完全匹配)- 同时你需要确保
core-site.xml里的Kerberos配置完整:
另外,SQL Server所在服务器必须能正常访问Kerberos KDC服务器,且该Kerberos主体拥有访问目标HDFS目录的权限。<property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hdfs.namenode.kerberos.principal</name> <value>nn/_HOST@HORTONWORKS.COM</value> <!-- 替换成你集群的NameNode主体 --> </property>
情况2:Hadoop集群使用简单认证(无Kerberos)
如果你的集群是测试环境,没开Kerberos,用的是Simple Auth:
- 先把
core-site.xml里的Kerberos配置注释回去,恢复初始状态 IDENTITY就是Hadoop集群中拥有目标HDFS目录访问权限的普通用户名(比如hdfs、testuser)Secret是该Hadoop用户对应的密码(如果集群开启了简单认证的密码验证;如果是完全无密码的开放集群,可能不需要创建数据库范围凭据)
下一步排查建议
- 先确认集群的认证模式:登录Hortonworks Ambari,查看HDFS服务的
hadoop.security.authentication配置值,确定是kerberos还是simple - 根据认证模式调整
core-site.xml和数据库范围凭据:- 若为Kerberos:检查主体格式是否正确、密码是否匹配,同时验证SQL Server服务器能连通KDC
- 若为Simple Auth:恢复Kerberos配置的注释,确保凭据的用户名/密码在Hadoop集群中有效
- 测试网络连通性:在SQL Server机器上用
telnet xxxxx 1111测试是否能连通Hadoop的IPC端口,排除网络问题
内容的提问来源于stack exchange,提问作者prashanth

