您好,登錄后才能下訂單哦!
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()方法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。