HDFS体系结构

来源:互联网 发布:超星尔雅网络课程 编辑:程序博客网 时间:2024/06/10 00:54


Namenode


是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息metadate和每个文件对应的数据块列表。

功能:接收用户的操作请求。

metadate信息包括:

1、文件的owership和permission。

2、文件包含哪些block块

3、block保存在哪个DataNode(由DataNode启动时上报)


metadate存储到磁盘文件名为“fsimage”。

warn:block的位置信息不回保存到fsimage上。在DataNode启动时上报,存在内存里。


文件位置:

 hdfs-default.xml的dfs.namenode.name.dir 属性(hadoop-hdfs-2.7.2.jar  /  hdfs-default.xml)

[html] view plain copy
print?
  1. <property>  
  2.   <name>dfs.namenode.name.dir</name>  
  3.   <value>file://${hadoop.tmp.dir}/dfs/name</value>  
  4.   <description>Determines where on the local filesystem the DFS name node  
  5.       should store the name table(fsimage).  If this is a comma-delimited list  
  6.       of directories then the name table is replicated in all of the  
  7.       directories, for redundancy. </description>  
  8. </property>  

${hadoop.tmp.dir} 配置在  core-site.xml 中

[html] view plain copy
print?
  1. <property>  
  2.         <name>hadoop.tmp.dir</name>  
  3.         <value>/home/hadoop_data</value>  
  4. </property>  


metadate信息保存磁盘包含:

1、fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息,无block位置信息。



2、edits:metadate操作日志文件

3、fstime:保存最近一次checkpoint的时间。


查看NameNode内容

方式一:webhdfs查看

命令:hdfs oiv -i xxx -o 

[plain] view plain copy
print?
  1. Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE  
  2. Offline Image Viewer  
  3. View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,  
  4. saving the results in OUTPUTFILE.  
  5.   
  6. The oiv utility will attempt to parse correctly formed image files  
  7. and will abort fail with mal-formed image files.  
  8.   
  9. The tool works offline and does not require a running cluster in  
  10. order to process an image file.  
  11.   
  12. The following image processors are available:  
  13.   * XML: This processor creates an XML document with all elements of  
  14.     the fsimage enumerated, suitable for further analysis by XML  
  15.     tools.  
  16.   * FileDistribution: This processor analyzes the file size  
  17.     distribution in the image.  
  18.     -maxSize specifies the range [0, maxSize] of file sizes to be  
  19.      analyzed (128GB by default).  
  20.     -step defines the granularity of the distribution. (2MB by default)  
  21.   * Web: Run a viewer to expose read-only WebHDFS API.  
  22.     -addr specifies the address to listen. (localhost:5978 by default)  
  23.   * Delimited (experimental): Generate a text file with all of the elements common  
  24.     to both inodes and inodes-under-construction, separated by a  
  25.     delimiter. The default delimiter is \t, though this may be  
  26.     changed via the -delimiter argument.  
  27.   
  28. Required command line arguments:  
  29. -i,--inputFile <arg>   FSImage file to process.  
  30.   
  31. Optional command line arguments:  
  32. -o,--outputFile <arg>  Name of output file. If the specified  
  33.                        file exists, it will be overwritten.  
  34.                        (output to stdout by default)  
  35. -p,--processor <arg>   Select which type of processor to apply  
  36.                        against image file. (XML|FileDistribution|Web|Delimited)  
  37.                        (Web by default)  
  38. -delimiter <arg>       Delimiting string to use with Delimited processor.    
  39. -t,--temp <arg>        Use temporary dir to cache intermediate result to generate  
  40.                        Delimited outputs. If not set, Delimited processor constructs  
  41.                        the namespace in memory before outputting text.  
  42. -h,--help              Display usage information and exit  

实例:

 hdfs oiv -i fsimage_0000000000000000162 -o fsimage_000000000000000016_cat

[plain] view plain copy
print?
  1. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading 2 strings  
  2. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading 18 inodes.  
  3. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading inode references  
  4. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loaded 0 inode references  
  5. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading inode directory section  
  6. 16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loaded 11 directories  
  7. 16/08/12 18:46:54 INFO offlineImageViewer.WebImageViewer: WebImageViewer started. Listening on /127.0.0.1:5978. Press Ctrl+C to stop the viewer.  

hadoop会启动内置的tomcat。监听端口 127.0.0.1:5978

浏览器访问webhdfs方式见博客:http://blog.csdn.net/zengmingen/article/details/52189857

SecureCRT  clone session 执行:hdfs dfs -ls  -R webhdfs://127.0.0.1:5978/

[plain] view plain copy
print?
  1. drwx------   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp  
  2. drwx------   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn  
  3. drwx------   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging  
  4. drwx------   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/hadoop  
  5. drwx------   - hadoop supergroup          0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/hadoop/.staging  
  6. drwxr-xr-x   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history  
  7. drwxrwxrwt   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate  
  8. drwxrwx---   - hadoop supergroup          0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop  
  9. -rwxrwx---   1 hadoop supergroup      33303 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001-1460643581404-hadoop-wcount.jar-1460643608082-1-1-SUCCEEDED-default-1460643592087.jhist  
  10. -rwxrwx---   1 hadoop supergroup        349 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001.summary  
  11. -rwxrwx---   1 hadoop supergroup     115449 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001_conf.xml  
  12. drwxr-xr-x   - hadoop supergroup          0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/wc  
  13. drwxr-xr-x   - hadoop supergroup          0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output  
  14. -rw-r--r--   1 hadoop supergroup          0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output/_SUCCESS  
  15. -rw-r--r--   1 hadoop supergroup         36 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output/part-r-00000  
  16. drwxr-xr-x   - hadoop supergroup          0 2016-04-14 00:58 webhdfs://127.0.0.1:5978/wc/srcdata  
  17. -rw-r--r--   1 hadoop supergroup         44 2016-04-14 00:58 webhdfs://127.0.0.1:5978/wc/srcdata/word.log  


方式二:导出到xml(其他文件)查看

命令:hdfs oiv -p XML -i xxxx -o xxxx.xml(XML 必须大写)

实例:hdfs oiv -p XML -i fsimage_0000000000000000162 -o fsimage_0000000000000000162.xml

命令: cat fsimage_0000000000000000162.xml 就能查看内容了。


查看edtis内容

方式与查看fsimage不同

命令:hdfs oev -i xxxx  -o xxx.xml   (default xml  file

实例:hdfs oev -i edits_0000000000000000163-0000000000000000163 -o edits_0000000000000000163-0000000000000000163.xml

命令: cat edits_0000000000000000163-0000000000000000163.xml

[plain] view plain copy
print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <EDITS>  
  3.   <EDITS_VERSION>-63</EDITS_VERSION>  
  4.   <RECORD>  
  5.     <OPCODE>OP_START_LOG_SEGMENT</OPCODE>  
  6.     <DATA>  
  7.       <TXID>163</TXID>  
  8.     </DATA>  
  9.   </RECORD>  
  10. </EDITS>  


SecondaryNameNode(SNN)

-当数据很多时,NN的metadate也会很大,当matedate写入磁盘时,会带来NN机子的IO使用较高,给NN增加压力

因而分配一个助手。http://blog.csdn.net/zengmingen/article/details/51115802

Datanode

提供真实文件数据的存储服务。

1、文件块(block):最基本的存储单元。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称为一个block,hdfs默认block大小是128MB,一个256MB文件,共有256/128=2个block。

不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。

hdfs有append追加功能,但一般都不用,追加会改变block的数量,block又有副本,成本太高。


2、Replication。多复本。默认是三个。

在hdfs-site.xml的dfs.replication属性

[html] view plain copy
print?
  1. <configuration>  
  2.   
  3. <property>  
  4.         <name>dfs.replication</name>  
  5.         <value>1</value>  
  6. </property>  
  7.   
  8. </configuration>  



warn

1、如果副本数设置为3,但datanode机器只有2台,那整个hadoop是不能工作存不了数据的。一个datanode节点不能有两个相同内容的block。

2、启动DataNode线程时会向NameNode汇报block信息。

3、通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode 10分钟没有收到DataNode心跳,则认为其已经lost,并copy其上的block(其他DataNode的相同副本)到其他DataNode。


Block的副本放置策略

第一个副本:放置在上传文件的DataNode上。

如果是集群外提交,则随机选择一台磁盘不太满,cpu不太忙的机子。

第二个副本:放置在第一个副本不同的机架的机子上。

第三个副本:放置在与第二个副本相同机架不同机子上。

更多副本:随机节点。


数据存储:staging


HDFS client上传数据到HDFS时,会首先在本地缓存数据,当数据达到一个block大小时,请求NameNode分配一个block。
NameNode会把block所在的DataNode的地址告诉HDFS client。
HDFS client会直接和DataNode通信,把数据写到DataNode节点一个block文件中。

数据存储:读文件解析


步骤解析:

1、首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例。

2、DistributedFileSystem通过RPC获得文件的第一批block的locations,同一block按照重复数(replication)会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。

3、前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。

4、数据从datanode源源不断的流向客户端。

5、如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

6、如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

warn:

1、如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像。

2、该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。


数据存储:写文件解析


步骤解析:

1.客户端通过调用DistributedFileSystem的create方法创建新文件。

2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常。

3.前两步结束后会返回FSDataOutputStream的对象,与读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。

4.DataStreamer会去处理接受data quene,他先问询namenode这个新的block最适合存储的在哪几个datanode里(参考第二小节),比如重复数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。

5.DFSOutputStream还有一个对列叫ack quene,也是有packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc quene才会把对应的packet包移除掉。

6.客户端完成写数据后调用close方法关闭写入流。

7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。

warn:

如果在写的过程中某个datanode发生错误,会采取以下几步:

1) pipeline被关闭掉;

2)为了防止防止丢包ack quene里的packet会同步到data quene里;

3)把产生错误的datanode上当前在写但未完成的block删掉;

4)block剩下的部分被写到剩下的两个正常的datanode中;

5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

warn:

另外要注意得一点,客户端执行write操作后,写完得block才是可见的,正在写的block对客户端是不可见的,只有调用sync方法,客户端才确保该文件被写操作已经全部完成,当客户端调用close方法时会默认调用sync方法。是否需要手动调用取决你根据程序需要在数据健壮性和吞吐率之间的权衡。






原创粉丝点击