簡體   English   中英

Spark配置因內存不足錯誤

[英]Spark configuration for Out of memory error

集群設置-

Driver has 28gb
Workers have 56gb each (8 workers)

配置-

spark.memory.offHeap.enabled true
spark.driver.memory 20g
spark.memory.offHeap.size 16gb
spark.executor.memory 40g

我的工作 -

//myFunc just takes a string s and does some transformations on it, they are very small strings, but there's about 10million to process.


//Out of memory failure
data.map(s => myFunc(s)).saveAsTextFile(outFile)

//works fine
data.map(s => myFunc(s))

另外,我從程序中解簇/刪除了火花,它在具有56GB內存的單台服務器上完成了很好的工作(成功保存到文件中)。 這表明這只是一個火花配置問題。 我查看了https://spark.apache.org/docs/latest/configuration.html#memory-management ,目前看來,所有配置都需要更改才能正常工作。 我還應該改變什么?

更新-

數據-

val fis: FileInputStream = new FileInputStream(new File(inputFile))
val bis: BufferedInputStream = new BufferedInputStream(fis);
val input: CompressorInputStream = new CompressorStreamFactory().createCompressorInputStream(bis);
br = new BufferedReader(new InputStreamReader(input))
val stringArray = br.lines().toArray()
val data = sc.parallelize(stringArray)

注意-這不會引起任何內存問題,即使效率極低。 我無法使用spark讀取它,因為它引發了一些EOF錯誤。

myFunc,因為它很復雜,所以我不能真正發布它的代碼。 但基本上,輸入字符串是限定字符串,它執行了限定符替換,日期/時間規范化等操作。 輸出字符串的大小將與輸入字符串大致相同。

此外,它對於較小的數據大小也可以正常工作,並且輸出正確,並且大小應該與輸入數據文件大致相同。

如果您在MAP之前和之后添加程序中正在進行的操作的更多詳細信息,將有幫助。 除非觸發了動作,否則第二條命令(僅Map)不會執行任何操作。 您的文件可能未分區,驅動程序正在執行工作。 下面應該強制將數據平均分配給工作人員,並在單個節點上保護OOM。 但是,這將導致數據混排。

查看代碼后更新解決方案,如果這樣做,會更好

val data = sc.parallelize(stringArray).repartition(8)
data.map(s => myFunc(s)).saveAsTextFile(outFile)

您當前的解決方案沒有利用火花。 您正在將整個文件加載到內存中的數組中,然后使用sc.parallelize將其分發到RDD中。 這極大地浪費了內存(即使沒有火花),並且當然會導致大文件的內存不足問題。

而是使用sc.textFile(filePath)創建您的RDD。 然后spark可以智能地分塊讀取和處理文件,因此一次只需要一小部分存儲在內存中。 您還可以通過這種方式利用並行性,因為spark可以並行讀取和處理文件,而執行者卻很多,而您需要擁有的文件執行器則更多,而無需在單個線程上讀取單個文件中的整個文件機。

假設myFunc一次只能查看一行,那么該程序應具有非常小的內存占用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM