本文介紹的Hadoop權限管理包括以下幾個模塊:
(1) 用戶分組管理 。用于按組為單位組織管理,某個用戶只能向固定分組中提交作業,只能使用固定分組中配置的資源;同時可以限制每個用戶提交的作業數,使用的資源量等
(2) 作業管理 。包括作業提交權限控制,作業運行狀態查看權限控制等。如:可限定可提交作業的用戶;可限定可查看作業運行狀態的用戶;可限定普通用戶只能修改自己作業的優先級,kill自己的作業;高級用戶可以控制所有作業等。
想要支持權限管理需使用Fair Scheduler或者 Capacity Scheduler(作業管理需用到Hadoop的ACL(Access Control List)功能,啟用該功能需選擇一個支持多隊列管理的調度器)
2. 基本術語
(1) 用戶(User) :Hadoop使用Linux用戶管理,Hadoop中的用戶就是Linux中的用戶
(2) 分組(group) :Hadoop使用Linux分組管理,Hadoop中的分組就是Linux中的分組
(3) 池(pool) :Hadoop Fair Scheduler中的概念,一個pool可以是一個user,一個group,或者一個queue。
(4) 隊列(Queue) :隊列是Hadoop提出的概念,一個Queue可以由任意幾個Group和任意幾個User組成。
3. Hadoop中Fair Scheduler與Capacity Scheduler介紹
3.1 Fair Scheduler
Facebook開發的適合共享環境的調度器,支持多用戶多分組管理,每個分組可以配置資源量,也可限制每個用戶和每個分組中的并發運行作業數量;每個用戶的作業有優先級,優先級越高分配的資源越多。
3.2 Capacity Scheduler
Yahoo開發的適合共享環境的調度器,支持多用戶多隊列管理,每個隊列可以配置資源量,也可限制每個用戶和每個隊列的并發運行作業數量,也可限制每個作業使用的內存量;每個用戶的作業有優先級,在單個隊列中,作業按照先來先服務(實際上是先按照優先級,優先級相同的再按照作業提交時間)的原則進行調度。
3.3 Fair Scheduler vs Capacity Scheduler
(1) 相同點
[1] 均支持多用戶多隊列,即:適用于多用戶共享集群的應用環境
[2] 單個隊列均支持優先級和FIFO調度方式
[3] 均支持資源共享,即某個queue中的資源有剩余時,可共享給其他缺資源的queue
(2) 不同點
[1] 核心調度策略不同。 計算能力調度器的調度策略是,先選擇資源利用率低的queue,然后在queue中同時考慮FIFO和memory constraint因素;而公平調度器僅考慮公平,而公平是通過作業缺額體現的,調度器每次選擇缺額最大的job(queue的資源量,job優先級等僅用于計算作業缺額)。
[2] 內存約束。計算能力調度器調度job時會考慮作業的內存限制,為了滿足某些特殊job的特殊內存需求,可能會為該job分配多個slot;而公平調度器對這種特殊的job無能為力,只能殺掉這種task。
(3) 功能上的不同
Fair Scheduler不允許配置每個user使用的slot數上限,但允許搶占資源 ;而Capacity scheduler允許配置每個user使用的slot數上限,但暫時不支持資源搶占 。
4. 用戶分組管理
以Fair Scheduler(http://hadoop.apache.org/common/docs/r0.20.0/fair_scheduler.html )為例,按以下步驟進行:
(1) 將Fair Scheduler的jar包拷貝到lib中
如:cp ${HADOOP_HOME}/contrib/fairscheduler/hadoop-fairscheduler-0.20.2+320.jar ${HADOOP_HOME}/lib/
(2) 配置Queue相關信息
具體參考:
http://hadoop.apache.org/common/docs/r0.20.2/cluster_setup.html#Configuring+the+Hadoop+Daemons
在mapred-site.xml中添加以下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<
property
>
<
name
>mapred.acls.enabled</
name
>
<
value
>true</
value
>
</
property
>
<
property
>
<
name
>mapred.queue.names</
name
>
<
value
>my_group,default</
value
>
</
property
>
<
property
>
<
name
>mapred.queue.my_queue.acl-submit-job</
name
>
<
value
> my_group</
value
>
</
property
>
<
property
>
<
name
>mapred.queue.default.acl-administer-jobs</
name
>
<
value
></
value
>
</
property
>
<
property
>
<
name
>mapred.queue.my_queue.acl-administer-jobs</
name
>
<
value
></
value
>
</
property
>
|
說明:
【1】 屬性mapred.queue.names是queue的所有名字,在這一名字中,必須有一個叫“default”的queue
【2】 每個queue均有一個屬性mapred.queue.<queue-name>.acl-submit-job,用于指定哪些user或者group可以向該queue中提交作業
【3】每個queue均有一個屬性mapred.queue.<queue-name>.acl-administer-jobs,用于指定哪些user或者group可以管理該queue中的所有作業,即可以kill作業,查看task運行狀態。一般而言,對于每個隊列,該選項為空即可,表示每個user只能管理自己的作業。
【4】 每個queue擁有的資源量和其他信息均在另外一個配置文件中指定(對于公平調度器,可以在fair-scheduler.xml中指定)
【5】 mapred.queue.<queue-name>.acl-submit-job和mapred.queue.<queue-name>.acl-administer-jobs配置方法如下:
用戶和用戶組之間用空格分開,用戶之間用“,”分割,用戶組之間用“,”分割,如果queue的屬性值中只有用戶組,則前面保留一個空格。
(3) 配置fair scheduler相關信息
在mapred-site.xml中添加以下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<
property
>
<
name
>mapred.jobtracker.taskScheduler</
name
>
<
value
>org.apache.hadoop.mapred.FairScheduler</
value
>
</
property
>
<
property
>
<
name
>mapred.fairscheduler.poolnameproperty</
name
>
<
value
>mapred.job.queue.name</
value
>
</
property
>
<
property
>
<
name
>mapred.fairscheduler.allocation.file</
name
>
<
value
>/home/XXX/hadoop/conf/fair-scheduler.xml</
value
>
</
property
>
|
說明:
mapred.fairscheduler.poolnameproperty有三個可用值:默認情況下是user.name,即每個用戶獨自一個pool;group.name,即一個linux group一個pool,mapred.job.queue.name,即一個queue一個pool,如果要支持“作業管理”,需使用最后一種配置。
(4) 創建文件fair-scheduler.xml,并添加以下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?
xml
version
=
"1.0"
?>
<
allocations
>
<
pool
name
=
"my_queue"
>
<
minMaps
>10</
minMaps
>
<
minReduces
>10</
minReduces
>
<
maxRunningJobs
>10</
maxRunningJobs
>
<
minSharePreemptionTimeout
>300</
minSharePreemptionTimeout
>
<
weight
>2.0</
weight
>
</
pool
>
<
user
name
=
"bob"
>
<
maxRunningJobs
>5</
maxRunningJobs
>
</
user
>
<
poolMaxJobsDefault
>25</
poolMaxJobsDefault
>
<
userMaxJobsDefault
>2</
userMaxJobsDefault
>
<
defaultMinSharePreemptionTimeout
>600</
defaultMinSharePreemptionTimeout
>
<
fairSharePreemptionTimeout
>600</
fairSharePreemptionTimeout
>
</
allocations
>
|
說明:
【1】各個字段的含義
<pool></pool>之間配置的是每個pool的信息,主要如下:
(a) minMaps:該pool可使用的map slot數
(b) minReduces:該pool可使用的reduce slot數
(c) maxRunningJobs:該pool最大運行作業數
(d) minSharePreemptionTimeout:該pool搶占資源的時間間隔,即本屬于自己的資源在改時間內拿不到便會搶占。
(e) Weight:pool的權重,該值越大,能夠從共享區(有一些pool中的資源用不完,會共享給其他pool)中獲取的資源越多。
<user></user>之間配置某個用戶的約束:
maxRunningJobs:該用戶可同時運行的作業數
<poolMaxJobsDefault></poolMaxJobsDefault>之間配置默認情況下每個pool最大運行作業數
<userMaxJobsDefault></userMaxJobsDefault>之間配置默認情況下每個user最大運行作業數
……
【2】 該配置文件中可動態修改無需重啟Hadoop(修改后3s會被重新加載)
5. 作業管理
作業管理模塊由Hadoop的ACL(http://hadoop.apache.org/common/docs/r0.20.2/service_level_auth.html )完成。
(1) 在core-site.xmll中配置以下屬性:
1
2
3
4
5
6
7
|
<
property
>
<
name
>hadoop.security.authorization</
name
>
<
value
>true</
value
>
</
property
>
|
(2) 配置${HADOOP_CONF_DIR}/hadoop-policy.xml
Hadoop有9個可配置的ACL屬性,每個屬性可指定擁有相應訪問權限的用戶或者用戶組。這9個ACL屬性如下:
這9個ACL的配置方法相同,具體如下:
每個ACL可配置多個用戶,用戶之間用“,”分割;可配置多個用戶組,分組之間用“,”分割, 用戶和分組之間用空格分割,如果只有分組,前面保留一個空格,如:
1
2
3
4
5
6
7
|
<
property
>
<
name
>security.job.submission.protocol.acl</
name
>
<
value
>alice,bob group1,group2</
value
>
</
property
>
|
說明: 用戶alice和bob, 分組group1和group2可提交作業
又如:
1
2
3
4
5
6
7
|
<
property
>
<
name
> security.client.protocol.acl </
name
>
<
value
> group3</
value
>
</
property
>
|
說明:只有group3可訪問HDFS
1
2
3
4
5
6
7
|
<
property
>
<
name
>security.client.protocol.acl</
name
>
<
value
>*</
value
>
</
property
>
|
說明:所有用戶和分組均可訪問HDFS
注意,默認情況下,這9個屬性不對任何用戶和分組開放。
該配置文件可使用以下命令動態加載:
(1) 更新namenode相關屬性: bin/hadoop dfsadmin –refreshServiceAcl
(2) 更新jobtracker相關屬性:bin/hadoop mradmin -refreshServiceAcl
6. 提交作業
用戶提交作業時,需用mapred.job.queue.name屬性告訴Hadoop你要將作業提交到哪個Queue中,具體如下:
(1) 如果你是用Java編寫Hadoop作業,用-D mapred.job.queue.name指明提交到哪個queue,如:
1
2
3
4
5
6
7
8
9
|
$HADOOP_HOME
/
bin
/
hadoop jar wordcount.jar wordcount \
-
D mapred.
map
.tasks
=
1
\
-
D mapred.
reduce
.tasks
=
1
\
-
D mapred.job.queue.name
=
infrastructure \
Input
ouput
|
(2) 如果你使用Hadoop Pipes編寫作業,用-D mapred.job.queue.name指明提交到哪個queue,如:
1
2
3
4
5
6
7
8
9
10
11
|
$HADOOP_HOME
/
bin
/
hadoop pipes \
-
D hadoop.pipes.executable
=
/
examples
/
bin
/
wordcount \
-
D hadoop.pipes.java.recordreader
=
true \
-
D hadoop.pipes.java.recordwriter
=
true \
-
D mapred.job.queue.name
=
my_group \
-
input
in
-
dir
-
output out
-
dir
|
(3) 如果你使用Hadoop Streaming編寫作業,用-D mapred.job.queue.name指明提交到哪個queue,如:
1
2
3
4
5
6
7
8
9
10
11
|
$HADOOP_HOME
/
bin
/
hadoop jar $HADOOP_HOME
/
hadoop
-
streaming.jar \
-
input
myInputDirs \
-
output myOutputDir \
-
mapper myPythonScript.py \
-
reducer
/
bin
/
wc \
-
D mapred.job.queue.name
=
my_group
|
7. 參考資料
http://hadoop.apache.org/common/docs/r0.20.2/cluster_setup.html#Configuring+the+Hadoop+Daemons
http://hadoop.apache.org/common/docs/r0.20.2/service_level_auth.html
http://hadoop.apache.org/common/docs/r0.20.0/fair_scheduler.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
