在Hadoop的HDFS部署好了之后並不能馬上使用,而是先要對配置的文件系統進行格式化。在這里要注意兩個概念,一個是文件系統,此時的文件系統在物理上還不存在,或許是網絡磁盤來描述會更加合適;二就是格式化,此處的格式化並不是指傳統意義上的本地磁盤格式化,而是一些清除與准備工作。本文接下來將主要討論NameNode節點上的格式化。
我們都知道,NameNode主要被用來管理整個分布式文件系統的命名空間(實際上就是目錄和文件)的元數據信息,同時為了保證數據的可靠性,還加入了操作日志,所以,NameNode會持久化這些數據(保存到本地的文件系統中)。對於第一次使用HDFS,在啟動NameNode時,需要先執行-format命令,然后才能正常啟動NameNode節點的服務。那么,NameNode的fromat命令到底做了什么事情呢?
在NameNode節點上,有兩個最重要的路徑,分別被用來存儲元數據信息和操作日志,而這兩個路徑來自於配置文件,它們對應的屬性分別是dfs.name.dir和dfs.name.edits.dir,同時,它們默認的路徑均是/tmp/hadoop/dfs/name。格式化時,NameNode會清空兩個目錄下的所有文件,之后,會在目錄dfs.name.dir下創建文件:
- {dfs.name.dir}/current/fsimage
- {dfs.name.dir}/current/fstime
- {dfs.name.dir}/current/VERSION
- {dfs.name.dir}/image/fsimage
會在目錄dfs.name.edits.dir下創建文件:
- {dfs.name.edits.dir}/current/edits
- {dfs.name.edits.dir}/current/fstime
- {dfs.name.edits.dir}/current/VERSION
- {dfs.name.edits.dir}/image/fsimage
那么這些文件又是用來干什么的呢?
在介紹這文件的用途之前,我們可以將dfs.name.dir和dfs.name.edits.dir配置成相同的目錄,這樣的話,NameNode執行格式化之后,會產生如下的文件:{dfs.name.dir}/current/fsimage、{dfs.name.dir}/current/edits、{dfs.name.dir}/current/fstime、{dfs.name.dir}/current/VERSION、{dfs.name.dir}/image/fsimage,由此可以看出上面名字相同的文件實際是一樣的,所以在這里,我建議把dfs.name.dir和dfs.name.edits.dir配置成相同的值,以來提高NameNode的效率。ok,現在就來重點的介紹一下這些文件的用途吧。
fsimage:存儲命名空間(實際上就是目錄和文件)的元數據信息,文件結構如下:
edits:用來存儲對命名空間操作的日志信息,實現NameNode節點的恢復;
fstime:用來存儲元數據上一次check point 的時間;
VERSION:用來存儲NameNode版本信息,命名空間ID(版本號),內容如下:
/image/fsimage: 上一次提交前的/current/fsimage文件;