掃一掃
關注微信公眾號

資源控制在大數據和云計算平臺中的應用
2018-11-29   多智時代

大數據227

大數據迅速發展的今天,很大一部分支持來自于底層技術的不斷發展,其中非常重要的一點就是系統資源的管理和控制, 大數據平臺 的核心就是對資源的調度管理,在調度和管理之后如何對這些資源進行控制便成了另一個重要的問題。大數據系統中用戶成千上萬的作業進程跑在集群中,如果不能對這些進程的資源進行控制,那么 大數據平臺 將變得舉步維艱,整個集群便會隨時崩潰。同時,大數據作業的調度也是基于資源的配額進行分配,大數據的作業本身就承載了資源配額的屬性,但是這些作業是否按照配額進行運行和計算,是否超過了指定的配額導致overuse,是否達不到指定的配額導致資源浪費,這一直以來都是 大數據平臺 面對和要解決的問題。

本文針對大數據平臺中資源控制這個層面來詳細介紹資源控制在不同操作系統上的具體技術實現,以及大數據平臺和資源控制的集成。

資源控制使用的系統功能

cgroup簡介

cgroup是Linux內核的一部分,cgroup可以為一組進程定義組群分配資源,這個組群分配資源可以包含CPU時間,內存,網絡帶寬,并且定義的這些資源分配可以動態修改。cgroup以一種層級結構(hierarchical)聚合和管理進程,將所有任務進程以文件夾的形式組成一個控制族群樹,子控制組自動繼承父節點的特定屬性,子控制組還可以有自己特定的屬性。

cgroup提供一些subsystem作為控制族群樹的根節點,所有的任務進程都以這些子系統為入口按樹狀結構設置資源配額。Red Hat Linux 7.3 提供 12 個 cgroup 子系統,根據名稱和功能列出如下。

cgroup各子系統功能

可通過以下命令查看操作系統支持的cgroup子系統,同時顯示各個子系統掛載的根目錄(也可以查看系統文件/proc/mount或者使用命令lssubsys -a):

cgroup的操作沒有提供系統API調用或者命令行,而是直接訪問cgroup mount的這個文件系統,舉個例子描述下cgroup接口的使用方式。

1. 創建一個目錄用于指定需要控制的作業進程,創建之后系統在會每一級自動生成所有的配置文件,可以將該目錄認為是一個資源控制組。

2. 添加需要的進程到該資源控制組,可以添加多個進程ID

3. 設置該資源控制組的物理內存使用配額

如果不進行設置,默認情況下,繼承根目錄的內存配置,即系統內存。

下面介紹下大數據系統中常用的配額設置。

內存:物理內存的設置文件為memory子系統下的memory.limit_in_bytes,虛擬內存為memory.memsw.limit_in_bytes。如果同時設置這兩個參數,需要先設置memory.limit_in_bytes,因為虛擬內存的配額只有在物理內存用完后開始生效。在Linux系統上,只有當物理內存消耗完后才開始消耗虛擬內存,超過配額后再申請的話就會觸發OOM kill掉進程。注意:OOM killer也可以關閉,需要向memory.oom_control中寫入1,這樣當進程嘗試申請的內存超過允許,那么它就會被暫停,直到額外的內存被釋放。

CPU:對CPU的配額控制是通過CPU子系統下的cpu.cfs_period_us和cpu.cfs_quota_us兩個參數控制。cpu.cfs_period_us表示重新分配CPU時間的周期,默認為 100000,即百毫秒。cpu.cfs_quota_us就是在這期間內可使用的 cpu 時間,默認 -1,即無限制。所以默認情況下CPU的使用為100%。如果需要將CPU的使用設置為50%,可以將 cpu.cfs_quota_us設為 50000,cpu.cfs_period_us保持100000,表示每隔100毫秒分配CPU時間,持續使用50毫秒。對CPU的限制不像內存,超過配額后再申請的話就會觸發OOM kill掉進程,CPU設置配額后進程不會超過該配額的使用。

JobObjects簡介

Windows平臺也有對應的內核對象用來控制作業對系統資源的訪問,而且控制的范圍比Linux廣,包括剪切板,關閉Windows的權限,窗口權限等。不同于Linux,Windows通過系統API來實現對作業對象的訪問。

Windows JobObjects支持的列表

Windows上使用內核作業對象的流程大概如下:

創建內核作業對象:調用::CreateJobObject()創建一個內核對象,剛創建的對象沒有和進程關聯。

把限制屬性設置到作業對象:調用:: SetInformationJobObject()可以設置如上列表中的限制屬性到該作業對象。

將進程加入到作業對象:調用:: AssignProcessToJobObject()將進程加入到作業中,如果該進程產生子進程,那么該子進程會自動成為作業的一部分。

關閉作業對象:調用:: CloseHandle()關閉作業對象的句柄。

需要注意以下幾點:

一個進程屬于一個作業對象之后,不能再assign給另一個作業對象。

在Windows開啟UAC的系統中,沒有提示權限的進程會被加入到一個默認的兼容性系統作業對象中,所以必須使用CREATE_BREAKAWAY_FROM_JOB參數創建進程使該進程脫離默認的作業對象。

新啟動的進程最好使用CREATE_SUSPEND參數這樣可以在進程啟動之前加入到作業對象中,防止起啟動的新的子進程逃離作業對象。

Windows對于內存的管理與Linux不同,Windows上的物理內存指的是WorkingSet,虛擬內存指的是committed memory,在Windows任務管理器中看的話物理內存指的是“工作設置(內存)”,虛擬內存指的是“提交大小”。CPU通過CpuRate設置,CpuRate的含義是線程在每10000個處理器調度周期內被調度的周期數,比如需要限制到20%,就設置CpuRate為2000。

下面直接以C++代碼為例來說明如果創建和管理作業對象,同時包含如何與ACE進程對象如何集成。

Docker容器資源控制

目前在Linux生態圈,用Docker發布和運行程序基本已經成為一個標準,同時用Docker管理本地私有云也越來越流行,尤其對于用Kubernetes管理的容器云,如何限制容器資源變得非常重要。

在RedHat上,Docker擁有自己的cgroup控制目錄,位于各個子系統下的system.slice的文件夾里面。當我們啟動一個docker容器之后,就會產生這個容器ID開頭的一個子目錄,用來配置這個容器里面的所有進程對系統資源的使用。

其中task目錄中存放的為容器中進程的PID,以我們這個示例來說,我們在容器中啟動了 /bin/sh 進程,這個進程ID為2730。

云計算中Docker容器的資源收集

目前通過Docker容器部署大數據平臺也比較流行,但是大數據平臺需要獲取每個節點運行環境的資源配額,對于已經運行在Docker容器里面的進程,如何判斷自己擁有多少系統資源也可以通過cgroup文件系統獲取。但是Docker容器里面看到的cgroup的文件目錄和宿主機不同,docker容器里面沒有system.slice文件夾,直接以/sys/fs/cgroup/開頭,可以通過命令查看。所以可以通過這個目錄下的memory.limit_in_bytes獲取容器自身的物理內存配額。對于容器中CPU core數目的獲取,可以通過這個公式獲取到近似的core數:min(1, (int)ceil(cpu.cfs_quota_us/cpu.cfs_period_us))。

用Kubernetes部署的容器平臺需要提前定義資源配額,否則容器可以使用到宿主機的所有資源,資源配額在YAML文件的resources中定義:

YARN容器管理

作為容器管理的平臺,Kubernetes主要用來在容器中部署分布式應用程序,YARN作為一個資源管理平臺也支持容器的管理,主要用來以容器的方式運行大數據作業。像Spark將YARN作為資源管理器運行Spark job。

YARN支持對現有容器大小的調整(cgroup和jobobjects都支持修改資源配額),當用戶從YARN申請了一些固定大小的容器,想改變容器資源配額的大小的時候不需要釋放掉這些容器重新申請,YARN支持動態改變已經分配的容器的大小。

結束語

隨著大數據和云計算技術的發展,資源控制和管理作為底層技術已經非常成熟,掌握這些技術便可以在大數據處理中游刃有余。

熱詞搜索:大數據 云計算

上一篇:網管福利!局域網幾大棘手問題及解決方案
下一篇:最后一頁

分享到: 收藏
評論內容
云南快乐十分开奖结果爱彩乐