scala - 在 Spark 任务中创建新的 s3 客户端实例

标签 scala apache-spark amazon-s3

我的 Spark 应用程序中有以下方法:

private def downloadChunk(sitemChunk : DataChunk) : String = {

    val s3Client = new AmazonS3Client()
    val fileName = s3Client.getObject(....)

    fileName
}

这基本上是在 Spark 任务中执行时从 S3 下载文件,

val mydata = sc.parallelize(listOfChunks)
mydata.map(x => downloadChunk(x)).collect

恐怕我要为每个任务创建 s3Client 的新实例,有更好的方法吗?

最佳答案

您需要在每个映射器上有一个新客户端 - 它们在不同的 jvm 中执行(并且可能在不同的节点上),因此不能选择重用相同的客户端。

您可以使用.mapPartitions:

  myData.mapPartitions { part =>
     val client = new AmazonS3Client
     part.flatMap { chunk => client.getObject(...) }
  }

这样,您就可以为每个映射器创建一次客户端,而不是为 rdd 的每个元素创建客户端。

关于scala - 在 Spark 任务中创建新的 s3 客户端实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46279078/

相关文章:

postgresql - Play Evolutions : getting a syntax error. 什么给了?

java - Akka 快速入门 : An illegal reflective access operation has occurred

performance - 如何找到最佳的 Spark-athena 文件大小

python - boto3 签名的 url 导致 SignatureDoesNotMatch

scala - 错误 : bulkCopyToSqlDB is not a member of org. apache.spark.sql.DataFrameWriter

scala - 关于 Play 框架验证表单

hadoop - spark-submit 不使用 YARN

java - Spark 类型不匹配 : cannot convert from JavaRDD<Object> to JavaRDD<String>

ios - 如何从 AWS S3 下载文件并在 iOS 中访问它

amazon-web-services - AWS Athena MSCK REPAIR TABLE对于小型数据集而言花费的时间太长