[TOC]html
上一份工做主要負責大數據平臺的建設,在這個過程當中積累了一些Hadoop生態組件的搭建和使用筆記,因爲時間關係,不打算去修改其中的錯別字和排版問題,直接釋出原始筆記。
一個hadoop基本集羣,牽涉三個組件:java
mr 負責分佈式計算node
配置etc/hadoop/hadoop-env.sh、etc/hadoop/hadoop-env.sh、etc/hadoop/yarn-env.sh 這三個腳原本配置三個組件執行的環境變量
固然,機器特定的環境變量能夠放在 /etc/profile.d 中linux
最重要的是在上述三個shell腳本的最後,配置JAVA_HOME。
上述三個shell中,有大量環境變量KEY能夠配置,他們通常見名知意。可使用一些帶OPTS後綴的配置,去覆蓋那些特定配置。帶OPTS的後綴有web
好比HADOOP_HEAPSIZE_MAX=1g 能夠被HADOOP_NAMENODE_OPTS="-Xmx5g" 所覆蓋shell
上述環境變量配置好後,就要配置hdfs, yarn, mr三者的進程,即程序執行的行爲屬性。其分別對應的配置文件爲apache
hdfs的配置bootstrap
yarn的配置api
能夠針hdfs,mr,yarn三個組件的各角色進行啓動。瀏覽器
其中Hdfs的各角色,可使用etc/hadoop/workers
配置,經過$HADOOP_HOME/sbin/start-dfs.sh
批量啓動。
具體啓停看文檔
Hadoop Rack Awareness,啓用該特性,讓Hadoop集羣感知物理存儲拓撲,從而更好的提升數據分片性能,具體看文檔
能夠指定一些監控nodeManager狀態的腳本給NodeManager, NodeManager會週期性的調用,檢查本身的狀態,yarn則會收集該狀態,而後不會將程序分發到這些異常NodeManager上執行
文檔地址:https://hadoop.apache.org/doc...
若是hadoop操做的是hdfs,那麼下面兩種命令格式等效
bin/hadoop fs <args>
hdfs dfs <args>
hadoop fs的相關命令支持多種文件系統
hadoop fs命令通常操做的文件系統路徑格式URI爲scheme://authority/path
,好比hdfs舉例hdfs://namenodehost/parent/child
將本地單個文件或多個文件,或則本機的標準輸入中的內容,拷貝到目標文件系統
用法:hadoop fs -appendToFile <localsrc> ... <dst>
hadoop fs -appendToFile localfile /user/hadoop/hadoopfile hadoop fs -appendToFile localfile1 localfile2 /user/hadoop/hadoopfile hadoop fs -appendToFile localfile hdfs://nn.example.com/hadoop/hadoopfile hadoop fs -appendToFile - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.
Returns 0 on success and 1 on error.
將文件系統中指定文件內容輸出到終端
用法:hadoop fs -cat [-ignoreCrc] URI [URI ...]
hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2 hadoop fs -cat file:///file3 /user/hadoop/file4
Returns 0 on success and -1 on error
對指定文件生成checksum值
用法:hadoop fs -checksum URI
hadoop fs -checksum hdfs://nn1.example.com/file1 hadoop fs -checksum file:///etc/hosts
改變文件的組
用法:hadoop fs -chgrp [-R] GROUP URI [URI ...]
改變文件的讀寫執行模式
用法: hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
todo:具體mod詳情,須要再查閱
改變文件的擁有者
用法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
將當前機器本地文件,拷貝到分佈式文件系統
用法: hadoop fs -copyFromLocal [args] <localsrc> URI
其中命令參數有如下幾個,都是可選
._COPYING_
格式的文件將分佈式文件系統中的文件拷貝到本地
同進指定路徑的文件、文件夾個數、當前文件佔用量大小、指定路徑容許建立的文件、文件夾個數,以及容許的最大文件、文件容量
用法:hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] <paths>
若是隻用quota,而不加任何如下且與參數,則輸出的統計項有
DIR_COUNT(當前路徑的文件夾個數), FILE_COUNT(文件個數), CONTENT_SIZE(容量佔用大小), PATHNAME(當前統計的路徑)
QUOTA(總的name quota的大小), REMAINING_QUOTA(還剩name quota的大小), SPACE_QUOTA(space quota的大小), REMAINING_SPACE_QUOTA(還剩的space quota的大小), DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME
QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, PATHNAME
demo舉例
hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2 hadoop fs -count -q hdfs://nn1.example.com/file1 hadoop fs -count -q -h hdfs://nn1.example.com/file1 hadoop fs -count -q -h -v hdfs://nn1.example.com/file1 hadoop fs -count -u hdfs://nn1.example.com/file1 hadoop fs -count -u -h hdfs://nn1.example.com/file1 hadoop fs -count -u -h -v hdfs://nn1.example.com/file1 hadoop fs -count -e hdfs://nn1.example.com/file1
對於quota(配額)的說明:
使用hadoop fs -count -q
命令查詢配合時,若是配額沒有設置,會顯示none
或inf
可使用hdfs dfsadmin
命令對某個指定路徑設置配額
將一個文件或多個文件拷貝到另外一個地方。
拷貝當個文件時,目的地能夠是另外一個文件,也能夠是文件夾
拷貝多個文件時,目的地必須是文件夾
用法:hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest>
查詢某個指定路徑的剩餘容量
用法:hadoop fs -df [-h] URI [URI ...]
df是看的整個文件系統的使用狀況和可用空間
而-count是計算指定目錄的空間佔用狀況,以及管理員給分配的配合使用狀況
查看指定路徑的文件和文件夾大小彙總
查找指定路徑下,名字知足表達式的文件,並打印到終端
hadoop fs -find / -name test -print
-name 對文件名大小寫敏感
-iname 文件名大小寫不敏感
將hdfs中的文件拷貝到本地
返回文件的訪問控制列表
將指定文件夾中的全部文件合併後,生成到目標文件中
用法:hadoop fs -getmerge [-nl] <src> <localdst>
hadoop fs -getmerge -nl /src /opt/output.txt //將src文件夾下的全部文件合併到output.txt hadoop fs -getmerge -nl /src/file1.txt /src/file2.txt /output.txt//將file1.txt和file2.txt合併到output.txt
將指定文件頭一千行數據輸出到終端
hadoop fs -head pathname
將指定文件尾部一千行數據輸出到終端
hadoop fs -tail [-f] URI
hadoop fs -help
全部fs命令的幫助手冊
hadoop fs -usage command 查看單個命令的使用手冊
刪減指定文件的指定行數
建立一個文件,就像Linux的touch命令
hadoop fs -touchz pathname
不存在則建立文件,存在則更新文件的更新時間
以文本形式輸出一個指定文件
測試指定路徑是否存在,是不是文件或文件夾
設置文件或文件夾的副本數。若是是文件夾,則會將該文件夾下的全部文件副本數一併設置
hadoop fs -setrep -w 3 /user/hadoop/dir1
-w表示命令是否等待全部操做完成
對指定文件設置附加屬性。一個文件固有的屬性有其Permission,和modifytime。用戶能夠選擇添加一些附加屬性
設置指定文件或文件夾的訪問控制列表
hadoop fs -rmdir /user/hadoop/emptydir
刪除一個指定文件。若是回收垃圾桶功能有的話,刪除操做會將將文件移動到垃圾桶trash
hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir
將本地的一個或多個文件複製到分佈式文件系統中的指定路徑
hadoop fs -put localfile /user/hadoop/hadoopfile hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir hadoop fs -put -d localfile hdfs://nn.example.com/hadoop/hadoopfile hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.
將本地文件移動到文件系統,注意是移動,移動後,本地文件將被刪除
hadoop fs -moveFromLocal <localsrc> <dst>
文件移動,要是移動多個文件的話,目的地必須爲一個文件夾
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2 hadoop fs -mv hdfs://nn.example.com/file1 hdfs://nn.example.com/file2 hdfs://nn.example.com/file3 hdfs://nn.example.com/dir1
建立文件夾
用法:hadoop fs -mkdir [-p] <paths>
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2 hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir
用法:hadoop fs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] <args>
參數列表以下
-C: Display the paths of files and directories only. -d: Directories are listed as plain files. -h: Format file sizes in a human-readable fashion (eg 64.0m instead of 67108864). -q: Print ? instead of non-printable characters. -R: Recursively list subdirectories encountered. -t: Sort output by modification time (most recent first). -S: Sort output by file size. -r: Reverse the sort order. -u: Use access time rather than modification time for display and sorting. -e: Display the erasure coding policy of files and directories only.
HDFS是一個分佈式文件系統。其中有兩種類型的組件
HDFS Snapshots用來作數據備份,或者災難恢復。
HDFS Snapshots建立的耗時很低,幾乎是瞬間建立。
之因此快的緣由是,集羣沒有數據移動。
Snapshots建立後,只記錄其對應真實文件路徑下發生的變化。
當你要恢復數據時,hdfs是經過當前的數據減去Snapshots記錄的至snapshot建立以來,發生變化的數據,就等於snapshot備份初始時,對應的數據狀態。
這個思想很棒,建立備份很快的同時,備份所要求的存儲空間也不多
一個文件夾想要使用Snapshots備份,首先該文件夾須要被設置成snapshottable(可備份)
hdfs dfsadmin -allowSnapshot <path>
而後對該文件夾建立備份
hdfs dfs -createSnapshot <path> [<snapshotName>]
's'yyyyMMdd-HHmmss.SSS
格式的命名建立備份後,備份自己放在在備份文件夾下的.snapshot
文件夾內
好比如今有個文件夾/foo/bar
我對foo文件夾建立一個備份s0, 那麼該備份的路徑爲/foo/.snapshot/s0
我要查看全部foo的全部備份
hdfs dfs -ls /foo/.snapshot
查找備份中的文件
hdfs dfs -ls /foo/.snapshot/s0
將備份中的文件恢復到某個目錄
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
hdfs中存儲的文件都很大,因此一個大文件,會被拆分紅不少block. 而爲了保證數據的可靠性,這些block會被以副本形式存放在多個data node.
該圖上半部分,顯示的是文件在Namenode中存儲的元數據信息,其中包含了(以第一行爲例)
/users/sameerp/data/part-0
該圖下半部分,則是上半部分描述的兩個文件,在datanode中的實際存儲狀況,能夠看到第二個文件有三個快,而且每一個塊有三個副本
一個大的HDFS集羣,每每跨多個機架的服務器。若是副本放一個機架,那這個機架掛了,數據就全沒法訪問。若是副本分散到多個機架,那麼每次寫數據會很慢,而且會佔用大量跨機架的帶寬,且通常跨機架帶寬,沒有機架內的帶寬大。
因此副本策略須要權衡上述兩點,實現數據的可靠性存儲的同時,能保證讀寫性能。
namenode經過Hadoop Rack Awareness機制,去獲知每一個datanode 對應的機架。
若是副本爲3的話,且有多個機架的話,hdfs的會將兩個副本放在同一個機架上,另外一個放在另一個機架。這樣保證多數副本處於同一機架,提升讀寫速度。而單獨放置一個機架的副本,能保證前一個機架掛掉後,集羣的高可用
若是副本超過4個的話,hdfs會隨機的找另外的機架來放,最終保證每一個機架上的副本小於等於(replicas - 1) / racks + 2)
hdfs不會容許一個block的多個副本放在同一個datanode
hdfs會採用就近原則,來保證讀取的高效性。就近是指看跟讀取客戶端相近
hdfs剛啓動時,出於安全模式,在該模式下,集羣不會發生數據複製的行爲。namenode會接收,datanode發送來的數據block的狀況(這被稱爲block report,由datanode主動上報),並進行檢查。當一個在多個datanode上的同一個bock副本存活數,達到指定的最小副本數時,該block才被認爲是安全可用的。當整個集羣的可用block數達到必定百分比時,HDFS才認爲集羣可用,退出安全模式,並把安全檢查過程當中發現的不安全的block,replication其副本到其它可用的datanode ,從而實現集羣總體的高可用。
dfs.namenode.checkpoint.period
,或者EditLog積累了指定的變動事務數dfs.namenode.checkpoint.txns
。當合並後,editLog將被刪除hdfs節點間通訊協議是架設在tcp/ip上的,namenode只響應客戶端或datanode發送的請求,namenode不會主動的發起任何請求
namenode會基於datanode上報的心跳,blockreport去及時的把不可用的datanode下線,並有必要的增長將副本數不足的block副本
hdfs中將文件默認拆分爲 128 MB的block
當像hdfs中寫一個需副本文件時,namenode首選選取一組datanode給到客戶端,客戶端將數據寫第一個datanode, 第一個datanode寫完後,將該數據分發給第二個datanode ,依次類推,像一個鏈式管道
支持以命令、api、web瀏覽器的方式訪問hdfs文件系統
如下兩種回收方式,都是有必定延遲的,不是操做後,就能看到多出的空間。
若是垃圾桶功能開啓後,刪除的文件會先到/user/<username>/.Trash
,每一個用戶都有一個本身的垃圾桶。
用戶最近刪除的文件在/user/<username>/.Trash/Current
中
當到了必定時間後,垃圾桶中的文件會被完全刪除。這個時候,hdfs會真正回收這部分空間
將副本個數減小,也會促使集羣回收對應文件的空間
https://hadoop.apache.org/doc...
namenode存儲了整個分佈式文件系統的信息,它一旦數據丟失,那麼整個hdfs至關於文件丟失。
而namenode的文件系統實際存儲,依賴editLog和fsImage兩個文件,因此保證namenode的數據不丟失,關鍵就是要保證editLog和fsImage兩個文件的不丟失。下述三種Node,就是在作這個事情
前面講namenode的editLog和fsImage的合併,只會在namenode啓動時進行。這樣到namenode下次啓動時,可能editlog已經很是大了,合併會很耗時。Secondary NameNode就是用來去name node上拉取editLog和fsImage,而後進行合併。而後對namenode文件系統查詢,會路由到secondary NameNode上
dfs.namenode.checkpoint.period
dfs.namenode.checkpoint.txns
固然Secondary NameNode,只是作editLog和FsImage的合併,並提供查詢副本,他不併不能徹底替代namenode工做。也即在Namenode掛後,集羣是不可用的
同Checkpoint Node功能相似,要去namenode上拉取,editlog和fsImage ,只是checkpoint node會將合併後的內容,上傳至Namenode。這樣Namenode 不至於去查checkpoint node
同Secondary NameNode和Checkpoint Node不同,他不會用每次都去namenode拉取editLog和fsImage。其自己就會以物理落盤的方式,存儲editLog和fsImage。因爲這個特色,nameNode在啓動時,可使用-importCheckpoint 選項,是的Namenode自己不存儲editLog和fsImage,轉而將全部將全部的存儲,代理給backup node
若是editLog和fsImage實在丟失了,請用Recovery Mode
前面的Secondary NameNode、Checkpoint Node,Backup Node,都只是爲了以某種形式備份editLog和fsImage數據。真正NameNode掛了後,集羣仍是須要人工干預。
這裏介紹整個NameNode的高可用方式。(再次強調Secondary NameNode並非HA,這個命名讓人容易誤解)
正在的高可用HA須要實現兩個方面
兩種HA模式在namenode實例高可用上,都依賴zookeeper實現。只是在保證editLog和fsImage的高可用和一致性上有差別
使用上述HA中的任意一種,咱們均可以再也不配置Secondary NameNode、Checkpoint Node,Backup Node
如下主要介紹基於Quorum Journal Manager的高可用
從上能夠看到。爲了保證fsImage和Editlog的高可用。每次namenode在發生文件系統變動時,會將其寫到Journal Manager(後續簡稱JM),JM想Zookeeper同樣,會部署奇數個節點,只有想JM半數以上的節點寫editLog和fsImage成功後,纔算成功。
使用zookeeper保證主namenode掛後,standby的namenode可以快速成爲主namenode.
zookeeper自己在寫數據時,也是半數成功纔算成功,爲何不用用zookeeper一併代理JM 來存儲editLog和fsImage呢。由於editLog和fsImage的文件可能很大,zookeeper自己適合作輕量級的元數據管理,不適合作這個
如下各類組件部署,最好使用不一樣的linux用戶。hadoop官方推薦的用戶跟Hadoop組件的對應關係爲
主要配置
hdfs-site.xml
若是將多個Namenode總體看作一個分佈式服務的話,首先要給這個service取個名字
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property>
將其對應的一組namenode的聲明id
<property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2, nn3</value> </property>
配置namenode id對應的具體機器端口信息
<property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>machine1.example.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>machine2.example.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn3</name> <value>machine3.example.com:8020</value> </property>
配置這組namenode,對應的http地址、端口信息
<property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>machine1.example.com:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>machine2.example.com:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn3</name> <value>machine3.example.com:9870</value> </property>
配置journalnode存儲editLog和fsImage文件的路徑
<property> <name>dfs.journalnode.edits.dir</name> <value>/path/to/journal/node/local/data</value> </property>
配置多臺JournalNode組成的服務鏈接地址,他們至關於組成了一個分佈式的文件目錄
<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value> </property>
爲了防止腦裂導致多個Namenode都在寫數據,能夠配置一些當出現腦裂時,去殺死Namenode進程的命令,若是默認不指定命令,也須要作shell(/bin/true)。他的實現原理是,standby的namenode,準備成爲active時,先經過ssh登陸到原來的active namenode 的機器上,嘗試以命令的形式殺死原來的namenode進程,保證本身啓動起來不出現腦裂。因此這一步的關鍵配置是多個namenode以前,要實現ssh免密登陸。ssh免密登陸的配置參考:https://www.cnblogs.com/nices...
<property> <name>dfs.ha.fencing.methods</name> <value>sshfence shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/vagrant/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property>
還能夠配置客戶端鏈接namenode時,出現故障的轉移策略
<property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
上述全部配置,能保證editLog和fsImage文件不丟。但nameNode掛後,仍是須要經過haadmin
命令手動干預去啓動新備選nameNode。
下面的一系列配置用來使用zookeeper實現namenode的自動故障轉移
首先啓動自動轉移開關
在hdfs-site.xml 中配置
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
在core-site.xml 配置zk的連接信息
<property> <name>ha.zookeeper.quorum</name> <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value> </property>
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property>
先啓動全部的JournalNodes
./hdfs --daemon start journalnode
初始化主namenode
//若是集羣是新集羣 hdfs namenode -format //若是是對已經存在好久的集羣,進行高可用改造,下面的命令,是把已經存在的editLog和fsImage數據同步到journalnode hdfs namenode -initializeSharedEdits
啓動主namenode
./hdfs --daemon start namenode
初始化從namenode
hdfs namenode -bootstrapStandby
啓動從namenode
sbin/hadoop-daemon.sh start namenode
在namenode所在機器,執行下述命令,初始化其在zk的節點信息
$HADOOP_HOME/bin/hdfs zkfc -formatZK
在全部namenode所在機器上啓動zkfc進程
$HADOOP_HOME/bin/hdfs --daemon start zkfc
上述全部的這些命令中的初始化動做,只在第一次配置HA時須要。後續經過 start-dfs.sh 就能夠直接啓動全部相關實例
https://hadoop.apache.org/doc...
https://hadoop.apache.org/doc...
是一些列配置,是的hadoop集羣可以感知到當前集羣的機架狀況,從而應用到副本分佈策略中,以提升數據的高可用。
須要在hadoop的xml中配置基於域名或ip查找機架id的實現類。實現類必須繼承org.apache.hadoop.net.DNSToSwitchMapping
接口。
實現類經過net.topology.node.switch.mapping.impl
進行配置,默認的實現爲org.apache.hadoop.net.ScriptBasedMapping
ScriptBasedMapping會去調用腳本,來獲取所在集羣的機架信息,具體的所調的腳本經過net.topology.script.file.name
來配置,該配置沒有默認值。
hadoop文檔中有實現樣例,可參考
https://hadoop.apache.org/doc...
參考資料
https://hadoop.apache.org/doc...
建議的安裝方式,zookeeper三個節點分別放Namenode、standyNamenode、ResourceManager這三臺機器上。
zookeeper本身的文件目錄所在磁盤,同hdfs namenode所在磁盤分開
hdfs自己由多個組件組成,且有些組件還有多個節點,好比journalnode, datanode,一次啓動去到多個機器上執行是件很繁瑣的事情。hadoop髮型包,提供了sbin/start-dfs.sh
和 sbin/stop-dfs.sh
兩個腳本去啓停hdfs相關的全部組件:好比namenode、datanode、journalnode, zkfc 。
他實現的原理是,基於hadoop安裝包中的/opt/hadoop-3.2.1/etc/hadoop/workers文件,去登陸到相應的機器,完成組件的執行。workers中定義了全部datanode的機器host。 登陸方式是基於SSH的免密登陸方式,具體配置參見:https://www.cnblogs.com/nices...
若是發起腳本執行的機器,自己也須要部署一個datanode。那麼他須要配置本身對本身的SSH免密登陸
經過core-site.xml和hdfs-site.xml , 腳本已經能夠知道namenode, Journalnode,Zkfc的組件機器。因此workers文件中,只須要設置全部的datanode的機器host。
hdfs的權限模型,同linux相似,只是去掉了setuid和setgid兩位。也支持acl,stickybit位。但同linux不一樣的是,hdfs自己只管理文件的權限控制。並無帳號體系,好比像linux同樣有/etc/passwd存儲全部的用戶列表。也即hdfs只提供文件權限控制。並不提供用戶管理和認證管理,這二者都交由外部系統來實現。linux權限模型參考資料
https://www.cnblogs.com/nices...
誰啓動的namenode ,那啓動namenode進程的用戶,就是namenode 的管理員。因此namenode的管理員是會變化的,下次換個linux用戶啓動,就會致使變化
經過hadoop.security.authentication
配置,操做用戶識別機制,有如下兩種
使用發起操做的宿主機中,當前發起操做的用戶,做爲本次請求hdfs的用戶。好比當前發起hdfs dfs -ls
命令的是linux的ops用戶,那麼hdfs後續的權限控制都會基於ops用戶去判斷。判斷其是否有指定路徑的讀權限
在kerberos的配置文件中配置,auth_to_local是一個principal訪問某個service時,這個service雖然知道這個Principal是KDC認證過的合法用戶
但受權怎麼作,該Principal具備什麼樣的權限?這個須要service本身來作。
通常linux本身的受權控制是經過posix模式,加ACL的方式進行的。本質來說,都是針對當前linux自己的用戶進行受權。
好比owner,group,others,分別定義他們能作什麼和不能作什麼。
因此部署在Linux上的service,每每須要將請求過來的principal映射成本地的用戶,而後對本地的用戶進行受權檢測。這麼一看,auth_to_local這個命名仍是比較直白的
auth_to_local = {
RULE:[2:$1](johndoe)s/^.*$/guest/ RULE:[2:$1;$2](^.*;admin$)s/;admin$// RULE:[2:$2](^.*;root)s/^.*$/root/ DEFAULT } }
上述這個demo配置,其實就是將johndoe/ 形式的principal會被映射成本地的guest用戶,而形如/admin@TEST.COM 的principal會被映射成本地的admin帳號
https://ssimo.org/blog/id_016...
上述方式只是找到操做對應的用戶。若是操做的用戶不是對應文件、文件夾的owner, 那麼須要判斷該用戶是否擁有指定文件、文件夾的組權限。
那首先,咱們要知道該用戶的有哪些組,以便讓hdfs知道,該用戶是否在文件所屬組中,若是文件所屬組,在用戶的組列表中,說明該用戶擁有文件的組權限。
那麼怎麼找到用戶所屬的組列表呢?
配置hadoop.security.group.mapping
具體的mapping來找,能夠配置的mapping有
具體每一個mapping的mapping策略,可看文檔和具體的hadoop源碼實現:https://hadoop.apache.org/doc...
還能夠經過 hadoop.user.group.static.mapping.overrides
來靜態指定一個用戶對應的group list。 若是一個用戶在靜態mapping中找到對應的組,就不會走上述的動態mapping
採用kerberos做爲hadoop各組件之間的權限認證。首先在部署的時候,將hadoop的各組件採用不一樣的linux用戶和組進行部署。
hdfs文件系統,推薦的posix權限限制
配置整個集羣啓用kerberos權限認證。其中auth_to_local表示,當有其它組件請求當前服務時,如何將其映射成爲本地的用戶某個用戶。一個demo配置爲
<property> <name>hadoop.security.auth_to_local</name> <value> RULE:[2:$1/$2@$0]([ndj]n/.*@REALM.\TLD)s/.*/hdfs/ RULE:[2:$1/$2@$0]([rn]m/.*@REALM\.TLD)s/.*/yarn/ RULE:[2:$1/$2@$0](jhs/.*@REALM\.TLD)s/.*/mapred/ DEFAULT </value> </property>
其中,來至於namenode、datanode、journal node的請求,會被映射成爲hdfs用戶
來至於resource manger、node manager的請求,會被映射成本地的yarn用戶
來至於job history server的請求,會被映射成爲mapred用戶
文檔前面有提到,有哪幾種基於用戶找到分組的方式。通常配安全集羣,都會跟公司的LDAP整合起來,這裏就以使用LDAP來找組爲例看配置
<property> <name>hadoop.security.group.mapping.ldap.url</name> <value>ldap://server1,ldap://server2,ldap://server3</value> <description> The URL of the LDAP server(s) to use for resolving user groups when using the LdapGroupsMapping user to group mapping. Supports configuring multiple LDAP servers via a comma-separated list. </description> </property> <property> <name>hadoop.security.group.mapping.ldap.num.attempts</name> <value>6</value> <description> This property is the number of attempts to be made for LDAP operations. If this limit is exceeded, LdapGroupsMapping will return an empty group list. </description> </property> <property> <name>hadoop.security.group.mapping.ldap.num.attempts.before.failover</name> <value>2</value> <description> This property is the number of attempts to be made for LDAP operations using a single LDAP instance. If multiple LDAP servers are configured and this number of failed operations is reached, we will switch to the next LDAP server. The configuration for the overall number of attempts will still be respected, failover will thus be performed only if this property is less than hadoop.security.group.mapping.ldap.num.attempts. </description> </property>
前面是配置整個集羣服務,再接受到請求後,怎麼辨別這個請求是哪一個用戶的,該用戶屬於哪一個組的。而這裏的配置,主要用來指定該組件本身的憑證文件也即kerberos的keytab存在什麼地方,以及使用其中哪一個principal做爲當前組件的principal(一個keytab文件中,能夠存儲多個principal的認證信息)
下面以namenode爲例,看其須要的配置
其他各組件的相關配置大致相似。參考連接:
https://hadoop.apache.org/doc...
kerberos只是提供集羣互訪的認證,具體到認證用戶的受權,又得單獨配置。hadoop本身支持在 $HADOOP_CONF_DIR下配置hadoop-policy.xml文件來指定訪問控制列表,實現受權控制。 而咱們準備使用ranger來作受權控制,因此這裏再也不對這種方式贅述
在某臺機器上,以命令行查詢文件系統是報錯-ls: java.net.UnknownHostException: 具體的集羣名稱
這個錯誤是因爲對應的機器上的hdfs-site.xml高可用配置沒有配置鏈接namenode失敗後的失敗策略。
解決辦法是在該機器的hdfs-site.xml中加入對應配置
<property> <name>dfs.client.failover.proxy.provider.haixue-hadoop</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
重啓該機器的組件,若是該機器只有datanode,那重啓datanode便可
update-alternatives --install \ /usr/bin/hdfs \ hdfs \ /opt/hadoop-3.2.1/bin/hdfs \ 100
能夠將指定datanode進行下線,維護
https://hadoop.apache.org/doc...
有些冷門的數據,存三個副本,有些浪費
https://hadoop.apache.org/doc...
https://hadoop.apache.org/doc...
數據寫入內存,再異步寫磁盤,有丟數據的風險
https://hadoop.apache.org/doc...
讓datanode緩存部分熱數據,來提高數據讀取速度
https://hadoop.apache.org/doc...
hadoop的文檔左側,有一個configuration 列表,其中有全部配置項對應的xml,以及其默認值和釋義
https://hadoop.apache.org/doc...
https://data-flair.training/b...
歡迎關注個人我的公衆號"西北偏北UP",記錄代碼人生,行業思考,科技評論