由于您使用的是 Hadoop/Spark 接口(例如 sc.textFile),因此确实应该通过 fs.s3.* 或 fs.s3n.* 或 fs.s3a.* 键完成所有操作,而不是尝试通过任何 ~/.aws 或/etc/boto.cfg 设置。您可以通过以下几种方式将这些设置应用于您的 Dataproc 集群:
在集群创建时:
gcloud dataproc clusters create --properties \
core:fs.s3.awsAccessKeyId=<s3AccessKey>,core:fs.s3.awsSecretAccessKey=<s3SecretKey> \
--num-workers ...
此处的core 前缀表示您希望将设置放在core-site.xml 文件中,如Cluster Properties documentation 中所述。
或者,在提交作业时,如果您使用 Dataproc 的 API:
gcloud dataproc jobs submit pyspark --cluster <your-cluster> \
--properties spark.hadoop.fs.s3.awsAccessKeyId=<s3AccessKey>,spark.hadoop.fs.s3.awsSecretAccessKey=<s3SecretKey> \
...
在这种情况下,我们将属性作为 Spark 属性传递,Spark 提供了一种方便的机制来将“hadoop”conf 属性定义为 Spark conf 的子集,只需使用 spark.hadoop.* 前缀即可。如果您通过 SSH 在命令行提交,则相当于:
spark-submit --conf spark.hadoop.fs.s3.awsAccessKeyId=<s3AccessKey> \
--conf spark.hadoop.fs.s3.awsSecretAccessKey=<s3SecretKey>
最后,如果您想在创建集群时进行设置,但不想在 Dataproc 元数据中明确设置访问密钥,您可以选择改用 initialization action。有一个名为 bdconfig 的便捷工具应该出现在您可以轻松修改 XML 设置的路径上:
#!/bin/bash
# Create this shell script, name it something like init-aws.sh
bdconfig set_property \
--configuration_file /etc/hadoop/conf/core-site.xml \
--name 'fs.s3.awsAccessKeyId' \
--value '<s3AccessKey>' \
--clobber
bdconfig set_property \
--configuration_file /etc/hadoop/conf/core-site.xml \
--name 'fs.s3.awsSecretAccessKey' \
--value '<s3SecretKey>' \
--clobber
将它上传到某个地方的 GCS 存储桶,并在集群创建时使用它:
gsutil cp init-aws.sh gs://<your-bucket>/init-aws.sh
gcloud dataproc clustres create --initialization-actions \
gs://<your-bucket>/init-aws.sh
虽然 Dataproc 元数据确实像任何其他用户数据一样在静态时经过加密并且受到高度保护,但使用 init 操作有助于防止在查看您的 Dataproc 集群属性时不小心将您的访问密钥/秘密显示给站在您屏幕后面的人。