1. 程式人生 > >淺談分散式叢集管理系統的一些細節【二】

淺談分散式叢集管理系統的一些細節【二】

本文始發於個人公眾號:TechFlow,原創不易,求個關注


今天是分散式專題的第12篇文章,我們繼續來看叢集資源管理系統。

上一篇的文章當中我們簡單瞭解了一下什麼是分散式叢集資源管理,它的誕生背景和解決的問題是什麼,以及它大概有哪些優點和不足。上一章的內容比較表面,沒有過多深入原理,這一篇文章我們一起來看看叢集管理系統的原理部分。

對一篇文章有所遺忘,或者是最新關注的同學可以點選下方的傳送門,回顧一下上篇的內容。

淺談分散式叢集資源管理系統原理

區域性優先的原則

在大資料應用的場景下有一個基本的設計原則:我們通常是將計算分配到儲存資料的節點執行,而不是從節點拿到需要的資料再來進行計算。這背後的原因很容易想通,因為這樣可以儘量減少節點之間的網路通訊,減少了資料傳輸。要知道大資料場景下的資料的規模是非常大的,動輒TB,PB,少則也有幾百幾十GB,一旦需要網路傳輸資料帶來的開銷是非常可觀的。

我們把這個原理總結一下,可以稱為”區域性優先“原則,也就是說執行任務的節點越區域性越好,如果在一臺物理機當中就太完美了,因為這樣可以避免所有的資料傳輸。

我們可以簡單地根據這個原則來衡量一個叢集排程系統的能力,我們根據區域性性的情況可以簡單地列出三種級別。第一種是節點區域性性,也就是所有的計算都發生在一個節點當中,這樣可以避免所有的資料傳輸,這也是最佳情況。第二種要差一些叫做機架區域性性,也就是說所有的計算雖然不能保證在一個節點當中執行,但是至少可以保證這些執行的機器在同一個機架當中。在機架當中的機器可以通過內部的方式傳輸資料,而不必藉助外部網路,這樣的傳輸也要快得多。最差的情況就是節點分散在不同的機架,沒有辦法做任何加速,這種稱為全域性區域性性,會帶來大量的開銷。

我們都知道一個好的叢集排程系統要把叢集當中所有機器的效能”壓榨“到極致,但實際上固定的計算消耗的計算資源基本上是穩定的。除了機器的利用率之外,另一個關鍵點就是這個。而且有時候網路IO帶來的開銷可能比機器低使用率更可怕。

資源分配細節

關於資源分配可能我們直觀理解上很簡單,當有機器空閒的時候我們就分配給它任務,然後執行完了我們把資源收回,但是在實際的運用當中還存在很多細節需要我們精心設計和思考,一旦稍微有點沒想清楚可能就會造成嚴重的後果。

我們來看兩個問題,第一個問題是當我們當下新來了一個任務,但是沒有足夠資源的時候應該怎麼辦?

我們很容易想到有兩種策略,第一種策略就是什麼也不做,等。等到有任務結束了,資源釋放出來了之後,我們再執行當前這個任務。但如果我們當前的任務是一個非常緊急的任務呢?有可能現在正在執行的任務優先順序並不高,但是佔用的資源又多又長,難道我們還要一直等下去嗎?

所以我們會想到還有第二者策略,就是搶。既然我們當下的資源優先順序高,正在執行的任務優先順序低。我們可以先從優先順序低的任務當中搶一部分資源過來,先把當下重要的任務執行了再說。等優先順序高的任務執行了之後再去執行優先順序低的。但是很遺憾,這麼做是有問題的。技術上的問題我們先不談,等會再說,有沒有想過這麼搞的話,還會有誰願意把任務的優先順序調低呢?肯定大家執行的任務都是最高優先順序。到後來會發現所謂的優先順序高低設定全部變成了擺設,正在執行的優先順序都一樣,都是最高優先順序。

關於上面的問題還有後續,我們先放一放,來看另外一個問題,這個問題是上面這個問題的衍生品。不同的任務需要的資源不同,並且需要資源的情況也不相同。比如有些任務資源多少都可以執行,比如spark或者是MapReduce,資源多就多用幾個機器,資源少就少用幾個,但是不管多少都可以跑,無非是執行的時間長短不同。但是有些任務就不是如此,比如機器學習的任務,可能一次性需要大量的資源,並且就要這麼多,少了就跑不了。那麼問題來了,當我們新來了一個任務,當下資源不足以滿足它分配需要的時候,我們是先留著不分配給它,等資源足夠了一次性分配呢,還是先分配一點,後面拿到一點資源再繼續分配呢?

你看,看起來平淡無奇的分配策略其實當中還是有很多棘手的細節。事實也的確如此,這也是為什麼我之前說目前的叢集資源管理系統還遠遠沒有成熟才剛剛起步的原因,因為對於以上的問題都沒有特別好的解決方案。

餓死與死鎖

還記得上面的兩個問題麼,如果這兩個問題沒有回答好,那麼就會出現餓死與死鎖的情況。

餓死是指任務一直得不到排程,比如由於設定的優先順序不合理。只有你一個老實孩子給自己覺得一個不太重要的任務設定了一個正常的優先順序,而其他的老司機紛紛給自己的任務設定了最高優先順序。由於一直有高優先順序的任務被提交進來,所以你的任務被一直延後,你以為很快就能得到結果,可能到下班你的任務還沒開始執行。在這種情況下,你要麼同流合汙,也把自己的任務設定成最高優先順序,要麼就只能一直等下去,或者因為完成的工作不夠多而面臨績效以及老闆的壓力。

於是,這就從了一個簡單的任務排程的問題上升到了內心價值觀的考驗,這也是一個經典的劣幣驅逐良幣的過程。由於少部分人的不遵守規則,導致反倒是遵守規則的人受到懲罰,想想真是男默女淚[狗頭]。

死鎖的情況比較容易理解,如果學過作業系統的同學應該很熟悉,原理是一樣的。打個比方,如果我們當下有AB兩個任務,這兩個任務都需要叢集2/3的資源才可以執行。由於這兩個任務是差不多時間點提交的,而系統採取了先來先分配的原則,給這兩個任務都分配了1/2的資源。那麼這就會導致死鎖,因為這兩個任務沒有一個能執行,也就沒有一個任務會釋放資源,所以除非人工kill掉一個,否則會一直如此持續下去。

從目前的情況來看,好像沒有一個完美的方法可以完全避免這兩種情況出現。只能架構師根據自己叢集呼叫的實際情況進行決策,並且還要加入一些人工干預的因素,比如在團隊當中約法三章制定一些規範和條例等等。也就是說,某種程度上來說這已經不只是一個系統的問題了,而是一個系統和團隊協調的複雜問題。

排程器

下面我們來看看常見的排程器的架構,常見的排程器有三種,第一種是集中式排程器,第二種是兩級排程器,最後一種是狀態共享排程器。

集中式排程器

我們先來看集中式排程器,它最直觀也最簡單:

它的設計邏輯就是集中,整個系統當中只有一個全域性的中央排程器。所有的框架或者是計算任務都由中央排程器來實現。有點像是封建時候的宗族制度,整個大家族當中所有的大事小事全部由一個人來管理。顯然這樣做的弊病非常多,剛才提到的兩個問題都需要人工干預,否則很難解決。

後來在此基礎上進行了改進,在整個中央排程器當中又加上了分支邏輯。這種排程器被稱為多路徑排程器:

整體而言變化不大,只是多了一個條件判斷。也就是說內部實現了針對不同種類的任務執行不同的排程和分配策略。比如如果是小的碎片任務,那麼執行優先順序管理,先來先得策略。如果是大的機器學習任務,只有拿到完整資源才會執行,防止死鎖等等。

相比於單路徑集中排程而言,多路徑集中排程增加了一些靈活性,但是整體的拓展性還是遠遠不夠,並且併發能力也比較差,資源的利用率不夠高,如果規模大了,排程效能很容易成為瓶頸。但是它勝在架構簡單,容易維護。

兩級排程器

由於集中式排程器有許多的問題,也不夠靈活,我們為了增加它的靈活性,在此基礎上又增加了一層結構:

我們同樣有一箇中央排程器來坐鎮指揮,只不過中央排程器並不會直接排程任務,而是會以一種比較粗粒度的策略將叢集當中的資源分配給框架排程器。具體排程、執行任務的邏輯在框架排程器當中。相比於中央排程器,框架排程器執行的策略會更加細粒度一些。

另外,只有中央排程器可以看到整個叢集當中所有資源的情況,框架排程器只能看到自己分配到的那一部分資源。我們比較熟悉的YARN,Mesos都是採取的這種架構。

有了框架排程器之後,我們可以在不同的框架排程器當中執行不同的策略。有助於提升整個叢集的併發能力,以及資源利用率。所以總體而言,兩級式排程器的效能要比集中式排程器好得多。

但是即使是這樣,也不是完美的。因為中央排程器在排程的時候執行的是一種悲觀併發的策略。簡單解釋就是在執行分配的過程當中,中央排程器會嚴格按照事先制定的順序,並且會對資源加鎖來防止不同框架申請資源時導致的衝突。既然用到了悲觀鎖,顯然也會影響整體的效能。

狀態共享排程器

狀態共享排程器的架構和兩級排程器非常接近,可以簡單理解成了去掉了中央排程器的結果:

這個架構最早出現在Google公司的Omega排程系統當中,Omega排程系統是現在非常火熱的Kubernetes的前身。它和兩級式排程器的最大的不同就是沒有中央排程器,所有的框架排程器可以直接看到整個叢集當中的所有資源。在需要使用資源的時候,由框架排程器之間互相競爭來獲取。

並且和中央排程器不同的是,狀態共享策略當中使用的是樂觀鎖。簡單解釋一下樂觀鎖和悲觀鎖的區別。悲觀鎖往往會假設最壞的情況,比如當下獲取了資源之後,在使用結束之前有可能會有其他的執行緒來訪問或者是修改,所以我們需要加上鎖來避免這樣的情況發生。

樂觀鎖則相反,基於樂觀假設,也就是說系統是基於能夠順利執行不會有資源搶佔的情況發生的前提進行的。也就是說先執行,執行之後如果發生了搶佔或者其他問題,那麼再來通過重試或者其他機制來解決。

即使在高併發場景當中,資源衝突也是一個相對來說的小概率時間。如果使用悲觀鎖顯然會帶來大量的加鎖的開銷,所以基於樂觀鎖的設計會使得系統的併發效能更強。但是這也是有代價的,樂觀鎖也不是完美的,如果真的發生了大量競爭衝突的情況,競爭失敗的一方往往需要重試任務,這會帶來很多不必要的開銷,也會造成資源的浪費。

另外由於所有框架之間的搶佔是自由的,也就是說有可能會出現高優先順序的框架一直搶佔資源,而低優先順序的任務被餓死的情況發生。在這種機制下是沒有辦法保證任務之間的公平性的。這也是削弱中央排程器帶來的必然後果。

總結

我們回顧一下以上三者策略,會發現這三者策略的演進順序其實就是中央排程器被削弱的順序。想想其實很容易理解,中央排程器強大可以維護整個叢集的公平性,但是由於效率比較低,很有可能會成為整個叢集的瓶頸。而中央排程器越弱,框架排程器的自由度越高,整個系統排程的靈活性越強,那麼也就意味著系統的效能往往越好。

有人打了一個比方非常經典,集中式排程器有些像是計劃經濟。所有一切都由國家來規劃,好處是可以保證公平,但是自由度和靈活性差,整個國家運轉和發展都不夠高效。兩級排程器有些像是大政府小市場的混合模式,政府的干預力度還是很大,但是多了一點自由性。而狀態共享器則是小政府大市場的自由競爭經濟模式,政府的干預幾乎沒有了,變成了看不見的手,這樣可以進一步提升靈活性和國家的運轉效率。但是國家的干預少了,當風險降臨的時候,也可能導致很大的問題。

某種程度上來說,和國家社會的制度沒有完美無缺的一樣,叢集排程的策略目前來看也沒有一個完美的,各有各的優勢和特長,需要我們結合實際情況,尋找適合我們問題場景的最佳方案,這也是我們學習這些底層原理而不只是停留在如何使用上的原因。

今天的文章就是這些,如果覺得有所收穫,請順手點個關注或者轉發吧,你們的舉手之勞對我來說很重要。

相關推薦

分散式叢集管理系統一些細節

本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天是分散式專題的第12篇文章,我們繼續來看叢集資源管理系統。 上一篇的文章當中我們簡單瞭解了一下什麼是分散式叢集資源管理,它的誕生背景和解決的問題是什麼,以及它大概有哪些優點和不足。上一章的內容比較表面,沒有過多深入原理,這一篇文章我們一起來看看

分散式叢集管理的原理,看看叢集究竟是做什麼的

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是分散式專題的第11篇文章,我們一起來聊聊分散式叢集資源管理。 在開始文章之前,我們先來問一個問題,為什麼是國際上是亞馬遜,國內是阿里這兩家公司雲端計算搞得最好呢?這兩家公司之間有一個巨大的共同點,就是它們都是電商公司。電商公司的特

C 語言中的結構體struct與聯合體union

## C語言中結構 struct 與聯合 union 語法基本一致,如下以 struct 為例 一、struct 的基本用法 struct student {     int num;     char* sex; &nbs

分散式儲存系統的資料分佈演算法

前言 分散式儲存系統 面臨著的首要問題,就是如何將 大量的資料 分佈在 不同的儲存節點 上。無論上層介面是 KV 儲存、物件儲存、塊儲存、亦或是 列儲存,在這個問題上大體是一致的。本文將介紹如何 分散式儲存系統 中 做資料分佈目標 及可選的 方案,並試著總結和權衡他們之間的

項目管理機制

世界 包括 原則 定性 smi pre 利益相關者 大型 審批 一.項目及項目管理 1.什麽是項目 要討論項目管理,就必須首先理解項目這個概念。項目是為完成某一獨特的產品或服務所做的一次性努力。項目一般要涉及一些人員,由這些人員完成一些相互關聯的活動,項目發起人通常希望能夠

分散式鎖--基於快取(Redis,memcached,tair)實現篇

淺談分散式鎖--基於快取(Redis,memcached,tair)實現篇: 一、Redis分散式鎖 1、Redis實現分散式鎖的原理:     1.利用setnx命令,即只有在某個key不存在情況才能set成功該key,這樣就達到了多個程序併發去set

分散式鎖--基於Zookeeper實現篇

淺談分散式鎖--基於Zookeeper實現篇: 1、基於zookeeper臨時有序節點可以實現的分散式鎖。其實基於ZooKeeper,就是使用它的臨時有序節點來實現的分散式鎖。 來看下Zookeeper能不能解決前面提到的問題。     鎖無法釋放:使用

分散式鎖--基於資料庫實現篇

淺談分散式鎖--基於資料庫實現篇 1、基於資料庫表     要實現分散式鎖,最簡單的方式可能就是直接建立一張鎖表,然後通過操作該表中的資料來實現了。     當我們要鎖住某個方法或資源時,我們就在該表中增加一條記錄,想要釋放鎖的

分散式鎖--簡介篇

淺談分散式鎖--簡介篇 1、什麼是分散式鎖(分散式系統用到的鎖):     分散式鎖,是單機鎖的一種擴充套件,主要是為了鎖住分散式系統中不同機器程式碼的物理塊或邏輯塊。以此保證不同機器之間的邏輯一致性。     在叢集等多伺服器

linux8:管理網路

配置IP 1,認識IP地址和子網掩碼             172.25.0.10/255.255.255.0     &n

git--分散式版本管理系統

參考部落格:廖雪峰的官方網站 一、window安裝git Git官網直接下載安裝程式,預設選項安裝即可。 1、設定自己的git(cmd命令或者git bash進入) git config --global user.name "myname" git config --global user.e

spring事務管理的2種方式:程式設計式事務管理和宣告式事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法

事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過

13、Zookeeper 分散式叢集管理技術

1.Zookeeper 簡介 Zookeeper 分散式服務框架主要是用來解決分散式應用中經常遇到的一些資料管理問題,提供分散式、高可用性的協調服務能力,在 FusionInsight 叢集中主要用途是儲存上層元件的元資料,並保證其主備倒換。 Zookeeper 的作用 (1)

mobx狀態管理

1.回憶redux redux:   action,store,reducer        Component action的觸發:一般通過手工去觸發,或通過元件去派發 store物件:store物件是通過redux的createStore建

分散式CAP定理

網際網路發展到現在,由於資料量大、操作併發高等問題,大部分網站專案都採用分散式的架構。而分散式系統最大的特點資料分散,在不同網路節點在某些時刻(資料未同步完,資料丟失),資料會不一致。 在2000年,Eric Brewer教授在PODC的研討會上提出了一個猜想:一致性、可用性和分割槽容錯性三者無法在分散式系

[轉]基於Vue+Spring MVC+MyBatis+Shiro+Dubbo開發的分散式後臺管理系統

最近專案中使用了shiro做許可權管理,在開發過程中也踩了一些坑,於是便有了開發個應用鞏固一下所學知識的想法,正好在開發的過程裡學習一下Vue開發。 技術棧方面,現在前後端分離大行其道,於是也採用了前後端分離的模式,前端基於Vue+Element,後端Web基於Spri

Android與Linux系統的差異

最近忙於查詢Linux和android平臺的資料,今天將其整理整理,根據本人拙見分享給大家。 Android和Linux作為現行主流的作業系統,無論在消費類產品還是在工控領域,都有廣泛的應用。都說Android系統是脫胎於Linux系統,那麼是不是Android是不是屬於Linux的一種

開源容器叢集管理系統Kubernetes架構及元件介紹

Kubernetes 作為Docker生態圈中重要一員,是Google多年大規模容器管理技術的開源版本,是產線實踐經驗的最佳表現。如Urs Hölzle所說,無論是公有云還是私有云甚至混合雲,Kubernetes將作為一個為任何應用,任何環境的容器管理框架無處不在。正因為如此

自定義View中一些常用的回撥方法

1. 構造方法 1.public View(Context context) 2.public View(Context context, @Nullable AttributeSet attrs) 3.public View(Context context, @Nulla

MySQL load data local infile細節 -- 從原始碼層面

相信大夥對mysql的load data local infile並不陌生,今天來鞏固一下這裡面隱藏的一些細節,對於想自己動手開發一個mysql客戶端有哪些點需要注意的呢? 首先,瞭解一下流程: 3個點: 1、Is '<path>/<filename>' exists?對於客