【问题标题】:Scala code doesnt fetch s3 fileScala代码不获取s3文件
【发布时间】:2015-12-13 17:17:51
【问题描述】:

我正在尝试运行 EMR 烫伤作业,假设 Scala 代码获取位于 S3 存储桶中的文本文件的内容。 scala.io.source 库弄乱了 S3 路径的正确位置。

我将参数 runidfile 提供给 EMR 作业:

--runidfile s3://my-bucket/input.txt

scala 代码执行以下操作:

val runid_path = args("runidfile")
val runid = Source.fromFile(runid_path).getLines().mkString

代码不知何故不接受 S3 路径中的“//”,我收到错误:

原因:java.io.FileNotFoundException: s3:/my-bucket/input.txt(没有这样的文件或目录)
在 java.io.FileInputStream.open(本机方法)
在 java.io.FileInputStream.(FileInputStream.java:146)
在 scala.io.Source$.fromFile(Source.scala:90)
在 scala.io.Source$.fromFile(Source.scala:75)
在 scala.io.Source$.fromFile(Source.scala:53)
在 com.move.scalding.userEvents.RecommenderValidator.(RecommenderValidator.scala:37)

是否有任何解决方案或解决方法?我尝试使用Source.fromURL,但 S3 不是有效协议,因此它不接受它。

【问题讨论】:

标签: scala amazon-web-services amazon-s3


【解决方案1】:

scala.io.Source 库并非旨在直接从 Amazon S3 访问文件。为此,您需要另一个库。

您可以使用官方Amazon S3 Java Library。这是一些示例代码(从this question and its answers一起复制)

val credentials = new BasicAWSCredentials("myKey", "mySecretKey")
val s3Client = new AmazonS3Client(credentials)
val s3Object = s3Client.getObject(new GetObjectRequest("my-bucket", "input.txt"))
val myData = Source.fromInputStream(s3Object.getObjectContent())

val runid = myData.getLines().mkString

【讨论】:

  • 感谢斯文的回复。我还有一个担心。由于我在我的专业帐户中运行它,因此我无权访问密钥。此外,我在同一子网中将其作为 EMR 作业运行;所以我认为它应该在没有任何凭据的情况下进入 S3 存储桶。如果您不介意,我想知道这将如何工作。
  • @RachitRaut 我没有使用 Amazon EMR 的经验,也许文档可以提供帮助:docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/… 或者您可以提出其他问题。
  • 只是想补充一下,我按照Sven提供的示例代码,可以成功从S3读取配置文件。我正在使用电子病历。只要 EMR 角色有权访问 S3 存储桶,它就可以在您创建没有任何凭据的 AmazonS3Client() 时工作​​。
  • 仅供参考 - 此方法删除换行符。您只需致电 myData.mkString 即可保留换行符。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多