HDFS java
HDFS (Hadoop Distributed FileSystem) 是 Hadoop 分佈式文件系統,以流式數據訪問模式來存儲超大文件,運行與商業硬件集羣上,管理網絡中跨多臺計算機存儲的文件系統,是分佈式計算中數據管理的的基礎。node
流式數據訪問模式 : 指的是數據不是一次性獲取過來,而是一點一點獲取,處理流式數據也會一點一點處理。(所有接收在處理的話,延遲會很大)數據庫
(1)HDFS優勢express
(2)HDFS不適合的領域緩存
1.低延時數據訪問安全
好比毫秒級的來存儲數據,這是不行的,它作不到。它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。可是它在低延時的狀況下是不行的,好比毫秒級之內讀取數據,這樣它是很難作到的。服務器
HDFS是單Master的,全部的對文件的請求都要通過它,當請求多時,確定會有延時。網絡
2.小文件存儲數據結構
存儲大量小文件的話,它會佔用 NameNode大量的內存來存儲文件、目錄和塊信息(元信息)。這樣是不可取的,由於NameNode的內存老是有限的。小文件存儲的尋道時間會超過讀取時間,它違反了 HDFS的設計目標。架構
三、併發寫入、文件隨機修改
一個文件只能有一個寫,不容許多個線程同時寫。僅支持數據 append(追加),不支持文件的隨機修改。
(3)HDFS針對缺點的改善措施
一、利用SequenceFile、MapFile、Har等方式歸檔小文件,這個方法的原理就是把小文件歸檔起來管理,HBase就是基於此的。對於這種方法,若是想找回原來的小文件內容,那就必須得知道與歸檔文件的映射關係。
二、橫向擴展,一個Hadoop集羣能管理的小文件有限,那就把幾個Hadoop集羣拖在一個虛擬服務器後面,造成一個大的Hadoop集羣。google也是這麼幹過的。
三、多Master設計,正在研發中的GFS II也要改成分佈式多Master設計,還支持Master的Failover,並且Block大小改成1M,有意要調優處理小文件。(Alibaba DFS的設計,也是多Master設計,它把Metadata的映射存儲和管理分開了,由多個Metadata存儲節點和一個查詢Master節點組成。
(4)HDFS概念
一、數據塊(block)
每一個磁盤都有默認的數據塊大小,是磁盤進行讀寫的最小單位,構建與單個磁盤之上的文件系統經過磁盤數據塊進行管理文件系統的塊。相似於磁盤文件系統,HDFS中也有數據塊的概念,HDFS文件系統也被劃分爲多個塊,塊做爲獨立單元。
HDFS數據塊特色:HDFS中的塊大小比文件系統的塊大,通常默認64MB(Hadoop2中默認爲128MB),而文件系統爲幾千字節。HDFS小於一個塊大小的文件不會佔據整個塊的空間
二、namenode
HDFS集羣上有兩類節點:管理節點namenode和工做節點datanode。
四、secondarynamenode
secondarynamenode輔助後臺程序,與namenode通訊,以便按期保存namenode的元數據快照。(namenode的備份容錯機制)
五、聯邦HDFS
namenode在內存中保存着每一個文件和每一個數據塊的引用關係(元數據信息),對於一個擁有大量數據的集羣來講,namenode節點上的內存將成爲限制橫向擴展的瓶頸。在Hadoop2中,引入的聯邦HDFS系統容許系統添加namenode實現擴展。每一個namenode管理着系統文件命名空間的一部分(例如一個namenode管理着 /usr目錄下的全部文件,另外一個namenode管理着 /share目錄下的全部文件)
在聯邦環境下,每一個namenode維護一個命名空間卷(包括數據源和文件的全部數據塊的數據塊池),命名空間卷之間是相互獨立的,一個namenode的失效不會影響另一個namenode,所以集羣中的datanode須要註冊每一個namenode。
(6)HDFS結構
HDFS 採用的是Master/Slave架構存儲數據,其中主要的組件:Client、namenode、datanode、secondarynamenode
Client:客戶端
Namenode:Master節點(管理節點)
Datanode:Slave節點(工做節點)
secondarynamenode:namenode輔助節點,作日誌合併,備份namenode節點做用(並不是熱備份),secondarynamenode和namenode同時運行,通常來講都是運行在不一樣的機器上,namenode宕機, secondarynamenode並不能立刻替換namenode提供服務。
(7)HDFS讀寫流程
Client端將數據寫入到HDFS
客戶端讀取HDFS數據
(8)Namenode結構
在瞭解Namenode結構以前,咱們先看下存儲在namenode節點上的元數據信息。
上圖的元數據信息描述爲有一個文件a.log,有三個備份,文件a.log分爲兩個數據塊,數據塊blk_一、blk_2,blk_1塊在{h0,h1,h3}三個datanode 上,blk_2在{h0,h2,h4}三個datanode上
namenode在格式化以後,會在l臨時文件夾(hadoop.tmp.dir 設置,默認在/tmp/hadoop-${user.name}
)目錄下建立一個dfs目錄,以下:
VERSION:是一個java properties文件,包含HDFS版本信息。
一、Namenode始終在內存中保存metedata,用於處理「讀請求。當namenode啓動的時候,加載fsimage文件到內存,而且將editslog文件逐條加載到內存。而後生成新的空的editslog和新的數據最全的fsimage文件。
二、當客戶端進行讀寫操做時,首先將日誌記錄到editslog,而後將日誌加載到內存。
三、成功後,editslog同步到文件系統。
四、Fsimage是映像文件,是內存中元數據的checkpoint點,是一個序列化文件,不能在硬盤上直接修改。
SecondaryNameNode日誌合併(建立檢查點)
在core-site.xml中配置fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。fs.checkpoint.size 規定edits文件的最大值,一旦超過這個值則強制checkpoint,無論是否到達最大時間間隔。默認大小是64M。
(9)Datanode結構
DataNode職責:
提供真實文件數據的存儲服務。
文件塊(block):最基本的存儲單位。默認64M。(Hadoop2默認128MB)
對於文件內容而言,一個文件的長度大小是size,那麼從文件的0偏移開始,按照固定的大小,順序對文件進行劃分並編號,劃分好的每個塊稱一個Block。HDFS默認Block大小是64MB,以一個256MB文 件,共有256/64=4個Block.
不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間。
在Hadoop集羣中,默認是有三個副本(dfs.replication配置的是HDFS存儲時的備份數量),HDFS建立副本的策略通常是:
若是備份的副本設置的更多,例如備份4個的話,可能第四塊在不一樣機房的機器上...
datanode目錄結構
VERSION文件和namenode的VERSION文件差很少
namespaceID是datanode首次訪問namenode時獲取的。
storageID,對每一個datanode是惟一的,能夠根據這個屬性區分datanode
塊文件的目錄擴展
hdfs dfsadmin -safemode get //hdfs dfsadmin是hdfs管理員命令
二、退出安全模式
在執行修改和寫入操做的時候,須要先退出安全模式
hdfs dfsadmin -safemode wait
#command to read or write
hdfs dfsadmin -safemode enter
四、 離開安全模式
hdfs dfsadmin -safemode leave
安全模式的下屬性
屬性名稱 | 類型 | 默認值 | 說明 |
dfs.replication.min | int | 1 | 最小副本級別:成功執行寫操做的最小副本數目 |
dfs.safemode.threshold.pct | float | 0.999 | 最小副本條件:在namenode退出安全模式以前,知足最小副本級別的比例。設置高於1,永遠不會退出安全模式,設置爲0或者太小,可能會使得namenode沒法啓動安全模式 |
dfs.safemode.extention | int | 30 000 | 在知足最小副本條件以後,namenode還須要處於安全模式的時間(毫秒),對於小集羣來講,能夠設置爲0 |
(11)HDFS 命令行
HDFS有不少接口能夠和HDFS交互(java API等),命令行是最簡單的,也是入門學習須要瞭解的。
經常使用命令:
hadoop fs 和 hdfs dfs 均可以,可是推薦使用hdfs dfs
經過hadoop fs -help 查看
Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...] [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] [-x] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] [-skip-empty-file] <src> <localdst>] [-help [cmd ...]] [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-truncate [-w] <length> <path> ...] [-usage [cmd ...]]
HDFS管理員命令
hdfs dfsadmin
可參照:https://blog.csdn.net/jjshouji/article/details/79087601
筆摘主要是對HDFS理論的上的瞭解,具體的操做仍是須要多多實戰操做...
參考:https://blog.csdn.net/dpengwang/article/details/79297435
《Hadoop權威指南》