HDFS Hadoop分布式文件系统
目录
本质
Hadoop Distributed File System Hadoop文件存储系统,相当于磁盘上的磁盘,可以看成磁盘一体。
作用
三个重要作用:存储超大的文件、采用流式的数据访问方式、运行于商业硬件上
架构
架构分为1.X和 2.X架构 2.X解决了1.X的问题
1.X架构
2.X高可用架构
1.X和2.X对比
1、namenode
存储块儿的元数据、接收客户端的读写请求、获取block快的位置
2、datanode
存储block、存储block副本、处理客户端的读写块儿的请求
3、secondaryNamenode(1.x有的,2.x去掉)
主要进行进行镜像文件和操作日志的合并工作
fsimage 元数据镜像文件
edits log 数据的操作日志
4、Client:就是客户端。
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
Client 可以通过一些命令来访问 HDFS。
5、jobTracker
负责管理集群中的资源
负责分配要执行的任务
6、taskTracker
实际工作的任务节点
7、JournalNode(2.x 引入)
存储对应的元数据信息
执行过程
当处于active的NN的命名空间发生数据变化的时候,会通知大部分的JN,超过半数生效
另一个处于standby的NN会监控JN的数据变化,当有变化的时候,同步数据到本台命名空间(为了保证数据同步,实时切换)
8、zkfc
监控NN的健康状态,实时切换
1.X和2.X对比 总结
1.X存在问题:
1、nn单点故障
2、nn压力过大,内存受限,不可扩展
3、jobtracter 压力过大,无法扩展
4、无法兼容除了MR之外 的其他任意框架(比如:storm,spark)
2.X解决了1.X问题
解决问题1:
hdfs HA :通过一个主备切换的nn 完成
集群中包含两台nn,一台处于active,另一台处于standby
切换策略
手动切换
自动切换
解决问题2,3的改进:hdfs Federation
将存储的元数据信息分布在多台NN
所有的NN共享DN的数据
解决问题4的改进:引入了yarn 资源管理框架
实现了高可用的ResourceManager
spark,storm可以运行在yarn的资源管理框架上
流程
写文件的流程:
1、客户端client调用create函数创建文件;
2、DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件;
3、元数据节点首先确定文件是否存在,并且客户端是否有创建文件的权限,然后创建新文件;
4、DistributedFileSystem返回FSDataOutputStream给客户端用于写数据;
5、客户端开始写入数据,FSDataOutputStream将数据分成块,写入data queue;
6、Data queue由DataStreamer读取,并通知元数据节点分配数据节点,用来存储数据块
(每块默认复制3块),分配的数据节点放在一个pipeline里;
7、DataStreamer将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据块发送给
第二个数据节点,第二个数据节点将数据发送给第三个数据节点;
8、FSDataOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知
数据已经写入成功;
9、如果数据节点在写入的过程中失败,则进行以下几个操作:
一是关闭pipeline并将ack queue中的数据块放入data queue的开始;
二是当前数据块在已写入的数据节点中被元数据节点赋予新的标示,错误节点重启后察觉其数据块过时而被删除;
三是失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点;
四是元数据节点被通知此数据块的复制块数不足,从而再创建第三份备份;
10、当客户端结束写入数据,则调用close函数将所有的数据块写入pipeline中的数据节点,
并等待ack queue返回成功,最后通知元数据节点写入完毕
读文件的流程:
1、客户端client使用open函数打开文件;
2、DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息;
3、对于每一个数据块,元数据节点返回保存数据块的数据节点的地址;
4、DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据;
5、客户端调用FSDataInputStream的read函数开始读取数据;
6、FSDataInputStream连接保存此文件第一个数据块的最近的数据节点;
7、Data从数据节点读到客户端;
8、当此数据块读取完毕时,FSDataInputStream关闭和此数据节点的连接,
然后连接此文件下一个数据块的最近的数据节点;
9、当客户端读取数据完毕时,调用FSDataInputStream的close函数;
10、在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试
连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
优缺点
优点
1、高容错性、可构建在廉价的机器上
2、适合批处理
3、适合大数据处理
4、流式文件访问
缺点
1、不支持低延迟访问
2、不适合小文件存储
3、不支持并发写入
4、不支持修改
常用
hadoop fs 等同于 hdfs fs,作为命令头
1.启动hdfs集群 start-dfs.sh
2.启动yarn集群 start-yarn.sh
3.查看hdfs系统的根目录 hadoop fs -ls /
4.创建文件夹 hadoop fs -mkdir /a
5.级联创建文件夹 hadoop fs -mkdir -p /aa/bb/cc
6.查看根目录下的所有文件包括子文件夹里面的文件 hadoop fs -ls -R /aa
7.上传文件
hadoop fs -put a.txt /aa
hadoop fs -copyFromLocal words.txt /aa/bb
8.下载文件
hadoop fs -get /aa/word.txt /aa
hadoop fs -copyToLocal /aa/word.txt /aa
9.合并下载 hadoop fs -getmerge /aa/word.txt /aa/bb/word.txt /aa
10.复制 hadoop fs -cp /aa/word.txt /a
11.移动 hadoop fs -mv /a/word.txt /a/b
12.删除文件 hadoop fs -rm /a/bword.txt
13.删除空目录 hadoop fs -rmdir /a/b
14.强制删除 hadoop fs -rm -r /aa/bb
15.从本地剪切到hdfs上 hadoop fs -moveFromLocal /a/word.txt /a/b
16.追加文件 hadoop fs -appendToFile /hello.txt /aa/bb/word.txt
17.查看文件内容 hadoop fs -cat /a/b/word.txt
常见问题
HDFS 副本存放策略
异议
有差错的地方,还望大家评论指出,并详细论证,相互学习,共同进步哈!
上一篇: token踩坑日常
下一篇: LeetCode算法