【问题标题】:How to read a text file in S3 bucket from inside an AWS EMR without using spark如何在不使用 spark 的情况下从 AWS EMR 内部读取 S3 存储桶中的文本文件
【发布时间】:2020-03-10 19:54:33
【问题描述】:

我需要从 EMR 集群打开位于 S3 存储桶中的常规文本文件(不是 parquet 或 CSV 文件)。我可以直接使用spark.read.parquet("s3://mybucket/some_parq_file")直接打开CSV或parquet文件

但我只需要使用 java.io.File 或 scala.io.Source 从 EMR 集群中读取常规文本文件。当我尝试时得到一个 java.io.FileNotFoundException

import scala.io.Source
val hdr = "s3://mybucket/txtfile.txt"
for (line <- Source.fromFile(hdr).getLines) {
    println(line)
}

【问题讨论】:

  • 这并没有真正回答我的问题,当我直接使用 spark 时,我的 EMR 集群已经可以访问 S3 存储桶。我的问题是如何在不使用 spark 的情况下访问同一个 EMR 集群中的 S3 文件?
  • 使用 java sdk。没有 emrfs 就没有简单的方法。

标签: scala amazon-s3 amazon-emr


【解决方案1】:
  1. 当 EMR 出现和引导程序时,您可以提供引导程序脚本 脚本(.sh 文件)可以访问 s3 文件(我用过多次)
  2. 可以提交EMR步骤,执行jar文件,jar可以访问s3

【讨论】:

    【解决方案2】:

    我猜大多数 AWS 设置已经使用默认凭证链和默认区域提供商链在您的 EMR 集群中配置了凭证。这也应该适用于 AWS Lambda。因此,要从 EMR 集群访问我的 S3 存储桶,我只需要使用 AWSS3ClientBuilder

    import com.amazonaws.services.s3.AmazonS3ClientBuilder
    import java.io.File
    import java.nio.file.{Files, StandardCopyOption}
    
    val bucket ="s3_bucket"
    val file_in_s3 = "somefile.txt"
    val dest = "/tmp/local_file.txt"
    val s3 = AmazonS3ClientBuilder.defaultClient()
    val stream = s3.getObject(bucket, file_in_s3).getObjectContent
    
    Files.copy(stream, new File(dest).toPath, StandardCopyOption.REPLACE_EXISTING)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2019-11-12
      • 2017-09-29
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多