更新時間:2017-06-07 13:26:11apache
本章節將介紹如何在 E-MapReduce 場景下設置 spark-submit 的參數。安全
E-MapReduce 產品版本 1.1.0併發
Hadoop 2.6.0app
Spark 1.6.0oop
Master 節點性能
8 核 16G 500G 高效雲盤優化
1 臺spa
Worker 節點 x 10 臺線程
8 核 16G 500G 高效雲盤3d
10 臺
總資源:8 核 16G(Worker)x 10 + 8 核 16G(Master)
注意:因爲做業提交的時候資源只計算 CPU 和內存,因此這裏磁盤的大小並未計算到總資源中。
Yarn 可分配總資源:12 核 12.8G(worker)x 10
注意:默認狀況下,yarn 可分配核 = 機器核 x 1.5,yarn 可分配內存 = 機器內存 x 0.8。
建立集羣后,您能夠提交做業。首先,您須要在 E-MapReduce 中建立一個做業,配置以下:
上圖所示的做業,直接使用了 Spark 官方的 example 包,因此不須要本身上傳 jar 包。
參數列表以下所示:
--class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 4g –num-executors 2 --executor-memory 2g --executor-cores 2 /opt/apps/spark-1.6.0-bin-hadoop2.6/lib/spark-examples*.jar 10
參數說明以下所示:
參數 | 參考值 | 說明 |
---|---|---|
class | org.apache.spark.examples.SparkPi | 做業的主類。 |
master | yarn | 由於 E-MapReduce 使用 Yarn 的模式,因此這裏只能是 yarn 模式。 |
yarn-client | 等同於 –-master yarn —deploy-mode client, 此時不須要指定deploy-mode。 | |
yarn-cluster | 等同於 –-master yarn —deploy-mode cluster, 此時不須要指定deploy-mode。 | |
deploy-mode | client | client 模式表示做業的 AM 會放在 Master 節點上運行。要注意的是,若是設置這個參數,那麼須要同時指定上面 master 爲 yarn。 |
cluster | cluster 模式表示 AM 會隨機的在 worker 節點中的任意一臺上啓動運行。要注意的是,若是設置這個參數,那麼須要同時指定上面 master 爲yarn。 | |
driver-memory | 4g | driver 使用的內存,不可超過單機的 core 總數。 |
num-executors | 2 | 建立多少個 executor。 |
executor-memory | 2g | 各個 executor 使用的最大內存,不可超過單機的最大可以使用內存。 |
executor-cores | 2 | 各個 executor 使用的併發線程數目,也即每一個 executor 最大可併發執行的 Task 數目。 |
在不一樣模式、不一樣的設置下運行時,做業使用的資源狀況以下表所示:
節點 | 資源類型 | 資源量(結果使用上面的例子計算獲得) |
---|---|---|
master | core | 1 |
mem | driver-memroy = 4G | |
worker | core | num-executors * executor-cores = 4 |
mem | num-executors * executor-memory = 4G |
做業主程序(Driver 程序)會在 master 節點上執行。按照做業配置將分配 4G(由 —driver-memroy 指定)的內存給它(固然實際上可能沒有用到)。
會在 worker 節點上起 2 個(由 —num-executors 指定)executor,每個 executor 最大能分配 2G(由 —executor-memory 指定)的內存,並最大支持 2 個(由- -executor-cores 指定)task 的併發執行。
節點 | 資源類型 | 資源量(結果使用上面的例子計算獲得) |
---|---|---|
master | 一個很小的 client 程序,負責同步 job 信息,佔用很小。 | |
worker | core | num-executors * executor-cores+spark.driver.cores = 5 |
mem | num-executors * executor-memory + driver-memroy = 8g |
注意:這裏的 spark.driver.cores 默認是 1,也能夠設置爲更多。
若您有了一個大做業,使用 yarn-client 模式,想要多用一些這個集羣的資源,請參見以下配置:
注意:
--master yarn-client --driver-memory 5g –-num-executors 20 --executor-memory 4g --executor-cores 4
按照上述的資源計算公式,
master 的資源量爲:
workers 的資源量爲:
能夠看到總的資源沒有超過集羣的總資源,那麼遵循這個原則,您還能夠有不少種配置,例如:
--master yarn-client --driver-memory 5g –num-executors 40 --executor-memory 1g --executor-cores 2
--master yarn-client --driver-memory 5g –num-executors 15 --executor-memory 4g --executor-cores 4
--master yarn-client --driver-memory 5g –num-executors 10 --executor-memory 9g --executor-cores 6
原則上,按照上述的公式計算出來的須要資源不超過集羣的最大資源量就能夠。但在實際場景中,由於系統,hdfs 以及 E-MapReduce 的服務會須要使用 core 和 mem 資源,若是把 core 和 mem 都佔用完了,反而會致使性能的降低,甚至沒法運行。
executor-cores 數通常也都會被設置成和集羣的可以使用核一致,由於若是設置的太多,CPU 會頻繁切換,性能並不會提升。
當使用 yarn-cluster 模式後,Driver 程序會被放到 worker 節點上。資源會佔用到 worker 的資源池子裏面,這時若想要多用一些這個集羣的資源,請參加以下配置:
--master yarn-cluster --driver-memory 5g –num-executors 15 --executor-memory 4g --executor-cores 4
若是將內存設置的很大,要注意 gc 所產生的消耗。通常咱們會推薦一個 executor 的內存 <= 64G。
若是是進行 HDFS 讀寫的做業,建議是每一個 executor 中使用 <= 5個併發來讀寫。
若是是進行 OSS 讀寫的做業,咱們建議是將 executor 分佈在不一樣的 ECS 上,這樣能夠將每個 ECS 的帶寬都用上。好比有 10 臺 ECS,那麼就能夠配置 num-executors=10,並設置合理的內存和併發。
若是做業中使用了非線程安全的代碼,那麼在設置 executor-cores 的時候須要注意多併發是否會形成做業的不正常。若是會,那麼推薦就設置 executor-cores=1。