我的 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/