内容简介:随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。namenode被格式化之后,将在
随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
HDFS架构
这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。 下面我们分别介绍这四个组成部分。 复制代码
Client客户端
- 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储。
- 与NameNode交互,获取文件的位置信息。
- 与DataNode交互,读取或者写入数据。
- Client提供一些命令来管理HDFS,比如启动或者关闭HDFS。
- Client可以通过一些命令来访问HDFS。
NameNode
就是master,它是一个主管、管理者 复制代码
- 管理HDFS的名称空间。
- 管理数据块(Block)映射信息
- 配置副本策略
- 处理客户端读写请求。
DataNode
就是Slave,NameNode下达命令,DataNode执行实际的操作 复制代码
- 存储实际的数据块。
- 执行数据块的读/写操作。
Secondary NameNode
并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务 复制代码
- 辅助NameNode,分担其工作量。
- 定期合并Fsimage和Edits,并推送给NameNode。
- 在紧急情况下,可辅助恢复NameNode。
关于HDFS文件块大小
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定, 默认大小在hadoop2.x版本中是128M,老版本中是64M。 HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位 这个块开始位置所需的时间,因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。 如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%, 我们要将块大小设置约为100MB。默认的块大小128MB。块的大小:10ms*100*100M/s = 100M 复制代码
HDFS写数据流程
- 客户端通过Distributed FileSystem模块向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。
- namenode返回是否可以上传。
- 客户端请求第一个 block上传到哪几个datanode服务器上。
- namenode返回3个datanode节点,分别为dn1、dn2、dn3。
- 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
- dn1、dn2、dn3逐级应答客户端。
- 客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
- 当一个block传输完成之后,客户端再次请求namenode上传第二个block的服务器。(重复执行3-7步)
HDFS读数据流程
- 客户端通过Distributed FileSystem向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
- 挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。
- datanode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。
- 客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
NameNode & Secondary NameNode工作机制
- 第一阶段:namenode启动
- 第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
- 客户端对元数据进行增删改的请求。
- namenode记录操作日志,更新滚动日志。
- namenode在内存中对数据进行增删改查。
- 第二阶段:Secondary NameNode工作
- Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
- Secondary NameNode请求执行checkpoint。
- namenode滚动正在写的edits日志。
- 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
- Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
- 生成新的镜像文件fsimage.chkpoint。
- 拷贝fsimage.chkpoint到namenode。
- namenode将fsimage.chkpoint重新命名成fsimage。
关于镜像文件和编辑日志文件
概念
namenode被格式化之后,将在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current目录中产生如下文件:
edits_0000000000000000000 fsimage_0000000000000000000.md5 seen_txid VERSION 复制代码
- Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息。
- Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
- seen_txid文件保存的是一个数字,就是最后一个edits_的数字
- 每次Namenode启动的时候都会将fsimage文件读入内存,并从00001开始到seen_txid中记录的数字依次执行每个edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成Namenode启动的时候就将fsimage和edits文件进行了合并。
以上所述就是小编给大家介绍的《浅谈hdfs架构与数据流》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 大数据技术 DataPipeline在大数据平台的数据流实践
- DataPipeline在大数据平台的数据流实践
- 我对前后端数据模型和数据流的理解
- stream – 数据流处理
- 我所认识的前端数据流
- Node.js与二进制数据流
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro Django
Marty Alchin / Apress / 2008-11-24 / USD 49.99
Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!