访问 S3
用户可以通过提供 AWS 凭证从 Amazon AWS 外部访问 Amazon S3(简单存储服务)。出于安全目的,我们在 env.sh 中的环境变量中指定 AWS 凭证,而不在 conf/core-site.xml 等配置文件中指定。由于 env.sh 可能包含 AWS 凭证,我们将其作为 Secret 而不是 ConfigMap 挂载到 Metastore 和 HiveServer2 Pod 中。
配置对 S3 的访问
为了访问 S3,用户应采取三个步骤。首先在 conf/core-site.xml 中设置配置键 fs.s3a.aws.credentials.provider。
vi conf/core-site.xml
<property>
<name>fs.s3a.aws.credentials.provider</name>
<value>com.amazonaws.auth.EnvironmentVariableCredentialsProvider</value>
</property>
类 EnvironmentVariableCredentialsProvider 尝试从两个环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 读取 AWS 凭证。
接下来在 env.sh 中设置两个环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。
vi env.shexport AWS_ACCESS_KEY_ID=_your_aws_access_key_id_export AWS_SECRET_ACCESS_KEY=_your_aws_secret_secret_key_
由于 env.sh 作为 Secret 挂载到 Metastore 和 HiveServer2 Pod 中,因此在 env.sh 中写入 AWS 访问密钥 ID 和秘密访问密钥是安全的。
最后,将 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 追加到 conf/mr3-site.xml 中配置键 mr3.am.launch.env 和 mr3.container.launch.env 的值中。需要注意的是,出于安全目的,用户不应写入 AWS 访问密钥 ID 和秘密访问密钥。 只需追加两个字符串就足够了,因为 MR3 会自动通过从系统环境读取来设置这两个环境变量。
vi conf/mr3-site.xml
<property>
<name>mr3.am.launch.env</name>
<value>LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/mr3-run/hadoop/apache-hadoop/lib/native,HADOOP_CREDSTORE_PASSWORD,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION</value>
</property>
<property>
<name>mr3.container.launch.env</name>
<value>LD_LIBRARY_PATH=/opt/mr3-run/hadoop/apache-hadoop/lib/native,HADOOP_CREDSTORE_PASSWORD,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION</value>
</property>
如果用户在 Amazon AWS 内部创建 Kubernetes 集群(例如通过使用 EC2 实例),则将配置键 fs.s3a.aws.credentials.provider 的类设置为 InstanceProfileCredentialsProvider 可能就足够了。
vi conf/mr3-site.xml
<property>
<name>fs.s3a.aws.credentials.provider</name>
<value>com.amazonaws.auth.InstanceProfileCredentialsProvider</value>
</property>
在这种情况下,不需要在 kubernetes/env.sh 中指定 AWS 凭证。
访问 S3 兼容存储
如果用户想访问自定义 S3 兼容存储,应在 conf/core-site.xml 中设置其他配置键。特别是,应将配置键 fs.s3a.endpoint 设置为指向存储服务器。以下是访问自定义 S3 兼容存储的配置键设置示例。
vi conf/core-site.xml
<property>
<name>fs.s3a.endpoint</name>
<value>http://my.s3.server.address:9000</value>
</property>
<property>
<name>fs.s3a.impl</name>
<value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
在 S3 上使用 LLAP I/O
要在访问 S3 时使用 LLAP I/O,请在 conf/hive-site.xml 中将配置键 hive.llap.io.use.fileid.path 设置为 false。
vi conf/hive-site.xml
<property>
<name>hive.llap.io.use.fileid.path</name>
<value>false</value>
</property>