hadoop是一個適合大數據處理的分佈式的存儲以及計算平臺,我我的感受稱他爲平臺是 很是貼切的,由於不論是hive、hbase等這類產品都是須要依賴hadoop的兩個核心hdfs和mapreduce。hdfs和mapreduce是hadoop平臺的基礎核心,其中hdfs是負責大數據的分佈式存儲,而mapreduce是數據處理的計算框架。下面就開始記錄hdfs,mapreduce後面再記錄咯。 node
對於HDFS,我我的感受就是架構在操做系統平臺上面的一個文件管理系統,跟操做系統的文件系統不一樣的是他具備了對文件的自動的分佈式管理的能力,不過這一切對於用戶來講都是透明的,好比咱們向hdfs put一個文件時他會根據咱們的設置對該文件產生replication,這裏只是說他的分佈式存儲,爲了更適合大數據的處理,hdfs也有本身的機制。 安全
如下是我記錄的知識點,以便往後複習,寫得有點亂,只爲記錄,不爲出名!!!哈哈哈哈~~~~ 架構
當集羣啓動的時候,默認進入安全模式。默認30秒會自動退出。 框架
在安全模式下,只能讀,不能寫。 分佈式
dfsadmin -safemode get|enter|leave oop
若是遇到集羣剛剛啓動,就馬上執行寫操做,系統會報錯。 大數據
安全模式給了系統一個初始化的時間。 spa
clrQuota 取消 操作系統
setSpaceQuota 限制某個目錄的空間大小。 日誌
clrSpaceQuota 取消
hdfs dfs -count -q /lisi 查看配置設置的值
分佈式的文件系統,意味着數據存儲在不少節點上。
NameNode用來管理元數據自己。DataNode用來管理數據自己。
管理元數據的節點。管理着文件(夾)的元數據,如權限、全部者、所在組、大小、最後訪問時間、最後修改時間、名稱、配額。
客戶端在訪問數據的時候,首先和NameNode打交道。元數據信息位於fsimage文件中,fsimage是hdfs狀態的體現。當集羣啓動的時候,fsimage中的信息加載到內存中。
edits中保存的是操做日誌。edits是hdfs 事務的體現。
在hdfs-site.xml中,配置dfs.namenode.name.dir的值,是多個都好分隔的目錄列表。fsimage內容就會同時存儲在多個目錄中,實現數據安全。
在hdfs-site.xml中,配置dfs.namenode.edits.dir的值,是${dfs.namenode.name.dir}。
若是機器宕機,以上方案就無效了。實現NameNode的HA功能。
實現數據的存儲。不少的節點,每一個節點都是DataNode。
DataNode存儲數據的時候,都是以block形式存儲。
block是DataNode存儲數據的基本單位,相似於快遞公司的包裹。
爲了節省空間,通常只會規定包裹的最大尺寸,不會規定標準尺寸,hdfs的block也是這個原理。block的最大尺寸是128MB,沒有最小尺寸。
當一個12k的數據存放到一個block中時,該block只佔用12k的磁盤物理空間。
在前面看fsimage的內容時,發現每一個文件都有block對應。fsimage的內容在集羣運行時,存放在內存中。每一個文件會產生至少一個block。當小文件很是多的時候,對Namenode節點的內存產生什麼影響?多耗費內存,形成內存壓力大。 因此hdfs不適合存儲大量的小文件
當namenode -format命令執行的時候,在namenode節點和datanode節點的VERSION中都會產生一個namespaceID值,而且這兩個值必須相同。若是再次執行格式化,那麼namenode會產生一個新的namespaceID,可是datanode不會產生新的值。
讀寫與生活的舉例:去客戶現場解決問題,我(客戶端)須要去詢問項目經理(namenode)客戶的地址等信息,項目經理告訴我(block location等),我就能夠去客戶現場,我告訴客戶解決了,客戶須要確認解決了纔是真正的解決,我再去跟項目經理報告。
Hdfs的讀寫其實跟普通的文件系統讀寫基本上同樣,只是多了一箇中間的註冊。就像咱們單身的時候花錢本身怎麼花均可以,可是結了婚就須要先經過媳婦那才能夠咯
Namenode維護者兩張表(從namenode源碼得知),一張是文件與block塊的映射(blockid,能夠在fsimage文件中看到,存在本地磁盤),另外一張是block塊和磁盤的映射(體現爲inode,既是每個塊與塊所在datanode磁盤的位置,在每次hdfs啓動時都要從新生成,其實就是每次啓動進入安全模式的時候datanode向namenode報告的塊信息)即:filename—blocksequence block—node 前者是靜態的(一旦改變會影響數據的信息不對應) 後者是動態的(分佈式狀況下,節點宕機是常態,則須要更新對應關係)
Slaves文件只是在集羣啓動的時候使得可以一塊兒啓動datanode節點,即便slaves文件不正常,也只是在啓動namenode時沒法啓動datanode,手動啓動datanode時也是能夠正常使用的,由於他們的vision文件中的namespaceID是相同的