访问 HDFS
本页说明如何从运行在 Kubernetes 上且使用 Kerberos 认证的 HivePlus 访问 HDFS。
我们假设当前工作目录是kubernetes。
需要注意的是,即使在访问 HDFS 时,配置键fs.defaultFS仍应在conf/core-site.xml中设置为file:///,而不是 HDFS 地址(如hdfs://red0:8020)。这是因为从运行在 Kubernetes 集群中的 HiveServer2 的角度来看,默认文件系统是本地文件系统。实际上,HiveServer2 甚至不知道它正在从 HDFS 读取。
访问非安全 HDFS
为了允许 HivePlus 从非安全 HDFS 读取,在conf/core-site.xml中将配置键ipc.client.fallback-to-simple-auth-allowed设置为 true。
vi conf/core-site.xml
<property>
<name>ipc.client.fallback-to-simple-auth-allowed</name>
<value>true</value>
</property>
如果非安全 HDFS 是唯一的数据源而使用了 Kerberos 认证,则配置键dfs.encryption.key.provider.uri(或hadoop.security.key.provider.path)不得在conf/core-site.xml中设置。
访问加密 HDFS
conf/core-site.xml
在conf/core-site.xml中,用户指定 HDFS NameNode 的服务主体和 KMS 的地址。
vi conf/core-site.xml
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/red0@RED</value>
</property>
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@red0:9292/kms</value>
</property>
-
如果未指定配置键
dfs.namenode.kerberos.principal,Metastore 可能会生成java.lang.IllegalArgumentException,例如:org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Got exception: java.io.IOException DestHost:destPort blue0:8020 , LocalHost:localPort hivemr3-metastore-0.metastore.hivemr3.svc.cluster.local/10.44.0.1:0. Failed on local exception: java.io.IOException: Couldn't set up IO streams: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name) -
设置配置键
dfs.encryption.key.provider.uri,因为 HivePlus 需要获取凭据才能访问加密 HDFS。
conf/yarn-site.xml
在conf/yarn-site.xml中,用户指定 Yarn ResourceManager 的服务主体。
vi conf/yarn-site.xml
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/red0@RED</value>
</property>
conf/hive-site.xml
访问加密 HDFS 时,hive-site.xml中的配置键hive.mr3.dag.additional.credentials.source应设置为 HDFS 上的路径。通常使用存储 warehouse 的 HDFS 目录就足够了,例如:
vi conf/hive-site.xml
<property>
<name>hive.mr3.dag.additional.credentials.source</name>
<value>hdfs://hdfs.server:8020/hive/warehouse/</value>
</property>
如果未设置hive.mr3.dag.additional.credentials.source,执行没有输入文件的查询(例如创建新表或向现有表插入值)不会生成 HDFS 令牌,可能会失败,例如:
org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]`