通过Spark本地读取S3文件(或更好:pyspark)

Eri*_*got 23 authentication credentials amazon-s3 apache-spark pyspark

我想通过Spark(pyspark,真的)从我的(本地)机器读取一个S3文件.现在,我不断收到身份验证错误

java.lang.IllegalArgumentException:必须将AWS Access Key ID和Secret Access Key指定为s3n URL的用户名或密码,或者分别设置fs.s3n.awsAccessKeyId或fs.s3n.awsSecretAccessKey属性.

我在这里和网上到处寻找,尝试了很多东西,但显然S3在过去一年或几个月里一直在变化,所有方法都失败了但是一个:

pyspark.SparkContext().textFile("s3n://user:password@bucket/key")
Run Code Online (Sandbox Code Playgroud)

(注意s3n[ s3不起作用]).现在,我不想使用带有用户和密码的URL,因为它们可以出现在日志中,我也不知道如何从~/.aws/credentials文件中获取它们.

那么,我如何使用来自现在标准 ~/.aws/credentials文件的AWS凭证(或者更好地,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).没有任何效果.

Dan*_*bos 7

是的,你必须使用s3n而不是s3.s3是一些奇怪的滥用S3的好处,我不清楚.

您可以将凭据传递给sc.hadoopFilesc.newAPIHadoopFile调用:

rdd = sc.hadoopFile('s3n://my_bucket/my_file', conf = {
  'fs.s3n.awsAccessKeyId': '...',
  'fs.s3n.awsSecretAccessKey': '...',
})
Run Code Online (Sandbox Code Playgroud)

  • `my_file`是你要读的文件.您可以通过`conf`参数传递它们,而不是传递URL中的键.据我所知,`〜/ .aws/credentials`是`aws-cli`的实现细节.您可以自己解析它,或将密钥放在您自己的首选格式的配置文件中.(我认为这不是一个完整的答案.希望它无论如何都有用!) (2认同)

Eri*_*got 3

该问题实际上是亚马逊botoPython 模块中的一个错误。该问题与 MacPort 的版本实际上较旧有关:boto通过 pip 安装解决了问题:~/.aws/credentials被正确读取。

现在我有了更多的经验,我想说的是,一般来说(截至 2015 年底)Amazon Web Services 工具和 Spark/PySpark 的文档不完整,并且可能存在一些很容易遇到的严重错误。对于第一个问题,我建议首先更新 aws 命令行界面,boto并在每次发生奇怪的情况时更新 Spark:这“神奇地”解决了我已经遇到的一些问题。