接上篇https://blog.csdn.net/w8998036/article/details/101522048,安裝好presto on yarn之後,presto集羣的coordinator主節點是由yarn自動分配的,那麼每次訪問presto的時候地址都會變,在程序中就沒法固定presto的連接參數,此問題可以由yarn node label來解決
使用node label需要結合yarn的隊列功能。
一.CapacityScheduler
Capacity Scheduler是一個hadoop支持的可插拔的資源調度器,它允許多租戶安全的共享集羣資源,它們的applications在容量限制之下,可以及時的分配資源。使用操作友好的方式運行hadoop應用,同時最大化吞吐能力和集羣利用率。
Capacity Scheduler提供的核心理念就是Queues(隊列),這些queues通常有管理員設定。爲了在共享資源上,提供更多的控制和預見性,Capacity Scheduler支持多級queue,以確保在其他queues允許使用空閒資源之前,資源可以在一個組織的sub-queues之間共享
找到hadoop/conf/capacity-scheduler.xml,配置隊列相關的參數。因爲我們環境是用ambri管理的,參數配置都在ui上
我的原始參數如下
yarn.scheduler.capacity.default.minimum-user-limit-percent=100
yarn.scheduler.capacity.maximum-am-resource-percent=0.2
yarn.scheduler.capacity.maximum-applications=10000
yarn.scheduler.capacity.node-locality-delay=40
yarn.scheduler.capacity.root.accessible-node-labels=*
yarn.scheduler.capacity.root.acl_administer_queue=*
yarn.scheduler.capacity.root.capacity=100
yarn.scheduler.capacity.root.default.acl_administer_jobs=*
yarn.scheduler.capacity.root.default.acl_submit_applications=*
yarn.scheduler.capacity.root.default.capacity=100
yarn.scheduler.capacity.root.default.maximum-capacity=100
yarn.scheduler.capacity.root.default.state=RUNNING
yarn.scheduler.capacity.root.default.user-limit-factor=1
yarn.scheduler.capacity.root.queues=default
root是所有隊列的父節點,在root下可以定義子節點及多級節點隊列
yarn.scheduler.capacity.root.queues=default 默認定義了default隊列,需要定義多個,後面值用逗號分隔如“default,apple,hive”
yarn.scheduler.capacity.root.default.capacity=75 定義default隊列使用的最大容量,75表示75%。該值需要滿足一個要求,即某個父節點下所有的隊列該值加起來必須爲100.如default=25,apple=35,hive=40
yarn.scheduler.capacity.root.default.maximum-capacity=100 定義default隊列最大可使用容量,該值要大於上面的值
其他參數的含義具體去百度。
二.Node Label
Node label是將相似特點的節點進行分組的一種途徑,application可以指定在哪裏運行。就是爲每個節點打上特定的標籤,使得具體應用可控制的分配到某個活某些節點上運行。
本例就需要將presto的coordinator主節點固定到某一個節點上,其他節點部署worker
首先在CapacityScheduler定義node label相關參數,我定義的參數如下
yarn.scheduler.capacity.default.minimum-user-limit-percent=100
yarn.scheduler.capacity.maximum-am-resource-percent=0.2
yarn.scheduler.capacity.maximum-applications=10000
yarn.scheduler.capacity.node-locality-delay=40
yarn.scheduler.capacity.root.accessible-node-labels=*
yarn.scheduler.capacity.root.accessible-node-labels.coordinator.capacity=100
yarn.scheduler.capacity.root.accessible-node-labels.worker.capacity=100
yarn.scheduler.capacity.root.acl_administer_queue=*
yarn.scheduler.capacity.root.capacity=100
yarn.scheduler.capacity.root.default.accessible-node-labels=*
yarn.scheduler.capacity.root.default.accessible-node-labels.coordinator.capacity=100
yarn.scheduler.capacity.root.default.accessible-node-labels.worker.capacity=100
yarn.scheduler.capacity.root.default.acl_administer_jobs=*
yarn.scheduler.capacity.root.default.acl_submit_applications=*
yarn.scheduler.capacity.root.default.capacity=100
yarn.scheduler.capacity.root.default.default-node-label-expression=worker
yarn.scheduler.capacity.root.default.maximum-capacity=100
yarn.scheduler.capacity.root.default.state=RUNNING
yarn.scheduler.capacity.root.default.user-limit-factor=1
yarn.scheduler.capacity.root.queues=default
yarn.scheduler.capacity.root.accessible-node-labels=* 定義root隊列可以進入的標籤,*代表所有,即root隊列可以使用任何標籤的node。多個可以逗號分割如“coordinator,worker”
yarn.scheduler.capacity.root.accessible-node-labels.coordinator.capacity=100 定義root隊列coordinator標籤可使用集羣的容量
yarn.scheduler.capacity.root.accessible-node-labels.worker.capacity=100 定義root隊列worker標籤可使用集羣的容量
yarn.scheduler.capacity.root.default.accessible-node-labels=* 定義default隊列可以進入的標籤,*代表所有,即root隊列可以使用任何標籤的node。多個可以逗號分割如“coordinator,worker”
yarn.scheduler.capacity.root.default.accessible-node-labels.coordinator.capacity=100 定義default隊列下coordinator標籤可使用default隊列的容量
yarn.scheduler.capacity.root.default.accessible-node-labels.worker.capacity=100 定義default隊列下worker標籤可使用default隊列d的容量
yarn.scheduler.capacity.root.default.default-node-label-expression=worker 定義default隊列默認使用的標籤爲worker。表示如果application提交任務時沒有指定label,那麼它就使用該值的label。如果要使用沒有label的節點,該值設置爲空格。
參數設置好之後,需要重啓yarn。
並刷新CapacityScheduler
然後在node集羣設置node的label
1.首先在系統添加label:yarn rmadmin -addToClusterNodeLabels coordinator,worker
查看系統label命令:yarn cluster --list-node-labels
刪除label命令:yarn rmadmin -removeFromClusterNodeLabels coordinator
2.設置節點label
查詢node信息:yarn node --list
添加node label:yarn rmadmin -replaceLabelsOnNode t007.wux.chin.seagate.com:45454,coordinator
刪除node label:yarn rmadmin -replaceLabelsOnNode t007.wux.chin.seagate.com:45454
查看node節點label:yarn node -status t007.wux.chin.seagate.com:45454
ui查看
三:問題
1.刷新CapacityScheduler時,Illegal capacity of 1.0 for children of queue root for label=coordinator
需要同時設置
yarn.scheduler.capacity.root.accessible-node-labels.coordinator.capacity=100
yarn.scheduler.capacity.root.accessible-node-labels.worker.capacity=100
及
yarn.scheduler.capacity.root.default.accessible-node-labels.coordinator.capacity=100
yarn.scheduler.capacity.root.default.accessible-node-labels.worker.capacity=100
2.刷新CapacityScheduler時,default cannot be found during refresh!
沒有設置default隊列
上述設置完成,使用前文的presto啓動命令啓動
bin/slider package --install --name PRESTO --package ../presto-yarn-package-1.6-SNAPSHOT-0.220.zip
bin/slider create presto1 --template appConfig-default.json --resources resources-default.json