文件上傳到HDFS服務器的時候,會分紅多個塊,並以多個副本的形式存儲在服務器上面,那咱們怎麼知道這個文件的文件名是什麼呢?這個文件被分紅了多少塊?每一個塊又存儲在哪幾個服務呢?
因此HDFS在上傳文件的時候,除了上傳文件,還會另外保存這些信息,這些信息叫作元數據。
元數據的在HDFS中有兩種形式,一個是磁盤,一個是內存,兩種形式的數據是徹底如出一轍的。存磁盤是爲了數據的持久化,存內存是爲了提升讀寫的性能。
在HDFS中,咱們讀寫文件的時候,目錄相似於Linux的目錄結構,因此元數據也會保存目錄樹結構。好比下圖,INodeDirectory是目錄,INodeFile是文件,一個目錄下能夠有多個目錄和多個文件。
因此元數據包括:segmentfault
咱們以前搭建Hadoop集羣以及高可用集羣的時候,都會有個格式化的操做,這個操做就會在磁盤目錄上生成一個fsimage文件,而這個文件就是用來存放元數據的信息的。
當NameNode啓動的時候,會根據配置信息讀取到fsimage目錄的fsimage文件,把它加載到內存中。
NameNode對外提供服務的時候,就有客戶端上傳文件的請求,就會把元數據加到內存的fsimage中,爲了保證數據不丟失,也會把元數據持久化磁盤中,寫入磁盤的文件是edits_inprogress。此時內存中的fsimage=磁盤的fsimage+edits_inprogress。
當edits_inprogress文件數據愈來愈多,或者隔一段時間後,edits_inprogress文件就會重命名爲edits0000000N-edits0000000M文件,而且用新的edits_inprogress文件從新寫入數據。如此反覆,就有不少不少個edits文件。此時內存中的fsimage=磁盤的fsimage+edits_inprogress+全部的edits。
當NameNode重啓的時候,此時就會把磁盤的fsimage+edits_inprogress+全部的edits都讀入緩存,合併爲內存的fsimage。
咱們能夠預測的到,在元數據無限增量的狀況下,edits文件就會愈來愈多,每次NameNode重啓所加載的時間也會愈來愈多,因此就有了CheckPoint機制,簡單的說,就是把歷史的edits文件合併到fsimage,那下次重啓的時候,咱們就只加載合併後的fsimage文件、edits_inprogress文件以及少許的edits文件,大大提升了NameNode的啓動時間。爲了記錄每次CheckPoint的TXID,就會有seen_txid文件進行記錄。
另外還有一個文件,叫VERSION,這裏存放着HDFS集羣的信息。
綜上,元數據文件包括fsimage、edits_inprogress、edits、seen_txid、VERSION。緩存