HDFS(分佈式文件系統)知識點梳理

HDFS hdfs是hadoop distributed filesystem的縮寫,是hadoop生態系統最爲重要的一個組件,處於hadoop生態的最底層,負責數據的存儲。 hdfs能解決什麼問題? 1.數據集的大小超過一臺計算機的存儲能力,對數據分區。 2.管理網絡中多臺計算機存儲的文件系統。 特點: 1. hdfs以流式數據訪問模式:一次寫入,多次讀取。 2. 存儲超大文件,GB、TB甚至是PB的文件 3. 運行在商用硬件集羣上。例如普通服務器,節點故障率高。 4. 不適合低時間延遲的數據訪問 5. 不適合存儲大量小文件:文件系統存儲文件的總數受限於namanode的內存 6. 多用戶寫入,任意修改文件。HDFS中的文件可能只有一個write,寫操作總是將數據添加到末尾。 HDFS數據塊 1. 默認塊大小64MB,但小於一個塊大小的文件不會佔用整個塊的空間 2. HDFS塊比磁盤的塊大,目的是最小化尋址開銷。 3. 可以存儲大於任意一個磁盤容量的文件 4. 方便存儲管理(元數據與數據分開管理,容易備份提供容錯能力和提高可用性。) 5. hadoop fsck / -files -blocks 查看文件中的各個文件由哪些塊構成 namenode和datanode namenode與datanode 1. namenode管理者,datanode工作者 2. namenode管理着文件系統的命名空間,維護着文件系統樹下的文件和目錄 3. 命名空間鏡像文件和編輯日誌文件 4. 每個塊所在數據節點信息,不永久保存,這些信息在系統啓動時由數據節點重建。 5. Datanode存儲文件數據塊,並定期向namenode發送所存儲的塊的列表 Namenode容錯 1. 第一種機制備份那些組成文件文件系統元數據持久狀態的文件。將持久狀態寫入磁盤的同時,寫入一個遠程掛載的網絡文件系統(NFS)。 2. 第二種方法運行SecondaryNamenode定期編輯日誌合併空間鏡像,保存空間鏡像副本。 3. 第三種方法將NFS上namenode的元數據複製到namenode並作爲新的主namenode Namenode高可用 1. namenode之間通過高可用的共享存儲事項編輯日誌的共享。(zookeeper) 2. datanode需要同時向兩個namenode發送數據塊處理報告。 HDFS中的文件訪問權限 一共提供三類權限:只讀權限(r)、寫入權限(w)、可執行權限(x) 訪問一個目錄的子項需要執行權限 讀取文件列出目錄內容需要讀權限 寫入一個文件,新建或一個文件或目錄需要寫權限 權限只能供合作團體中的用戶使用,而不能用於一個不友好的環境中保護資源 超級用戶是namenode進程的標識,對於超級用戶,系統不會執行任務權限檢查。 Hadoop文件系統接口 1. Http:第一種方法,直接訪問,HDFS後臺進程直接服務來自於客戶端的請求。 第二種方法,通過一個或多個代理訪問,客戶端向代理髮送http請求,代理通過RPC與Namenode,Datanode通信。 2.第一種情況中,有namenode內嵌的web服務器(50070)提供目錄服務,目錄裂變以XML或者JSON格式存儲,文件數據由datanode的web服務器(50075)以數據流的形式傳輸。 3.WebHDFS實現對文件的系統操作(讀寫),包括Kerberos認證。Dfs.webhdfs.enable設置爲true才能使用。 4. 使用代理服務器可以做到負載均衡,更加嚴格的防火牆策略和帶寬限制策略。 5.HttpFS代理服務器具有讀和寫能力,提供了和WebHDFS一樣的接口,使用HTTP REST API Java API 1. Configuration對象封裝了客戶端或服務器端的配置,通過設置配置文件讀取類路徑來實現(conf/core-site.xml) 2. Public staic LocalFileSystem getLocal(Configuration conf) throws IOException獲取本地文件系統實例。 3. FSDataInputStream支持隨機訪問,由此可以從流的任意位置讀取文件,繼承了Seekable接口。seek(long pos)定位到一個絕對位置,getPos()獲取當前位置。PositonedReadable接口,從一個指定偏移量處讀取文件的一部分。Int Read(long position, byte[] buffer, int offset, int length)從position處讀取至多length字節的數據並存入緩衝區buffer指點偏移量offset處。返回值實際讀到的字節數:readFully將制定length長度字節的數據讀到buffer,所有讀操作都將保存文件當前偏移量。 4. FSDataOutputStream, create()方法能夠爲需要寫入且當前不存在的文件創建父目錄。 Progressable用於傳遞迴調接口,appen()方法在一個已有文件末尾追加數據,getPos()查詢文件當前位置。 5.FileStatus[] globStatus(Path pathPattern, PathFilter filter)返回與路徑匹配於指定模式的所有文件的FileStatus對象數組 Fs.globStatus(new Path(“/2007/*/*”), new RegexExcludeFilter(“^.*/2007/12/31$”)) listStatus(Path path, PathFilter filter) 剖析文件文件讀取 1. 客戶端通過FileSystem(DistributedFileSystem)對象的open()方法打開希望讀取的文件 2. DistributedFileSystem向namenode獲取塊與datanode的對應關係。Datanode根據它們與客戶端的距離排序。 3. DistributedFileSystem返回一個FSDataInputStream對象,進而封裝成DFSInputStream對象,管理着namenode與datanode的IO 4. 客戶端對輸入流調用read方法,到達塊的末端時,關閉與datanode的連接,尋找下一個datanode. 5. 客戶端讀取完成,FSDataInputStream調用close() 6. 遇到錯誤時,會尋找最鄰近的另一個塊,記住故障datanode。 剖析文件寫入 1. 客戶端通過FileSystem(DistributedFileSystem)對象的create()方法打開希望讀取的文件 2. DistributedFileSystem向namenode,發送RPC調用,在文件系統中的命名空間中新建一個文件,此時文件中還沒有數據塊 3. Namenode執行各種檢查,這個文件不存在以及客戶端有新建該文件的權限。 4. DistributedFileSystem向客戶端返回一個FSDataOutputStream對象,進而封裝成DFSoutputStream對象,該對象負責datanode與namenode之間的通信。 5. DFSOutputStream將數據包寫入數據隊列(64KB)。 6. Datanode列表構成一個管線,依次寫入數據。 7. DFSOutputStream也維護着一個確認隊列,收到管道中所有節點的確認信息後,該數據包纔會刪除。 8. 客戶端完成數據的寫入後,對數據調用close()方法。 一致模型 1. 新建一個文件後,它能在命名空間中立即可見,但寫入的內容並不保證立即可見。 2. FSDataOutputStream的sync()方法可以同步寫入的數據。(close())。 Hadoop數據的完整性 1. io.bytes.per.checksum指定字節的數據計算校驗和。默認情況下時512字節,CRC-32的校驗和爲4個字節。 2. datanode負責存儲數據校驗和,客戶端讀取數據時會和存儲的校驗和比較。 3. open()方法讀取文件之前,將false值傳遞給FileSystem對象的setVerifyChecjsum()方法禁用校驗。 4. -get –ignoreCrc -copyToLocal禁用檢驗 5. Hadoop的LocalFileSystem執行客戶端的校驗。RawLocalFileSystem實例的讀操作禁用校驗和。 Fs.file.impl設置爲org.apache.hadoop.fs.RawLocalFileSystem 壓縮 1. 好處:減少文件所需的磁盤空間,加快數據在網絡中的傳輸。 2. Mapreduce處理的數據,壓縮的格式需要支持切分。 3. 壓縮Mapreduce作業的輸出,應在作業配置過程中將mapred.output.compress設置爲true,mapred.output.compression.codec 設置爲使用壓縮codec的類名。 FileOutputFormat.setCompressOutput(job, true) FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class) 4. Mapred.output.compression.type 默認爲RECORD,即對每條記錄進行壓縮。BLOCK,針對一組記錄進行壓縮 5. Map任務進行壓縮mapred.compress.map.output 設置爲true Mapred.map.output.compression.codec 序列化 1. 序列化是指將結構化對象轉化爲字節流以便在網絡上傳輸或寫到磁盤進行永久存儲。 反序列化是指將字節流轉回結構化對象的逆過程 2. Hadoop序列化格式Writable 3. Writable接口定義兩個方法 Void write(DataInput out) throws IOExcepthion; Void readFields(DataInput in) throws IOException; 4 創建Intwritable對象 Intwritable writable = new IntWritable(5); writable.set(5); WritableComparable接口和comparator IntWritable實現原始的WritableComparable接口,該接口繼承自Writable和java.lang.Comparable接口。類型比較很重要,在mapreduce的過程有基於鍵排序階段。 WritableComparator 提供對原始compare()方法的一個默認實現,該方法能夠反序列化將在流中進行比較的對象,並調用對象的compare()方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章