hadoop項目地址:http://hadoop.apache.org/
NameNode、DataNode詳解
(一)分布式文件系統概述
- 數據量越來越多,在一個操作系統管轄的范圍存不下了,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,因此迫切需要一種系統來管理多台機器上的文件,這就是分布式文件管理系統 。
- 是一種允許文件通過網絡在多台主機上分享的文件系統,可讓多機器上的多用戶分享文件和存儲空間。
- 通透性。讓實際上是通過網絡來訪問文件的動作,由程序與用戶看來,就像是訪問本地的磁盤一般。 容錯。即使系統中有某些節點脫機,整體來說系統仍然可以持續運作而不會有數據損失。
- 分布式文件管理系統很多,hdfs只是其中一種,不合適小文件。
(二)HDFS的簡單使用
通過hdfs命令查看所有的可使用參數
[root@neusoft-master bin]# hdfs Usage: hdfs [--config confdir 可選項,指定配置文件目錄,默認在/etc/hadoop目錄下] COMMAND where COMMAND is one of: dfs run a filesystem command on the file systems supported in Hadoop. #重點 namenode -format format the DFS filesystem #最好只執行一次 secondarynamenode run the DFS secondary namenode #在hadoop2中不用 namenode run the DFS namenode journalnode run the DFS journalnode zkfc run the ZK Failover Controller daemon datanode run a DFS datanode dfsadmin run a DFS admin client haadmin run a DFS HA admin client fsck run a DFS filesystem checking utility balancer run a cluster balancing utility jmxget get JMX exported values from NameNode or DataNode. mover run a utility to move block replicas across storage types oiv apply the offline fsimage viewer to an fsimage oiv_legacy apply the offline fsimage viewer to an legacy fsimage oev apply the offline edits viewer to an edits file fetchdt fetch a delegation token from the NameNode getconf get config values from configuration groups get the groups which users belong to snapshotDiff diff two snapshots of a directory or diff the current directory contents with a snapshot lsSnapshottableDir list all snapshottable dirs owned by the current user Use -help to see options portmap run a portmap service nfs3 run an NFS version 3 gateway cacheadmin configure the HDFS cache crypto configure HDFS encryption zones storagepolicies list/get/set block storage policies version print the version Most commands print help when invoked w/o parameters.
如果對某一個命令不知道怎么使用,可以直接輸入命令即可,如下
[root@neusoft-master bin]# hdfs dfs #一定在bin目錄下執行hdfs命令 Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>] [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] <path> ...] [-cp [-f] [-p | -p[topax]] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] <src> <localdst>] [-help [cmd ...]] [-ls [-d] [-h] [-R] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-usage [cmd ...]] Generic options supported are -conf <configuration file> specify an application configuration file -D <property=value> use value for given property -fs <local|namenode:port> specify a namenode -jt <local|resourcemanager:port> specify a ResourceManager -files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster -libjars <comma separated list of jars> specify comma separated jar files to include in the classpath. -archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines. The general command line syntax is bin/hadoop command [genericOptions] [commandOptions]
在hadoop1中使用hadoop dfs ...,上述的命令提示還是老版本的命令。在hadoop2中使用hdfs dfs ... 命令,如下圖所示:
提示:linux中的ls -l命令,需要明確了解顯示的內容的含義
d表示目錄。-表示文件,l表示鏈接,之后9位的每三位是一組,第一組表示創建者,第二組表示創建者所在組,第三個表示其他人。
(三)HttpFS訪問方式
1:httpfs是一個hadoop hdfs的一個http接口,通過WebHDFS REST API 可以對hdfs進行讀寫等訪問
2:與WebHDFS的區別是不需要客戶端可以訪問hadoop集群的每一個節點,通過httpfs可以訪問放置在防火牆后面的hadoop集群
3:httpfs是一個Web應用,部署在內嵌的tomcat中
操作方式如下:
1.編輯文件httpfs-env.sh,將端口為14000的打開即可
2.編輯文件core-site.xml,添加
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3.重新啟動namenode,執行sbin/httpfs.sh start
[root@neusoft-master sbin]# ./stop-all.sh #停止集群 [root@neusoft-master sbin]# ./start-all.sh #重新開啟集群 [root@neusoft-master sbin]# jps 38143 NameNode 38444 SecondaryNameNode 38696 NodeManager 38248 DataNode 38835 Jps 38599 ResourceManager [root@neusoft-master sbin]# ./httpfs.sh start #開啟httpfs
開啟后為了確認httpfs命令已開啟,重新執行該命令,可以查看到PID已經存在的信息。
4.執行命令curl -i "http://neusoft-master:14000/webhdfs/v1/?user.name=root&op=GETHOMEDIRECTORY"
[root@neusoft-master sbin]# curl -i "http://neusoft-master:14000/webhdfs/v1/?user.name=root&op=GETHOMEDIRECTORY"
下面的紅色信息為http所帶的head信息 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1486432504558&s=o83ImIOyH8z6T2ZhI/YRH3secGk="; Path=/; Expires=Tue, 07-Feb-2017 01:55:04 GMT; HttpOnly Content-Type: application/json Transfer-Encoding: chunked Date: Mon, 06 Feb 2017 15:55:06 GMT
GETHOMEDIRECTORY查看主文件目錄的結果如下:
{"Path":"\/user\/root"} #結果信息
更多命令參考http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
(四)HDFS體系結構
Client客戶端+Namenode+DataNode
1.Namenode
是整個文件系統的管理節點。它維護着1.整個文件系統的文件目錄樹,2.文件/目錄的元信息和每個文件對應的數據塊列表。3.接收用戶的操作請求。
(見源碼) 文件包括:(hdfs-site.xml的dfs.namenode.name.dir屬性)
- fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息。
- edits:操作日志文件。
- fstime:保存最近一次checkpoint的時間 以上這些文件是保存在linux的文件系統中。
總結:
NameNode維護着2張表:
1.文件系統的目錄結構,以及元數據信息
2.文件與數據塊(block)列表的對應關系
元數據存放在fsimage中,在運行的時候加載到內存中的(讀寫比較快)。
操作日志寫到edits中。(類似於LSM樹中的log)
(剛開始的寫文件會寫入到內存中和edits中,edits會記錄文件系統的每一步操作,當達到一定的容量會將其內容寫入fsimage中)
實驗:
(a)通過maven下載源代碼,查看hdfs-default.xml配置文件
<property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> <description>Determines where on the local filesystem the DFS name node should store the name table(fsimage). If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description> </property>
描述信息為:確定在本地文件系統上的DFS名稱節點應存儲名稱表(fsimage)。 fsimage的內容會被存儲到以逗號分隔的列表的目錄中,然后在所有的目錄中復制名稱表目錄,用於冗余。
****在實際應用中只需要將上述的源代碼復制到hdfs-site.xml中,將<value>中的值改為以逗號分隔的列表即可。(注意:逗號后千萬不可加空格在寫文件)
(b)通過源代碼信息的查找,尋找dfs.namenode.name.dir的信息,首先應該找到hadoop.tmp.dir的配置信息,從而尋找到core-site.xml
[root@neusoft-master sbin]# vi ../etc/hadoop/core-site.xml <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://neusoft-master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.6.0-cdh5.6.0/tmp</value> </property>
(c)根據上述分析查找tmp目錄以及其子目錄的詳細信息
(d)VERSION信息的內容
[root@neusoft-master sbin]# more /opt/hadoop-2.6.0-cdh5.6.0/tmp/dfs/namesecondary/current/VERSION
顯示內容:
#Mon Feb 06 23:54:55 CST 2017 namespaceID=457699475 #命名空間,hdfs格式化會改變命名空間id,當首次格式化的時候datanode和namenode會產生一個相同的namespaceID,然后讀取數據就可以,如果你重新執行格式化的時候,namenode的namespaceID改變了,但是datanode的namespaceID沒有改變,兩邊就不一致了,如果重新啟動或進行讀寫hadoop就會掛掉。 clusterID=CID-409e0084-39f0-4386-8184-dd555478a3d6 #hdfs集群 cTime=0 storageType=NAME_NODE blockpoolID=BP-625280320-192.168.191.130-1483628038952 #hdfs聯邦中使用,就是里面的namenode是共享的 layoutVersion=-60
多次格式化namenode的問題原因解釋?
答:hdfs格式化會改變命名空間id,當首次格式化的時候datanode和namenode會產生一個相同的namespaceID,然后讀取數據就可以,如果你重新執行格式化的時候,namenode的namespaceID改變了,但是datanode的namespaceID沒有改變,兩邊就不一致了,如果重新啟動或進行讀寫hadoop就會掛掉。
解決方案:hdfs namenode -format -force 進行強制的格式化會同時格式化namenode和datanode
-format [-clusterid cid ] [-force] [-nonInteractive] (完整的命令為hdfs namenode [-format [-clusterid cid ] [-force] [-nonInteractive]])。
查看NameNode內容
- 啟動服務器bin/hdfs oiv -i 某個fsimage文件
- 查看內容bin/hdfs dfs -ls -R webhdfs://127.0.0.1:5978/
- 導出結果bin/hdfs oiv -p XML -i tmp/dfs/name/current/fsimage_0000000000000000055 -o fsimage.xml
- 查看edtis內容bin/hdfs oev -i tmp/dfs/name/current/edits_0000000000000000057-0000000000000000186 -o edits.xml
在hadoop2中,namenode的50030端口換成8088,新的yarn平台默認是8088,也可以通過yarn-site.xml配置,如下
-
<property> <name>yarn.resourcemanager.webapp.address</name> <value>neusoft-master:8088</value> </property>
2.Datanode
- 提供真實文件數據的存儲服務。
- 文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序對文件進行划分並編號,划分好的每一個塊稱一個Block。
- HDFS默認Block大小是128MB,以一個256MB文件,共有256/128=2個Block. 不同於普通文件系統的是,HDFS中,如果一個文件小於一個數據塊的大小,並不占用整個數據塊存儲空間。ruc
(這樣設置可以減輕namenode壓力,因為namonode維護者文件與數據塊列表的對應大小)
- Replication。多復本。默認是三個。(hdfs-site.xml的dfs.replication屬性)
(1)Hdfs塊大小如何設定?
hdfs-default.xml
<property> <name>dfs.blocksize</name> #block塊存儲的配置信息 <value>134217728</value> #這里的塊的容量最大是128M,請注意 <description> The default block size for new files, in bytes. You can use the following suffix (case insensitive): k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.), Or provide complete size in bytes (such as 134217728 for 128 MB). </description> </property>
描述信息翻譯:
新文件的默認塊大小(以字節為單位)。
您可以使用以下后綴(不區分大小寫):
指定大小(例如128k,512m,1g等)的k(千),m(兆),g(giga),t(tera),p(peta)
或提供完整的大小(以128 MB為單位的134217728)。
***如何修改默認大小的blocksize?答:只需要修改上述配置文件即可。但是這種方式是全局的修改。 64M=67108864
如果想針對文件修改,只需要使用命令修改即可 hadoop fs -Ddfs.blocksize=134217728 -put ./test.txt /test
(2)修改數據塊的測試:
[root@neusoft-master filecontent]# hdfs dfs -Ddfs.blocksize=67108864 -put hellodemo /neusoft/hello2
源數據信息:
上傳之后在hdfs的配置目錄查看,其大小等於19字節,而非64M
或者 下面通過瀏覽器查看:
http://192.168.191.130:50070/explorer.html#/neusoft/ #如果windows上配置了hosts,這里可以寫主機名
注意區別:一個文件可以產生多個快,多個文件是不可能成為一個塊信息的,處於減輕namenode的壓力,最好的方式就是一個文件一個塊
(3)文件塊存放路徑查看與具體信息解釋
(a)查找datanode存放數據的位置,配置信息在hdfs-site.xml中
(b)進入datanode存放信息的目錄查看
[root@neusoft-master subdir0]# cd /opt/hdfs/data/current/BP-625280320-192.168.191.130-1483628038952/current/finalized/subdir0/subdir0
可以查看到元數據的信息以及數據信息
Tips:可以在本地新建一個文件,上傳到HDFS中,查看是否增加了塊信息。
副本機制:默認為3
vi hdfs-site.xml,可以修改,配置文件對全局生效
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
如果想一部分文件副本為3,一部分文件副本位2,這個需求也同樣在命令行執行操作即可
[root@neusoft-master hadoop]# hdfs dfs -setrep 2 /neusoft/hello1
總結:DataNode
使用block形式存儲。在hadoop2中,默認的大小是128MB。
使用副本形式保存數據的安全,默認的數量是3個。
END~