跳到主要内容

访问 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]`