从 Google 的 dataproc 读取 S3 数据

Eka*_*Eka 2 amazon-s3 amazon-web-services apache-spark google-cloud-dataproc

我正在通过 Google 的 dataproc 在我创建的集群上运行 pyspark 应用程序。在一个阶段,应用程序需要访问 Amazon S3 目录中的目录。在那个阶段,我收到错误:

AWS 访问密钥 ID 和秘密访问密钥必须指定为 s3 URL 的用户名或密码(分别),或者通过设置 fs.s3.awsAccessKeyId 或 fs.s3.awsSecretAccessKey 属性(分别)。

我登录到集群的头节点并使用我的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 信息设置 /etc/boto.cfg,但这并没有解决访问问题。

(1) 有关如何从 dataproc 集群访问 AWS S3 的任何其他建议?

(2) 另外,dataproc 用来访问集群的用户名是什么?如果我知道,我可以在集群上为该用户设置 ~/.aws 目录。

谢谢。

Den*_*Huo 5

由于您使用的是 Hadoop/Spark 接口(如sc.textFile),因此确实应该通过fs.s3.*orfs.s3n.*fs.s3a.*键完成所有操作,而不是尝试通过 any~/.aws/etc/boto.cfgsettings 进行连接。您可以通过多种方式将这些设置应用于您的 Dataproc 集群:

在集群创建时:

gcloud dataproc clusters create --properties \
    core:fs.s3.awsAccessKeyId=<s3AccessKey>,core:fs.s3.awsSecretAccessKey=<s3SecretKey> \
    --num-workers ...
Run Code Online (Sandbox Code Playgroud)

core此处的前缀表示您希望将设置放置在core-site.xml文件中,如集群属性文档 中所述

或者,在提交作业时,如果您使用的是 Dataproc 的 API:

gcloud dataproc jobs submit pyspark --cluster <your-cluster> \
    --properties spark.hadoop.fs.s3.awsAccessKeyId=<s3AccessKey>,spark.hadoop.fs.s3.awsSecretAccessKey=<s3SecretKey> \
    ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们将属性作为 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>
Run Code Online (Sandbox Code Playgroud)

最后,如果您想在集群创建时进行设置,但不想在 Dataproc 元数据中显式设置您的访问密钥,您可以选择使用初始化操作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
Run Code Online (Sandbox Code Playgroud)

将其上传到某个地方的 GCS 存储桶,并在创建集群时使用它:

gsutil cp init-aws.sh gs://<your-bucket>/init-aws.sh
gcloud dataproc clustres create --initialization-actions \
    gs://<your-bucket>/init-aws.sh
Run Code Online (Sandbox Code Playgroud)

虽然 Dataproc 元数据确实像任何其他用户数据一样在静态时加密并且受到高度保护,但使用 init 操作有助于防止无意中向您显示您的访问密钥/机密,例如在查看您的 Dataproc 集群属性时站在您屏幕后面的人。