HDFS體系結構(NameNode、DataNode詳解)


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~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM