2. Hadoop HDFS
Posted 小K学大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. Hadoop HDFS相关的知识,希望对你有一定的参考价值。
Hadoop
HDFS
概述
HDFS(Hadoop Distributed File System),分布式文件系统用于存储文件,通过目录树定位文件,由多个服务器节点联合起来实现功能,集群中的服务器有各自的角色
适合一次写入,多次读取的场景,只能append(追加写)。一个文件在经过创建、写入和关闭之后就不需要被改变
优缺点
优点
-
高容错性 -
数据以多副本形式保存在各个节点上,某一个节点上的数据丢失以后,可根据另外节点上的完整数据进行自动恢复 -
适合处理大数据场景 -
数据规模大、数据量大 -
可构建在廉价的机器上
缺点
-
不适合低延时的数据访问 -
不能做到毫秒级的存储数据(mysql、Hive可以做到) -
无法高效的对大量小文件进行存储 -
每个文件需要存储文件目录和块信息,NameNode存储有限 -
单个小文件的寻址时间会超过读取时间,违背HDFS设计原则 -
不支持并发写入和文件的随机修改 -
一个文件同时只能运行一个线程或任务写入 -
仅支持数据追加写入,不支持文件的随机修改
组成架构
-
NameNode(NN):HDFS的管理者 -
管理HDFS的名称空间 -
配置副本策略 -
管理数据块的映射信息 -
处理客户端的读写请求 -
DataNode(DN):执行实际的操作 -
存储实际的数据块 -
执行数据块的读写操作 -
Client:客户端 -
文件切分,在文件上传HDFS的时候,客户端将文件按照Block大小切分成一个个的Block,然后上传 -
与NN交互,获取文件的位置信息 -
与DN交互,读取或者写入数据 -
提供命令管理HDFS ---> NN的格式化 -
提供命令访问HDFS ---> HDFS的增删改查 -
Seconary NameNode -
辅助NN,定期合并Fsimage和Edits,并推送给NN -
紧急情况下,可以辅助恢复NN
HDFS文件块大小
文件块大小的设定与硬盘的传输速度有关,目前普通机械硬盘的传输速度为100MB/s。假设寻址时间为10ms,存储时间为寻址时间的100倍,为保证HDFS的高效运行,将每个文件块的大小设定为128MB。
-
数据块设置过小,会增加寻址时间,DN中存储过多的数据块,导致程序一直在寻找块的开始位置 -
数据块设置过大,会增加将数据写入硬盘的时间,远大于定位到指定数据块所需的时间,处理该数据块的时间也会增加
Shell操作
-
hadoop fs -moveFromLocal -
hadoop fs -copyFromLocal -
hadoop fs -put -
hadoop fs -appendToFile -
hadoop fs -copyToLocal -
hadoop fs -get -
hadoop fs -ls -
hadoop fs -cat -
hadoop fs -chmod/-chown -
hadoop fs -mkdir -
hadoop fs -cp -
hadoop fs -mv -
hadoop fs -tail -
hadoop fs -rm/-rm -r -
hadoop fs -setrep ---> 设置副本数量
写入流程
图解
流程
-
客户端创建Distributed FileSystem -
客户端向NN发送请求上传文件 -
NN检查存储的元数据 -
文件是否已存在 -
父目录是否已存在 -
NN返回响应客户端是否可以上传指定文件 -
客户端请求上传文件的第一个Block,请求NN返回上传至哪几台DN(假设副本数为3) -
NN返回DN节点信息 -
客户端通过FSDataOutputStream模块请求DN1上传数据并建立pipeline -
DN1收到请求继续请求DN2建立通道pipeline -
DN2请求DN3建立通道pi peline -
完成通道建立 -
从DN3开始向上应答 ---> DN3-DN2-DN1-客户端 -
客户端开始向DN1上传第一个Block -
以packet为单位(64kb) -
packet包含chunck(512byte)和chuncksum(4byte) -
将packet写入dataQueue -
将第一个packet传给DN1,持久化至磁盘的同时,将packet向下一个DN节点传 -
packet写入DN1的同时,会备份一份packet至ackQueue -
packet写入完成后,各个节点会向上返回写入状态,是否完成写入 -
DN1返回所有节点的写入状态给客户端的ResponseProcessor -
如果成功写入指定packet,删除ackQueue中的packet -
如果不成功,将ackQueue中的packet上传至dataQueue的最前端,继续重新发送该packet -
完成第一个Block上传 -
客户端请求上传下一个Block
读入流程
图解
流程
-
客户端创建Distributed FileSystem -
客户端向NN发送下载请求 -
NN判断是否可以下载 -
客户端权限 -
是否存在指定文件 -
返回指定文件元数据 -
客户端创建FSDataInputStream -
客户端通过NN返回的数据块元数据,计算距离最近的DN节点,同时考虑最近节点的目前负载能力,选择最优DN节点,请求读取数据 -
以packet为数据传输单位接收并做文件校验 -
读取数据块模式 ---> 串行(先读完Block1之后再读Block2)
NameNode和Seconary NameNode
第一阶段
-
第一次启动并格式化DN后,创建Fsimage和Edits文件 -
Fsimage:存储HDFS系统中所有目录和文件inode的序列化信息 -
Edits:存储HDFS系统中所有执行的操作命令 -
客户端对元数据进行增删改查的请求 -
NN将记录首先保存至Edits文件中记录操作日志,并实时更新滚动日志 -
NN在内存中对元数据进行指定操作
第二阶段
-
2NN询问NN是否需要CheckPoint -
2NN请求执行CheckPoint -
每隔一小时执行一次 -
每分钟检查操作次数,如果操作次数达到100万,执行CheckPoint -
NN滚动正在写入的Edits日志文件 -
将滚动前的Edits日志和Fsimage文件拷贝至2NN -
加载Edits和Fsimage至内存,并在内存中合并 -
生成新的Fsimage -
将新的Fsimage拷贝至NN -
NN重命名新的Fsimage
DataNode工作机制
-
每个数据块以文件形式存储在DataNode中,包含两个文件 -
数据本身 -
元数据:包含数据块长度、块数据校验和、时间戳 -
DataNode在启动后向NameNode注册 -
以后每6小时DataNode扫描自身节点的数据块信息,并同时上报给NameNode -
DataNode每3秒发送心跳给NameNode -
如果超过10分钟加10个心疼时常(3秒)没有收到DataNode发给NameNode的心跳,NameNode任务该节点不可用
以上是关于2. Hadoop HDFS的主要内容,如果未能解决你的问题,请参考以下文章