hadoop技術探索之三

本章節繼續介紹HDFS的一些概念和功能。

一、配額

  • HDFS允許管理員爲某個目錄設置文件名字配額,即是指在文件的拓撲樹中以該目錄爲根的所有文件數目總和上限。超過配額時是不能夠在該目錄裏新建目錄或上傳文件了。最大的配額是Long.Max_Value。在統計一個目錄的所有文件數目時,目錄本身也包括在內,故如果設置名字配額爲1的話,將會使該目錄保持爲空。

 管理命令:

 設置名字配額:hdfs dfsadmin -setQuota <N> <directories> ......

 刪除名字配額:hdfs dfsadmin -clrQuota <directories> ......

  • HDFS允許管理員爲某個目錄設置空間配額,即指在文件的拓撲樹中以該目錄爲根的所有文件的字節數總和的上限。最大配額是Long.Max_Value。創建空文件或目錄不會計算配額,但當在分配文件的block時,要寫入整個block時,文件將會超出配額限制,此時block分配就會失敗,這個block就無法寫入文件。文件的副本都會計算進配額裏。

 管理命令:

 設置空間配額:hdfs dfsadmin -setSpaceQuota <N> <directories> ......

 刪除空間配額:hdfs dfsadmin -clrSpaceQuota <directories> ......

  • HDFS運行管理員設置目錄的存儲類型配額,即指在文件的拓撲樹中以該目錄爲根的所有文件能夠使用的存儲類型。如果要使用存儲類型配額,必須爲該目錄設置存儲策略。

 管理命令:

 設置存儲類型配額:hdfs dfsadmin -setSpaceQuota <N> -storageType <storageType><directories> ......

 刪除存儲類型配額:hdfs dfsadmin -clrSpaceQuota -storageType <storageType> <directories> ......


配額信息被持久保存在fsimage文件裏。如果在啓動時,fsimage已經違反了配額限制,就會打印一些告警信息。在設置和刪除配額時都會產生日誌記錄。

HDFS提供了查詢目錄詳細統計信息的命令:

hadoop fs -count -q [-h] [-v] [-t [comma-separated list of storagetypes]] <directory>...<directory>

可以統計目標目錄包含的總的目錄數、文件數、總的字節大小、各種配額值及剩餘值等信息。

二、權限管理

HDFS提供了與POSIX模型相似的權限模型。每個文件或目錄都有所有者權限、所屬組內用戶權限、其它用戶權限三種權限限制。對於文件,r表示可以讀取文件、w表示可以寫文件及追加文件。對於目錄,r表示可以列出目錄內容、w表示可以創建或刪除文件或目錄、x表示可以訪問目錄的子目錄。

與POSIX模型不同的是,HDFS的權限模型中沒有設置用戶標識、沒有設置用戶組標識,對於文件也沒有“可執行”這樣的概念。可以爲目錄設置粘滯位,用來防止除管理員用戶、所屬用戶、所屬組內用戶之外的其它用戶刪除和移動目錄裏的文件。對文件設置粘滯位是沒有效果的。HDFS的文件權限和目錄權限是不同的。

當創建文件或目錄時,它的所有者即是客戶端進程的用戶,它的所屬組即是其父目錄的所屬組。

HDFS也支持POSIX ACLs細粒度角色權限控制。

從hadoop0.22開始,hadoop提供了兩種用戶身份驗證方式,配置參數是hadoop.security.authentication,可選值如下:

  1.  simple:這種模式的客戶端進程用戶身份是由操作系統來決定的。
  2.  kerberos:這種模式的客戶端進程的用戶身份是由kerberos證書來決定的。即你的客戶端的kerberos票據裏的principal就是你操作HDFS的用戶。

用戶身份確定了,接下來就是決定用戶組。在後面會詳細介紹hadoop group mapping服務。

用戶權限檢查,所有的HDFS操作都會對文件路徑上的所有部分進行權限校驗,而不是單單對最後一部分進行權限檢查。例如請求的文件路徑是/foo/bar/file,那麼操作用戶對/、/foo、/foo/bar目錄都必須有X權限。

運行NameNode進程的用戶即是HDFS的super-user。

通過設置dfs.namenode.acls.enabled爲true,使HDFS支持ACLs。

  1. 基本acl記錄:user::permission,group::permission,other::permission
  2. 可以指定用戶:user:username:permission
  3. 可以指定組:group:groupname:permission
  4. 對於目錄可以設置默認acl,表示該目錄下的所有新建的子目錄或文件都會繼承此acl:default:user::permission,default:user:username:permission,default:group::permission,default:group:groupname:permission,default:other::permission
  5. 可以設置mask,默認是mask:rwx,每個生效的acl都會按此mask進行過濾,類似每個acl記錄的權限與此mask設置的權限進行按位與運算:mask::permission

ACL的shell命令:

  • hdfs dfs -getfacl [-R] <path>  獲取文件或目錄的acl記錄,-R參數表示遞歸所有文件;
  • hdfs dfs -setfacl [-R] [-b |-k ][-m |-x <acl_spec>]|[--set <acl_spec>] <path>    爲文件或目錄設置acl。-R表示遞歸所有文件;-b表示刪除除基本acl之外的所有acl記錄;-k表示刪除default acl;-m表示修改某個acl的權限值,修改的acl作爲新記錄,原先的acl記錄保留;-x表示刪除某個acl記錄;--set是設置acl,設置acl時,acl列表必須包含基本acl。

權限相關參數配置:

  1. dfs.permissions.enabled true
  2. dfs.web.ugi  webuser,webgroup
  3. dfs.permissions.superusergroup supergroup
  4. fs.permissions.umask-mode 0022
  5. dfs.cluster.administrators 管理員
  6. dfs.namenode.acls.enabled true
  7. dfs.namenode.posix.acls.inheritance.enabled 默認true,表示新建的文件或目錄將會繼承父目錄的默認acl。如果設置爲false,則會使用客戶端的umask

三、hadoop group mapping

hadoop提供了多種group mapping機制,配置參數是hadoop.security.group.mapping。可選配置值如下:

  • org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback:這個是默認的實現機制。當JNI可用時,它就會使用hadoop的api來決定用戶所屬的用戶組列表。如果JNI不可用的話,就使用ShellBasedUnixGroupsNetgroupMapping機制
  • org.apache.hadoop.security.JniBasedUnixGroupsNetgroupMappingWithFallback:與上一個實現機制類似,如果JNI可用,就使用hadoop API選擇用戶組。如果JNI不可用,就使用ShellBasedUnixGroupsNetgroupMapping機制。
  •  org.apache.hadoop.security.ShellBasedUnixGroupsMapping:這種實現機制與linux下執行‘sh -c group’結果相同。
  •   org.apache.hadoop.security.ShellBasedUnixGroupsNetgroupMapping:這種實現機制和linux下執行getent命令的結果相同。
  • org.apache.hadoop.security.LdapGroupsMapping:這是由LDAP服務來決定用戶組。使用的是LDAP上的用戶組,而不是Unix系統的用戶組。支持SSL連接,支持POSIX用戶組語義。
  • org.apache.hadoop/security.CompositeGroupsMapping:這是一種將其他用戶組映射服務提供者混合起來使用的一種機制。
hadoop的用戶到組的映射是由NameNode來完成的。

可以通過參數hadoop.user.group.static.mapping.overrides來配置一些用戶到組的映射關係,覆蓋其它的用戶組映射。其格式如:user1=group1,group2;user2=;user3=group2;......

hadoop會緩存由用戶組映射服務提供的組信息。緩存保存時長是通過配置hadoop.security.groups.cache.secs參數決定,默認是300s。緩存到期後,下一次請求組內成員的線程就會到組映射服務的提供者那裏重新查詢當前的用戶組信息。當某個線程正在從組映射服務上查詢組信息時,該線程就進入阻塞,其它任何請求相同用戶組的線程都會使用之前緩存的信息。如果一次刷新用戶組緩存信息的操作執行失敗了,就會讓下一次線程來再次執行刷新操作。當刷新用戶組信息的操作執行超過hadoop.security.groups.cache.secs*10秒後依然是吧,緩存依然沒有更新的話,緩存的信息就會清空,所有請求用戶組信息的線程都會阻塞直到重新加載成功。

爲了防止因緩存過期而出現的線程阻塞,必須設置hadoop.security.groups.cache.backgroud.reload爲true。同時可以設置hadoop.security.groups.cache.backgroud.reload.threads參數,這個參數默認值是3,這將會在後臺創建一個線程池用來刷新緩存。這兩個參數作用就是,在緩存記錄過期後,新的請求緩存記錄的操作執行時,後臺就會向刷新緩存的任務隊列中添加一個任務,當該刷新任務執行失敗後,新的請求來時就會再次向隊列中添加一個新的任務。

爲了防止未知用戶不斷請求NameNode,hadoop提供消極緩存策略,這樣當從用戶組映射服務查詢用戶組記錄爲空,就直接返回空的用戶組,不會再進行更多的查詢。參數hadoop.security.groups.negative-cache.secs,默認是30秒,表示當查詢用戶組爲空時,30秒內不會進行新的查詢。

四、存儲類型和存儲策略

存儲類型:Archive、Disk、SSD和RAM_Disk。其中,Archive存儲類型是高密度、廉價存儲,用於歸檔存儲。RAM_Disk存儲支持在內存中寫一個文件副本。Disk存儲是默認存儲類型。

存儲策略:Hot、Warm、Cold、All_SSD、One_SSD和lazy_Persist。

  1. Hot:那些常用的和正在處理的數據存儲使用這個策略。當一個block是Hot的,它所有的副本都按Disk類型存儲。
  2. Warm:部分Hot及部分Cold。當一個block是Warm,它的一部分副本將按Disk存儲,剩餘的按Archive存儲。
  3. Cold:僅用於參與有限計算的數據的存儲。這些數據基本是不再使用的數據,或者是將要從熱存儲轉移到冷存儲的歸檔數據。當一個block是冷的,它所有的副本均被按Archive類型存儲。
  4. All_SSD:所有副本使用SSD存儲。
  5. One_SSD:一個副本使用SSD存儲,剩餘的使用Disk。
  6. Lazy_Persist:將block的一個副本寫進內存中,按RAM_Disk存儲,剩餘的按Disk惰性的保存。

一個存儲側率正式的應該有以下幾個部分構成:

  1. 策略ID。
  2. 策略名字。
  3. block安置的存儲類型列表。
  4. 創建文件時的後備存儲類型列表。
  5. 副本的後備存儲類型列表。
當存儲空間足夠時,block的副本都會按照上面第3條規定的存儲類型來存儲。當上面第3條的存儲類型將要超出空間限制時,超出部分的文件創建和備份將會分別按照上面第4及第5條所列的存儲類型列表存儲。

標準的存儲策略表:


Lazy_Persist策略僅僅對只有一個副本的block有用。對於有多個副本的block,只有一個副本存在內存,其它的存儲在磁盤,這樣對整體性能不會有提升。

對於使用條狀式存儲的EC(糾錯碼)文件,適合的存儲策略是All_SSD、Hot、Cold。如果你想要爲EC文件設置其它的存儲策略,在block的創建和移動時,設置的策略也不會作用。

策略相關命令:

  • 設置策略:hdfs storagePolicies -setStoragePolicy -path <path> -policy <policy>,爲某個目錄設置存儲策略。
  • 策略撤銷:hdfs storagePolicies -unsetStoragePolicy -path <path>,撤銷某個目錄的存儲側率配置。
  • 查詢策略:hdfs storagePolicies -getStoragePolicy -path <path>,獲取某個目錄的策略配置。
策略相關配置項:

  1. dfs.storage.policy.enabled:使用或禁用存儲策略特徵。默認是true。
  2. dfs.datanode.data.dir:配置datanode的數據存放路徑。多個路徑使用逗號分割。例如[DISK]/disk01,[SSD]/disk02,[ARCHIVE]/disk03,[RAM_DISK]/disk04。
對於歸檔數據,hadoop提供了數據遷移工具mover。命令行格式:hdfs mover [-p <files or dirs> | -f <local files>],其中-p參數後面跟的是要遷移的以空格分隔的hdfs文件或目錄列表,-f表示遷移包含hdfs文件或目錄的本地文件,如果-p和-f都沒有指定,默認是遷移根目錄。這個工具會週期檢查文件或目錄,如果其違反了存儲策略,就按存儲策略將其遷移到合適的存儲類型。一般是選擇在同節點內進行遷移工作,但是如果同節點沒有合適的存儲類型就會選擇其他節點。

五、機架感知

HDFS在備份文件時,有一個機架感知能力,這個特徵就是,通常文件的備份因子是3,那麼在客戶端寫文件時,第一個副本寫策略是,假如客戶端所在主機有DN,則第一個副本就寫入本地DN,但如果客戶端不在任何一臺DN上,則會選擇一臺隨機的DN寫入;第二個副本寫策略是,選擇與第一個副本不同的機架上的一臺DN寫入;第三個副本寫策略是,選擇與第二個副本同機架的其它DN寫入。如果配置的備份因子數大於3,那麼從第4個副本開始,寫策略就是,隨機寫入所有DN,但要求每個機架上副本數上限是(replicas-1)/racks+2,其中replicas是複製因子,racks是機架數。NN要求DN上不得存在重複的副本,故複製因子的大小不得大於DN的總數。默認情況下,HDFS是不啓用機架感知能力的。

機架感知能力是通過將block的副本安放在不同的機架上,以達到容災目的。這樣在集羣的網絡交換機出現故障或者數據分區時,它會保證數據的可靠性。

HDFS想啓用機架感知能力,必須要在core-site.mxl裏配置相應的參數。

NN的主守護進程會通過傳遞DN的主機名或IP到配置文件裏配置的外部腳本或java類來獲得集羣的機架ID。通過java類或外部腳本,都需要保證DN主機與機架之間的一對一關係。NN會在內存中保存機架/主機的拓撲映射,其格式是"/rack/host"。

  1. java方式獲取機架ID。需要配置net.topology.node.switch.mapping.impl。值是一個java類。默認的實現是org.apache.hadoop.net.ScriptBasedMapping類,這個實現方式就需要配置外部腳本。當然也可以自己定製實現類,定製的實現類必須實現org.apache.hadoop.net.DNSToSwitchMapping接口。
  2. 外部腳本獲取機架ID。這種方式下,配置文件必須配置net.topology.script.file.name,值是一個腳本的全路徑,可以是shell也可以是python。NN調用腳本時允許傳遞多個DN的主機名或IP,這個可以通過配置項net.topology.script.number.args來配置,默認是100。
使用定製java類的方式來獲取機架ID要比使用外部腳本的方式有更好的性能。如果net.topology.node.switch.mapping.impl及net.topology.script.file.name均沒有設置,則默認的機架ID均是/default-rack,這種情況下NN在選擇block副本的DN時均是隨機的,性能將會受到影響。


六、DataNode的熱切換驅動

DN支持熱切換驅動。用戶可以在不停止運行DN的情況下添加或替換HDFS數據卷。典型的熱交換過程:

  1. 如果有新的存儲目錄,用戶需要先格式化他們並適當掛載。
  2. 用戶需要更新dfs.datanode.data.dir配置,用來提示DN將會被使用的數據卷。
  3. 用戶運行dfsadmin -reconfig datanode HOST:PORT start,進行重新配置。同時可以通過命令dfsadmin -reconfig datanode HOST:PORT status來查詢運行狀態。
  4. 一旦運行重配置完成,用戶就可以安全的umount哪些被移除的數據卷,並最終拆除磁盤。
發佈了33 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章