Spark 程式在Yarn上的記憶體問題,簡單解釋

2021-09-27 02:36:16 字數 1462 閱讀 6777

當上傳spark程式時,總會有出現以下這個錯誤

spark-submit報錯 container exited with a non-zero exit code 143

還有比如 outofmemory, memory exceed 等等,乙個頭兩個大。。。。

對於只是使用spark程式的人,我實在是沒興趣了解spark 記憶體管理(我也不幹這個。。。)

所以只有乙個目的,如何設定這些引數,所以我就想用最簡單的方法說明他們到底是個啥,這樣根據你的資料,也能大概知道如何設定引數。

***這裡的解釋跟spark記憶體管理的真正樣子是由一定出入的,只是幫助理解你如何去設定引數,如果真的想要弄明白,還是去看documentation為好*********

在記憶體問題上,有這麼幾個東西要關注的

driver/executor

每乙個spark程式會有乙個driver, 和若干個executor,他們的關係大概就是,假如你們是乙個小組,那driver就是知道你們這個小組的完整的工作流程的老大,以及你們有幾個人,他們在幹啥。 executor就很簡單了,幹活的人,他們有各自的任務(task), 而container,就像是他們的工位,每個人的地方是固定的安排好,而這個分地方的人就是你們這個公司的老總,如果你想自己就佔兩個位置,那老總就毫不猶豫的把你開了。

memoryoverhead: 你這container(工作這個地方) 最大的大小,一旦超過了,這個container就被drop了

#設定

spark.yarn.executor.memoryoverhead

spark.yarn.driver.memoryoverhead

#設定

spark.executor.memory

spark.driver.memory

cores: 多少的cores就決定了yarn的並行能力,比如乙個executor裡有4個 cores,就是能夠同時執行 4 tasks (in parallel),和多少個核也會影響到記憶體的使用。 因為在每乙個executor裡,task是共享記憶體的。 比如你的executor裡有4g記憶體,然後你有4個核,那他就能並行4個task,那每個task就只有1g的記憶體 (這只是個近似,,本質上差不多而已)

# 設定

spark.executor.cores

spark.driver.cores

注:driver我反正沒設定過多核

有點亂了吧, 舉個栗子, 對於乙個executor, 你設定他的記憶體2g, 2cores, 結果記憶體**了, 那就應該提高記憶體比如到3g,或者減少並行 1core, 如果兩個都長,其實就沒啥太大區別。

Spark在Yarn上的效能調優

1 process local 程序本地化 推薦使用 和資料在同乙個 executor 程序中,資料在executor的blockmanager中,效能最好 2 node local 節點本地化 推薦使用 和資料在乙個節點中,主要分兩種情況 i 資料在節點上,task在節點上的executor中執行...

在Spark上執行TopK程式

package com.cn.gao import org.apache.spark.sparkconf import org.apache.spark.sparkcontext import org.apache.spark.sparkcontext.author hadoop 對文字進行詞頻統計...

在Spark上執行WordCount程式

1.編寫程式 如下 wordcount.scala package wordcount import org.apache.spark.sparkconf import org.apache.spark.sparkcontext import org.apache.spark.sparkcontex...