天天看點

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

問題描述

通過HDFS指令為目錄設定使用者群組的default acl權限,在該目錄下建立的子目錄時使用者群組的權限與設定的default acl權限不一緻,提示“#effective:r-x”

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決
  • 測試環境

1.Redhat7.6

2.采用root使用者操作

3.CM和CDH版本為5.16.2

4.HDFS啟用ACL權限控制

問題複現

1.使用cdhadmin使用者建立一個HDFS目錄

[root@cdh2 ~]# kinit cdhadmin
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl      
0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

2.為huet使用者和test組設定/tmp/testacl目錄default acl權限為rwx

[root@cdh2 ~]# hadoop fs -setfacl -m default:user:huet:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -setfacl -m default:group:test:rwx /tmp/testacl
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl      
0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

通過user::rwx,group::r-x,other::r-x可以看到與umask-mode定義的022一緻(即777 && 022=755,剛好對應user、group、other的權限)

3.在/tmp/testacl目錄下建立一個子目錄tt,并檢視acl權限

[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt      
0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

通過上圖可以看到父目錄設定的huet使用者和test組的default acl權限為rwx,但是建立的子目錄權限顯示為user:huet:rwx  #effective:r-x使用者群組的寫權限丢失。

問題分析

HDFS服務dfs.umaskmode, fs.permissions.umask-mode預設配置為022

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

rwx權限說明:

r(read)可讀權限,對應數字為4

w(write)可寫權限,對應數字為2

x(execute)可執行權限,對應數字為1

HDFS檔案或目錄的權限位是由9個權限位來控制,每三位為一組,他們分别是檔案屬主(Owner)的讀、寫、執行,使用者組(Group)的讀、寫、執行以及(Other)其它使用者的讀、寫、執行。由于HDFS預設的umask為022,是以我們在HDFS上建立目錄時目錄的權限為755(即777 && 022 為 755),即test使用者建立一個目錄/tmp/test

1)owner對目錄擁有rwx權限(7-0)

2)group對該目錄隻有r-x權限(7-2)

3)other user對該目錄隻有r-x權限(7-2)

是以這也就說明了為什麼在我們為指定目錄設定了default acl權限後,子目錄會出現繼承的權限與實際的設定的權限不一緻問題,接下來主要介紹兩種不同的方式修複問題。

問題解決

該問題在HDFS的JIRA中也有相應的記錄具體連結如下:

​​https://issues.apache.org/jira/browse/HDFS-6962​​

4.1方法一

通過指定HDFS的umask配置參數方式解決問題,該方式可以通過CM界面配置全局的,也可以在自己目前指令操作節點修改hdfs-site.xml配置檔案來實作。

1.把預設值022改成000

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

2.儲存配置并回到CM首頁重新開機過時服務

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

3.删除建立的tt子目錄在重新建立

[root@cdh2 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh2 ~]# hadoop fs -getfacl /tmp/testacl/tt      
0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

注意:之前已建立的目錄繼承的ACL權限是不會因為修改配置而更新,需要重新建立該目錄才可以。

4.2方法二

根據JIRA裡面描述HDFS提供了,給的解決方法是通過在hdfs-site.xml配置中将dfs.namenode.posix.inheritance.enabled設定為true,開啟此配置後在指定了default acl時則umask不起作用。

1.在CM界面修改配置 hdfs-site.xml的NameNode進階配置代碼段(安全閥)dfs.namenode.posix.acl.inheritance.enabled為true,點選儲存

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

2.由于該配置為NameNode的進階配置,隻需要重新開機NameNode服務即可

0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

3.删除建立的tt子目錄在重新建立

[root@cdh3 ~]# hadoop fs -rmr /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -mkdir /tmp/testacl/tt
[root@cdh3 ~]# hadoop fs -getfacl /tmp/testacl/tt      
0786-5.16.2-HDFS Default ACL繼承與umask沖突問題分析及解決

總結

1.針對HDFS Default ACL繼承與umask沖突問題可以通過兩種方式解決,一種是通過修改用戶端配置umask即可,一種是為NameNode服務添加進階配置dfs.namenode.posix.acl.inheritance.enabled為true的方式解決,指定該配置後子目錄在繼承權限時無視umask配置。

2.對于NameNode進階配置代碼段(安全閥)中的dfs.namenode.posix.acl.inheritan

ce.enabled的參數,在C5中預設是false,在C6中預設是true。

3.重新部署用戶端配置之前就建立的子目錄,更改用戶端配置之後權限仍然會繼承失敗,隻有在部署用戶端之後建立的子目錄才能正常繼承父目錄的權限。對于父目Default ACL的後續修改不影響現有子目錄的ACL。

繼續閱讀