0731-6.3.0-關於HDFS ACL的32個條目限制說明

  • 2019 年 11 月 20 日
  • 筆記

異常說明

  • 測試環境:

1.Redhat7.4

2.採用root用戶操作

3.CM和CDH為6.3.0

4.集群啟用了Sentry未開啟Kerberos

5.HDFS服務開啟了ACL

1.隨便為一個HDFS目錄設置ACL條目,當超過32個時會報一下錯誤。

[root@ip-172-31-13-38 ~]# sh a.sh  setfacl: Invalid ACL: ACL has 33 access entries, which exceeds maximum of 32.  setfacl: Invalid ACL: ACL has 33 access entries, which exceeds maximum of 32.  setfacl: Invalid ACL: ACL has 33 access entries, which exceeds maximum of 32.  setfacl: Invalid ACL: ACL has 33 access entries, which exceeds maximum of 32.  setfacl: Invalid ACL: ACL has 33 access entries, which exceeds maximum of 32.  [root@ip-172-31-13-38 ~]# hadoop fs -getfacl /acl_test  # file: /acl_test  # owner: root  # group: supergroup  user::rwx  user:fayson:r--  user:fayson1:r--  user:fayson10:r--  user:fayson11:r--  user:fayson12:r--  user:fayson13:r--  user:fayson14:r--  user:fayson15:r--  user:fayson16:r--  user:fayson17:r--  user:fayson18:r--  user:fayson19:r--  user:fayson2:r--  user:fayson20:r--  user:fayson21:r--  user:fayson22:r--  user:fayson23:r--  user:fayson24:r--  user:fayson25:r--  user:fayson26:r--  user:fayson27:r--  user:fayson3:r--  user:fayson4:r--  user:fayson5:r--  user:fayson6:r--  user:fayson7:r--  user:fayson8:r--  user:fayson9:r--  group::r-x  mask::r-x  other::r-x

解決辦法

2.1 方法1

1.在設置ACL的時候帶上default前綴。

[root@ip-172-31-13-38 ~]# hadoop fs -setfacl -m default:user:fayson2:r-- /acl_test

可以看到命令沒有報錯,而且執行正常。

2.創建一個子目錄,發現子目錄會繼承父目錄的default的ACL

[root@ip-172-31-13-38 ~]# hadoop fs -mkdir /acl_test/acl_test1  [root@ip-172-31-13-38 ~]# hadoop fs -getfacl /acl_test/acl_test1

3.此時再對父目錄增加一個default的ACL,看看子目錄的ACL情況。

[root@ip-172-31-13-38 ~]# hadoop fs -setfacl -m default:user:fayson28:rwx /acl_test  [root@ip-172-31-13-38 ~]# hadoop fs -getfacl /acl_test  [root@ip-172-31-13-38 ~]# hadoop fs -getfacl /acl_test/acl_test1

可以看到子目錄沒有繼承父目錄新的default的ACL條目,說明只是在第一次創建的時候會繼承。

2.2 方法2

1.使用Sentry為一張表賦予超過32個group的許可權。

0: jdbc:hive2://localhost:10000> create role acl_test;  0: jdbc:hive2://localhost:10000> grant all on default.test to role acl_test;  0: jdbc:hive2://localhost:10000> grant role acl_test to group fayson01;  0: jdbc:hive2://localhost:10000> grant role acl_test to group fayson02;  ...  0: jdbc:hive2://localhost:10000> grant role acl_test to group fayson32;  0: jdbc:hive2://localhost:10000> grant role acl_test to group fayson33;

2.檢查HDFS對應目錄的ACL條目。

發現並沒有報錯,在超過32個ACL條目的情況下,所有Sentry中對group賦權都同步到了底層的HDFS。

總結

1.HDFS ACL條目32個限制的討論你可以參考Apache Hadoop的jira:HDFS-7447:

https://issues.apache.org/jira/browse/HDFS-7447

該jira里主要討論了為什麼會有這個限制:這樣做主要有2個原因:簡化管理和限制資源消耗。一個HDFS的目錄如果有大量ACL條目往往看上去不是太好理解,這種需求往往可以通過更好的劃分用戶和用戶組的關係來更好的去實現。同時具有大量ACL條目後會消耗集群更多的存儲和記憶體,對於NameNode來說也需要消耗更多的時間來做許可權檢查,從而影響整個集群的性能。為什麼HDFS的ACL條目是32是與Linux的ext文件系統的最大ACL條目一致的。關於HDFS的這個設計你可以參考:

https://issues.apache.org/jira/secure/attachment/12627729/HDFS-ACLs-Design-3.pdf

2.對於這個問題,HDFS社區有一個jira進行一個簡單的提升,即一個目錄的default和特定的(specific) ACL是兩種不同的類型,每個都可以最大設置32,所以整個ACL條目可以超過32到達64,具體可以參考:

https://issues.apache.org/jira/browse/HDFS-7582

這個jira在CDH5.12.2, CDH5.13.1和CDH5.14.0及更高版本已經修復。註:default ACL一般是子目錄繼承的父目錄的ACL,主要是在創建子目錄的時候會直接繼承父目錄的default的ACL。

3.在CDH之上,對於Hive/Impala表,在使用Sentry後,並同時開啟HDFS ACL與HDFS ACL同步後,對於Hive表的目錄是可以超過32個條目限制的。

在實際使用中我們給出如下建議:

1.如果是Hive表,使用Sentry後超過32個ACL條目沒問題,你可以進行相關設置。

2.如果是HDFS目錄,你最好調整用戶和組的關係,或者整理好用戶和組的對應關係,在設置ACL條目的時候盡量以group來設置,然後控制到32個以內。

3.對於HDFS目錄,對於替代方案,你如果非要超過32個ACL,你可以在這些目錄上建立Hive表(雖然這個表你可能不使用),然後通過Sentry來賦權後來實現超過32個的目的。

我們建議你使用1+2的組合方式,其實更多的是整理好user和group的對應關係,來更好的管理HDFS ACL,畢竟ACL多了確實管理困難以及影響集群性能。

Tags: