hdfs基本概念(设计思想 特性 工作机制 上传下载 namenode存储元数据机制)
2019/2/16 星期六
hdfs基本概念(设计思想 特性 工作机制 上传下载 namenode存储元数据机制)
1、hdfs总的设计思想:
设计目标:提高分布式并发处理数据的效率(提高并发度和移动运算到数据)
分而治之:将大文件、大批量文件,分布式存放在大量独立的服务器上,以便于采取分而治之的方式对海量数据进行运算分析;
重点概念:文件切块,副本存放,元数据,位置查询,数据读写流
2、hdfs的shell操作 //见响应的单独文档
3、hdfs的一些概念
Hdfs分布式文件系统的基本工作机制及相关概念解析 //见画图
首先,它是一个文件系统,有一个统一的命名空间--目录树, 客户端访问hdfs 文件时就是
通过指定这个目录树中的路径来进行
其次,它是分布式的,由很多服务器联合起来实现功能;
hdfs 文件系统会给客户端提供一个统一的抽象目录树,Hdfs 中的文件都是分块(block)
存储的,块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x 版本
中是128M,老版本中是64M
文件的各个block 由谁来进行真实的存储呢?----分布在各个datanode 服务节点上,而
且每一个block 都可以存储多个副本(副本数量也可以通过参数设置dfs.replication,默
认值是3)
Hdfs 中有一个重要的角色:namenode,负责维护整个hdfs 文件系统的目录树,以及每
一个路径(文件)所对应的block 块信息(block 的id,及所在的datanode 服务器)
hdfs 是设计成适应一次写入,多次读出的场景,并不支持文件的修改
(hdfs 并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)
hdfs 切片的定义 概念
1:定义一个切片大小:可以通过参数来调节,默认情况下等于"hdfs 中设置的blocksize",通常是128M
2:获取输入数据目录下所有待处理文件List
3:遍历文件List,逐个逐个文件进行切片
for(file:List)
对file 从0 偏移量开始切,每到128M 就构成一个切片,比如a.txt(200M),就会被切成两个切片: a.txt: 0-128M, a.txt :128M-256M
再比如b.txt(80M),就会切成一个切片, b.txt :0-80M
HDFS Block复制策略
-第1个副本放在客户端所在节点
•如果是远程客户端,block会随机选择节点
•系统会首先选择空闲的DataNode节点
-第2个副本放在不同的机架节点上
-第3个副本放在与第2个副本同一机架的不同机器上
-很好的稳定性、负载均衡,较好的写入带宽、读取性能,块均匀分布
-机架感知:将副本分配到不同的机架上,提高数据的高容错性
-以节点为备份对象
4、特性:
容量可以线性扩展
数据存储高可靠
分布式运算处理很方便
数据访问延迟较大,不支持数据的修改操作
适合一次写入多次读取的应用场景
5、hdfs 的工作机制
HDFS 集群分为两大角色:NameNode、DataNode
NameNode 负责管理整个文件系统的元数据
DataNode 负责管理用户的文件数据块
6、namenode 工作机制
namenode 职责:
1、响应客户端请求 //客户端去请求hdfs的时候都会先去找namenode
2、维护目录树 //客户端去读或者写文件的时候都会去指定一个目录,这个目录是hdfs的目录,这个目录有namenode管理
3、管理元数据(查询,修改) *****
//什么是元数据
文件的描述信息:某一个路径的文件有几个block,每一个block在那些datanode上面有存储,一个文件的副本数量是几?这些信息就是元数据,元数据很重要,不能发生丢失或者错误,那么在客户端请求的时候,就有可能请求不到。
提示:内存中存储了一份完整的元数据,包括目录树结构,以及文件和数据块和副本存储地 的映射关系;
7、datanode 的工作机制
1、Datanode 工作职责:
2、存储管理用户的文件块数据
3、定期向namenode 汇报自身所持有的block 信息(通过心跳信息上报)
4、上传一个文件,观察文件的block 具体的物理存放情况
在每一台datanode 机器上的这个目录:
/home/hadoop/app/hadoop-2.4.1/tmp/dfs/data/current/BP-193442119-192.168.2.120-1432457733
977/current/finalized
2019/2/18 星期一
hdfs 写数据流程(put)
1、根namenode 通信请求上传文件,namenode 检查目标文件是否已存在,父目录是否存在
2、namenode 返回是否可以上传
3、client 请求第一个block 该传输到哪些datanode 服务器上
4、namenode 返回3 个datanode 服务器ABC
5、client 请求3 台dn 中的一台A 上传数据(本质上是一个RPC 调用,建立pipeline),A收到请求会继续调用B,然后B 调用C,将真个pipeline 建立完成,逐级返回客户端
6、client 开始往A 上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A 收到一个packet 就会传给B,B 传给C;A 每传一个packet 会放入一个应答队列等待应答
7、当一个block 传输完成之后,client 再次请求namenode 上传第二个block 的服务器。
hdfs 读数据流程(get)
1、跟namenode 通信查询元数据,找到文件块所在的datanode 服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket 流
3、datanode 开始发送数据(从磁盘里面读取数据放入流,以packet 为单位来做校验)
4、客户端以packet 为单位接收,现在本地缓存,然后写入目标文件
小结:
在这里我们描述的是hdfs的读写数据的流程是比较顺利的一种情况,这上面的每一个阶段都有可能出现异常,那hdfs对于每个异常也是很完善的,容错性非常的高,这些异常处理的逻辑比较复杂,我们暂时不做深入的描述,搞懂正常的读写流程就ok了。
Hdfs中namenode管理元数据的机制 //元数据的 CheckPoint
如图:
hdfs 元数据是怎么存储的?
A、内存中有一份完整的元数据(特定数据结构)
B、磁盘有一个"准完整"的元数据的镜像文件
C、当客户端对hdfs 中的文件进行新增或者修改操作,首先会在edits 文件中记录操作日志,当客户端操作成功后,相应的元数据会更新到内存中;每隔一段时间,会由secondary namenode 将namenode 上积累的所有edits 和一个最新的fsimage 下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
D、checkpoint 操作的触发条件配置参数:
dfs.namenode.checkpoint.check.period=60 #检查触发条件是否满足的频率,60 秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
#以上两个参数做checkpoint 操作时,secondary namenode 的本地工作目录
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3 #最大重试次数
dfs.namenode.checkpoint.period=3600 #两次checkpoint 之间的时间间隔3600 秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint 之间最大的操作记录
E、namenode 和secondary namenode 的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode 的工作目录中将fsimage 拷贝到namenode 的工作目录,以恢复namenode 的元数据
F、可以通过hdfs 的一个工具来查看edits 中的信息
bin/hdfs oev -i edits -o edits.xml