? ? ? ? ? ? HDFS是HADOOP的分布式文件系統(tǒng)修械,它的設計目標是存儲海量數(shù)據(jù)蛇受,為網(wǎng)絡中的大量客戶端提供數(shù)據(jù)訪問突梦。
? ? ? ? ? ? 在hdfs中單個文件被拆分多個固定大小的block,保存在各個datanode中,訪問一個文件通常需要訪問多個datanode才能獲取完整的數(shù)據(jù)已艰。
? ? ? ? ? ? datanode中的一個block是以單獨的文件形式保存的榛做,并提供對metadata的快速訪問結構唁盏。每個metadata較小,為了保證隨機快速訪問是存放在namenode節(jié)點的內存中瘤睹,metadata在設計上也是非常緊湊的升敲,所以即使一個內存很小的namenode也能支持超大數(shù)據(jù)的訪問。
? ? ? ? ? ? 元數(shù)據(jù)存儲在內存中存儲同時也是持久化的轰传,當metadata修改后會存儲在本地文件FsImage中驴党,同時使用事務日志EditLog記錄每次變動列表。
? ? ? ? ? ? HDFS的namenode基于主從架構获茬,避免單點故障港庄,失效轉移。從namenode維護2個數(shù)據(jù)結構恕曲,metadata鏡像文件及EditLog鹏氧。
? ? ? ? ? ? block默認是64M或128M,并不意味著小文件(小于64M)會任然占用64M的存儲空間佩谣。實際上小文件只占用它實際需要占用的磁盤空間把还。這不是說大量的小文件對整個hdfs文件系統(tǒng)沒有影響:實際上當大量的小文件會占用大量的metadata,而metadata的大小是固定的茸俭,從而給整個hdfs的查詢吊履、擴展上上來帶了負面影響。
? ? ? ? ? ? datanode的復制:如果沒有datanode復制功能调鬓,可以想的到的缺陷艇炎,文件被拆分成多個block存放在不同的datanode上,如果其中的某臺datanode出現(xiàn)了故障腾窝,整個文件將不能還原缀踪。為了避免此問題居砖,hdfs提供在多臺機器上進行復制過程,默認是3臺驴娃,在配置datanode復制因子的時候奏候,填寫2即可。
? ? ? ? ? ? 在hdfs中block的復制是寫操作中的一部分托慨,文件通過客戶端寫入到某個datanode中鼻由,當寫入的數(shù)據(jù)滿足一個block大小時,就向namenode申請復制厚棵,namenode會分配一個datanode進行復制蕉世,并記錄該block的datanode列表,知道該block的列表長度達到設定的數(shù)量時不再分配datanode婆硬。
? ? ? ? ? ? 在復制過程中狠轻,如果分配的datanode發(fā)生了故障,namenode會再分配一個datanode進行重新復制彬犯,并將無效的datanode從列表中移除向楼。當block復制完成后,通知namenode復制完成谐区,列表長度+1湖蜕;
? ? ? ? ? ? namenode會每3s接收datanode的心跳報告,通過報告驗證datanode上的信息和metadata存儲的信息一致宋列。namenode利用這些心跳來標識datanode是否失效昭抒,失效的記為死機狀態(tài),不再向其發(fā)送任何io操作炼杖,除非datanode再次向namenode發(fā)送心跳灭返。
? ? ? ? ? ? HDFS重要特性:機架感知,如果一個block存放的datanode在不同機架上(或不同的地理位置),獲取文件的最快速度就是從同一機架或機房上獲取block坤邪。最簡單的策略就是每個機架(地區(qū))上都有一份block副本熙含,在整個機架丟失數(shù)據(jù)也不會丟失同時也做到了數(shù)據(jù)均勻分布,但這樣對于寫操作消耗較大艇纺,每次寫都要復制到不同的機架(地區(qū))上怎静。
? ? ? ? ? ? 機架感知策略可以理解為,metadata記錄了每個block副本的ip地址黔衡,通過ip段匹配策略來區(qū)分哪個block離該namenode最近消约,視為最近的block。以減少跨機架(地區(qū))IO员帮。
? ? ? ? ? ? HDFS文件的操作:hdfs shell或客戶端 。