利用yarn多佇列實現hadoop資源隔離

2021-09-23 20:31:31 字數 2392 閱讀 6873

大資料處理離不開hadoop集群的部署和管理,對於本來硬體資源就不多的創業團隊來說,做好資源的共享和隔離是很有必要的,畢竟不像bat那麼豪,那麼怎麼樣能把有限的節點同時分享給多組使用者使用而且互不影響呢,我們來研究一下yarn多佇列做資源隔離

capacityscheduler

使用過第一代hadoop的同學應該比較熟悉mapred.job.map.capacity/mapred.job.reduce.capacity這個引數,無論是map還是reduce都可以配置capacity(也就是併發數),表示同時可以有多少個map(或reduce)執行,通過這個引數可以限制乙個任務同時占用的資源(節點)數,這樣不至於影響其他任務的執行。

在這裡有人會問:我把任務的priority設定成very low不就行了嗎?其實這樣在某些場景下不能解決全部問題,因為假如你乙個very low的任務剛啟動時沒有其他人的任務,那麼會先占用所有節點,如果你的每乙個task執行時間都是1天,那麼其他任務就算優先順序再高也只能傻等一天,所以才有必要做資源隔離

第二代hadoop因為使用yarn做資源管理,沒有了槽位的概念,所以就沒有了capacity。但是在yarn中專門有了capacityscheduler這個元件。這是乙個可插裝的排程器,它的用途就是對多使用者實現共享大集群並對每個使用者資源占用做控制

對於很豪的公司來說,每個使用者(團隊)自己有乙個hadoop集群,這樣可以提高自身的穩定性和資源**,但是確降低了資源利用率,因為很多集群大多數時間都是空閒的。capacityscheduler能實現這樣的功能:每個組固定享有集群裡的一部分資源,保證低保,同時如果這個固定的資源空閒,那麼可以提供給其他組來搶占,但是一旦這些資源的固定使用者要用,那麼立即釋放給它使用。這種機制在實現上是通過queue(佇列)來實現的。當然capacityscheduler還支援子佇列(sub-queue),

hadoop資源分配的預設配置

我在部落格中已經描述了整體一套hadoop搭建的方法。那麼在搭建完成後我們發現對於資源分配方面,yarn的預設配置是這樣的

也就是有乙個預設的佇列

事實上,是否使用capacityscheduler元件是可以配置的,但是預設配置就是這個capacityscheduler,如果想顯式配置需要修改 conf/yarn-site.xml 內容如下:

yarn.resourcemanager.scheduler.class

org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.capacityscheduler

上面圖中標明了預設佇列是default,是使用了capacityscheduler的預設配置

我們看一下有關這裡的default是怎麼配置的,見capacity-scheduler.xml配置:

yarn.scheduler.capacity.root.queues

default

the queues at the this level (root is the root queue).

這裡的配置項格式應該是yarn.scheduler.capacity..queues,也就是這裡的root是乙個queue-path,因為這裡配置了value是default,所以root這個queue-path只有乙個佇列叫做default,那麼有關default的具體配置都是形如下的配置項:

yarn.scheduler.capacity.root.default.capacity:乙個百分比的值,表示占用整個集群的百分之多少比例的資源,這個queue-path下所有的capacity之和是100

yarn.scheduler.capacity.root.default.user-limit-factor:每個使用者的低保百分比,比如設定為1,則表示無論有多少使用者在跑任務,每個使用者占用資源最低不會少於1%的資源

yarn.scheduler.capacity.root.default.maximum-capacity:彈性設定,最大時占用多少比例資源

yarn.scheduler.capacity.root.default.state:佇列狀態,可以是running或stopped

yarn.scheduler.capacity.root.default.acl_administer_queue:哪些使用者或使用者組可以管理佇列

當然我們可以繼續以root.default為queue-path建立他的子佇列,比如:

yarn.scheduler.capacity.root.default.queues

a,b,c

the queues at the this level (root is the root queue).

這是乙個樹結構,一般和公司的組織架構有關

配置好上述配置後執行

yarn rmadmin -refreshqueues

生效後發現yarn佇列情況類似下面的樣子(配置了兩個佇列:research和default):

go實現多佇列併發

1 場景描述 假設有乙個任務,分成a b c d四個步驟,四個步驟的耗時差別很大,且不同的任務可能是b的耗時最長,也有可能是d的耗時最長,步驟b和c依賴步驟a,步驟d依賴b和c。為了提高效能,故實現任務之間的併發。2 具體實現 用四個佇列分別完成任務中的每個步驟,佇列之間是併發的,佇列中可以順序執行...

利用陣列實現佇列操作

利用陣列實現佇列操作 說明 專案中有30臺分機,每台分機都可能發出請求,主機需要按順序響應這些請求.這是乙個fifo先進先出的佇列結構,但主機的cpu是微控制器,用鍊錶實現占用資源太多,所以嘗試用陣列實現.思路 定義1個陣列,用下標表示分機號,用其中的值表示在佇列中的位置.源 include 佇列長...

利用陣列實現佇列操作

利用陣列實現佇列操作 說明 專案中有30臺分機,每台分機都可能發出請求,主機需要按順序響應這些請求.這是乙個fifo先進先出的佇列結構,但主機的cpu是微控制器,用鍊錶實現占用資源太多,所以嘗試用陣列實現.思路 定義1個陣列,用下標表示分機號,用其中的值表示在佇列中的位置.源 include 佇列長...