【问题标题】:Locally reading S3 files through Spark (or better: pyspark)通过 Spark 本地读取 S3 文件(或更好:pyspark)
【发布时间】: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


【解决方案1】:

是的,您必须使用s3n 而不是s3s3 是对 S3 的一些奇怪的滥用,我不清楚它的好处。

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

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

【讨论】:

  • 谢谢,内容丰富。 my_file 应该是什么?只是存储配置文件的地方?它可以预先存储,然后本地存储吗?我的另一个问题是如何以编程方式访问来自~/.aws/credentials 的数据(没有用ConfigParser 解析它):你知道怎么做吗?
  • my_file 是您要读取的文件。不是在 URL 中传递密钥,而是通过 conf 参数传递它们。据我所知~/.aws/credentialsaws-cli 的实现细节。您可以自己解析它,或者将密钥放在您自己的首选格式的配置文件中。 (我认为这不是一个完整的答案。希望它仍然有用!)
  • 供参考:虽然我确实反复看到应该使用s3n 代替“旧”s3“块”文件系统,但当前的官方文档表明应该使用s3使用:docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/….
  • 对我不起作用(spark1.5、hadoop2.4)。我有错误“必须将 AWS 访问密钥 ID 和秘密访问密钥指定为 s3 URL 的用户名或密码(分别),或者通过设置 fs.s3.awsAccessKeyId 或 fs.s3.awsSecretAccessKey 属性(分别)”。并且 S3 url 在那里没有用,因为当您在密钥中有一个“/”时,它不起作用(HADOOP-3733)
  • @mathieu:听起来您使用的是s3:// 而不是s3n://
【解决方案2】:

我不能说太多关于你必须给 hadoopFile 函数的 java 对象,只是这个函数似乎已经被一些“newAPIHadoopFile”贬低了。这方面的文档非常粗略,我觉得您需要了解 Scala/Java 才能真正了解所有内容的含义。 与此同时,我想出了如何将一些 s3 数据实际输入到 pyspark 中,我想我会分享我的发现。 这个文档:Spark API documentation 说它使用了一个被转换成 java 配置 (XML) 的字典。我找到了 java 的配置,这可能反映了您应该放入 dict 中的值:How to access S3/S3n from local hadoop installation

bucket = "mycompany-mydata-bucket"
prefix = "2015/04/04/mybiglogfile.log.gz"
filename = "s3n://{}/{}".format(bucket, prefix)

config_dict = {"fs.s3n.awsAccessKeyId":"FOOBAR",
               "fs.s3n.awsSecretAccessKey":"BARFOO"}

rdd = sc.hadoopFile(filename,
                    'org.apache.hadoop.mapred.TextInputFormat',
                    'org.apache.hadoop.io.Text',
                    'org.apache.hadoop.io.LongWritable',
                    conf=config_dict)

这段代码sn-p从前两行指定的bucket和prefix(bucket中的文件路径)加载文件。

【讨论】:

  • 对我不起作用(spark1.5、hadoop2.4)。我有错误“必须将 AWS 访问密钥 ID 和秘密访问密钥指定为 s3 URL 的用户名或密码(分别),或者通过设置 fs.s3.awsAccessKeyId 或 fs.s3.awsSecretAccessKey 属性(分别)”。并且 S3 url 在那里没有用,因为当您在密钥中有一个“/”时,它不起作用(HADOOP-3733)
【解决方案3】:

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

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

【讨论】:

  • 我安装了 python 3.6 并破坏了 awscli。我想我最初是用 2.7 安装的,然后我不得不在 Python 3 上下文中再次pip install awscli。因此,始终保持 aws cli、boto 和 spark 更新的建议是个好建议!
【解决方案4】:

环境变量设置可能会有所帮助。

Here in Spark FAQ 在“如何访问 S3 中的数据?”问题下他们建议设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量。

【讨论】:

【解决方案5】:

这是一个关于如何从~/.aws/credentials 读取凭据的解决方案。它利用了凭证文件是一个 INI 文件这一事实,该文件可以用 Python 的 configparser 进行解析。

import os
import configparser

config = configparser.ConfigParser()
config.read(os.path.expanduser("~/.aws/credentials"))

aws_profile = 'default' # your AWS profile to use

access_id = config.get(aws_profile, "aws_access_key_id") 
access_key = config.get(aws_profile, "aws_secret_access_key") 

另请参阅https://gist.github.com/asmaier/5768c7cda3620901440a62248614bbd0 的要点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2015-12-19
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多