2017-09-18 40 views
0

我有我的火花應用以下方法:在星火任務創建新S3客戶端實例

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

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

    fileName 
} 

這基本上是當它在星火任務被執行下載從S3文件,

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

我擔心我爲每個任務創建s3Client的新實例,有沒有更好的方法?

+0

正在使新的客戶端實例成爲最耗費資源的操作嗎?如果downloadChunk可以在不同的執行程序(即集羣節點)上運行,您還有什麼其他選擇? – Bunyk

+0

s3Client已經有一些連接池本身來重新使用http連接,重新使用相同的實例就足夠了,但不知道這是否可以在執行器中工作。 – egovconcepts

回答

0

您需要在每個映射器上都有一個新的客戶端 - 它們在不同的jvms中(並且可能在不同的節點上)執行,因此不能重複使用同一個客戶端。

你可以做的是使用.mapPartitions

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

這樣一來,你每映射器創建客戶端一次,而不是爲RDD的每一個元素。