【发布时间】:2015-06-09 05:39:14
【问题描述】:
我想通过 Spark(真的是 pyspark)从我的(本地)机器上读取一个 S3 文件。现在,我不断收到类似的身份验证错误
java.lang.IllegalArgumentException:AWS 访问密钥 ID 和密钥 必须将访问密钥指定为用户名或密码 (分别)s3n URL,或通过设置 fs.s3n.awsAccessKeyId 或 fs.s3n.awsSecretAccessKey 属性(分别)。
我在这里和网络上到处寻找,尝试了很多东西,但显然 S3 在过去一年或几个月里一直在变化,所有方法都失败了,只有一个:
pyspark.SparkContext().textFile("s3n://user:password@bucket/key")
(注意s3n [s3 不起作用])。现在,我不想使用带有用户名和密码的 URL,因为它们会出现在日志中,而且我也不知道如何从 ~/.aws/credentials 文件中获取它们。
那么,我如何使用现在 standard ~/.aws/credentials 文件中的 AWS 凭证通过 Spark(或者,更好的是 pyspark)从 S3 本地读取(理想情况下,无需将凭证复制到另一个配置文件)?
PS:我试过os.environ["AWS_ACCESS_KEY_ID"] = …和os.environ["AWS_SECRET_ACCESS_KEY"] = …,还是不行。
PPS:我不确定在哪里“设置 fs.s3n.awsAccessKeyId 或 fs.s3n.awsSecretAccessKey 属性”(Google 没有提出任何建议)。但是,我确实尝试了许多设置这些的方法:SparkContext.setSystemProperty()、sc.setLocalProperty() 和 conf = SparkConf(); conf.set(…); conf.set(…); sc = SparkContext(conf=conf)。没有任何效果。
【问题讨论】:
-
另见this answer。
-
在本地使用 pyspark 运行 spark-submit 之前,我可以在命令行设置环境变量。使用
os.environ将它们设置在 pyspark 中不起作用,因为那时已经太晚了。 -
是的,事情应该以这种方式工作(或通过正确的配置文件)。这个问题只是因为 boto 上的一个错误而出现的。
标签: authentication amazon-s3 apache-spark credentials pyspark