Spark Streaming實時長時服務(wù)與MapRedue、Spark乙墙、Hive等批處理應(yīng)用共享YARN集群資源际看。在共享環(huán)境中,經(jīng)常因一個批處理應(yīng)用占用大量網(wǎng)絡(luò)資源或者CPU資源導(dǎo)致Spark Streaming資源被搶占盖高,服務(wù)不穩(wěn)定慎陵。
該實驗在hadoop-2.7.1下操作
創(chuàng)建Label存儲目錄
為了label的高可用(在ResourceManager重啟時候),我們需要為Lalel在HDFS上創(chuàng)建存儲目錄喻奥,用來存儲Label元信息席纽。
sudo su hdfs
hadoop fs -mkdir -p /yarn/node-labels
hadoop fs -chown -R yarn:yarn /yarn
hadoop fs -chmod -R 700 /yarn
為YARN配置Node Label
我們需要將下列配置添加到y(tǒng)arn-site.xml
添加下列配置開啟Label Scheduler
<property>
<name>yarn.node-labels.enabled</name>
<value>true</value>
</property>
添加下列配置,label元數(shù)據(jù)在hdfs上的存儲路徑
<property>
<name>yarn.node-labels.fs-store.root-dir</name>
<value>hdfs://<host>:<port>/<absolute_path_to_node_label_directory></value>
</property>
添加下列配置撞蚕,為YARN配置capacity scheduler
label scheduler無法單獨使用润梯,而且只能配合capacity scheduler策略使用
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
重啟ResourceManager
由于我們對yarn-site.xml做了修改,所以我們需要重啟ResourceManager讓配置生效甥厦。
# stop rm
$HADOOP_HOME/sbin/yarn-daemon.sh stop resourcemanager
# start rm
$HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager
添加Label
sudo su yarn
yarn rmadmin -addToClusterNodeLabels "<label1>(exclusive=<true|false>),<label2>(exclusive=<true|false>)"
NOTE:
exclusive
并不是必須的參數(shù)纺铭,默認值為true
你可以通過下列命令來刪除集群的Label
yarn rmadmin -removeFromClusterNodeLabels "<label1>,<label2>"
NOTE: 如果某個Label已經(jīng)關(guān)聯(lián)Queue,那么你無法從集群中將其移除
關(guān)聯(lián)Node Label和Cluster Label
運行下列命令刀疙,將節(jié)點Label關(guān)聯(lián)到集群Label上舶赔。
yarn rmadmin -replaceLabelsOnNode "<node1>:<port>=<label1> <node2>:<port>=<label2>"
NOTE: 節(jié)點的Label必須包含在集群的Label中。也就是說我們在上一步中配置的集群Label為節(jié)點Label的全集谦秧。
如果想為節(jié)點刪除Label竟纳,我們也可以通過replaceLabelsOnNode
命令來操作,我們只要將Label
參數(shù)置為空即可油够。例如蚁袭,我們可以通過下列命令來將node-1.example.com
節(jié)點的Label
置空。
sudo su yarn
yarn rmadmin -replaceLabelsOnNode "node-1.example.com"
關(guān)聯(lián)Queue和Node Label
<configuration>
<!-- 父隊列root的相關(guān)配置 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>x,y</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.a.capacity</name>
<value>100</value>
<description>root隊列對a標簽節(jié)點可用的百分比</description>
</property>
<!-- 隊列x的相關(guān)配置 -->
<property>
<name>yarn.scheduler.capacity.root.x.capacity</name>
<value>50</value>
<description>x隊列可用root隊列資源的百分比</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.x.maximum-capacity</name>
<value>100</value>
<description>x隊列資源使用上限</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.x.accessible-node-labels</name>
<value>a</value>
<description>x隊列應(yīng)用可用的節(jié)點標簽</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.x.default-node-label-expression</name>
<value>a</value>
<description>x隊列應(yīng)用默認節(jié)點標簽</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.x.accessible-node-labels.a.capacity</name>
<description>x隊列對a標簽節(jié)點可用的百分比</description>
<value>100</value>
</property>
<!-- 隊列y的相關(guān)配置 -->
<property>
<name>yarn.scheduler.capacity.root.y.capacity</name>
<value>50</value>
</property>
</configuration>
NOTE:
1.獲取更多配置
2.如果我們想讓某個隊列的使用沒有標簽的節(jié)點石咬,那么我們必須將yarn.scheduler.capacity.<queue-path>.accessible-node-labels
設(shè)置為空格揩悄,例如:<property> <name>yarn.scheduler.capacity.root.y.accessible-nod-labels</name> <value> </value> </property>
3.擁有相同父隊列的隊列的
yarn.scheduler.capacity.<queue-path>.capacity
之后必須等于100
刷新隊列
在配置完capacity-scheduler.xml之后,我們需要刷新下隊列鬼悠,讓配置生效删性。
sudo su yarn
yarn rmadmin -refreshQueues
驗證
我們可以啟動個spark shell來驗證下yarn label scheduler是否正確開啟。
bin/spark-shell \
--master yarn \
--deploy-mode client \
--driver-memory 2g \
--executor-memory 1g \
--executor-cores 1 \
--queue x \
--num-executors 2
遇到的問題
Q1:提交任務(wù)一直處于ACCEPTED狀態(tài)
任務(wù)處于ACCEPTED狀態(tài)說明該任務(wù)所在的隊列沒有可用的資源焕窝。一開始的時候我忘記配置
yarn.scheduler.capacity.root.accessible-node-labels.a.capacity
蹬挺,導(dǎo)致x隊列無可用資源。
Q2:小任務(wù)餓死
capacity scheduler其實是多隊列的FIFO調(diào)度它掂,所以存在任務(wù)餓死的可能性巴帮,又由于我們實驗環(huán)境采用2.7.1版本的hadoop溯泣,無法開啟capacity scheduler的資源搶占功能,導(dǎo)致在有大任務(wù)運行時榕茧,小任務(wù)提交無法分配到資源垃沦,最終餓死。