HDSF(分布式存储学习总结)
1.hadoop的历史
- 大数据起源于Google发布的三篇论文:GFS、MapReduce和BigTable。
- hadoop的作者Doug Cutting根据Google的GFS提出了HDFS分布式,根据MapReduce提出了MapReduce,同时Doug Cutting还是全文搜索Lucene的创始者。
- Google的技术虽好但不开源。如果没有Doug Cutting和他的Hadoop开源软件,我们就看不到如今大数据技术和应用的飞速发展。
2.HDFS的存储原理
2.1HDFS各个角色的作用
1.NameNode
1.接受client的读写请求
2.掌控全局,管理DataNode
3.管理元数据
1. 上传的文件的权限
2. 上传的文件的属主以及属组
3. 上传文件的时间
4. 上传文件的block数以及id号
5. 每一个block的位置是由DN在集群启动时汇报的
6. 各个DN的位置信息
2.DataNode
1.接受客户端的读请求
2.存储block块
3.向Active NN汇报心跳,当一个block块传输完成之后汇报信息
4.构建pipeline管道,实现并行写入数据
5.管理本机(本节点)上的block元数据
3.SecondaryNameNode
- 负责持久化,拉取NN节点上的edits+fsimage文件合并
- edits文件存储客户端对HDFS的操作
- 为什么要搞edits文件(磁盘中)来存储操作呢?因为SNN若要与NN直接交互数据(内存中)的话会锁住NN的内容,不能提供服务
1.合并过程
- 文件拉取之时,在NN节点创建一个edit_new,目的是存储在合并期间对HDFS的操作
- 基于拉来的edits文件进行重演产出元数据
- 将重演产出的元数据合并到fsimage中
- 将合并后的fsimage推送给NN
- 将edits.new文件变为edits文件
2.合并机制
- 大于3600s未合并
- NameNode的edits大小超过64M
4 .ZKFC
1.监控各自的NN,将监控的情况汇报给ZK集群
2.接受Zookeeper的选举结果,确认一下另外一个NN是否真的挂了,将自己监控的NN提升为Active NN
5 . JournalNode
1.写数据的时候只需要保证半数以上的节点写入成功即可,小于势力范围的JournalNode集群内的节点会自杀
2.最终一致性/弱一致性
- 最终一致性:存储半数以上,即可进别的操作
- 弱一致性:必须等存储完所有的节点NN才能进别的操作
3.存储edits文件
6 .Standby NN
1.监控JournalNode中的数据变化,实时更新自己的内存元数据
2.将内存中的元数据持久化到fsimage中,推送给active NN
.
2.2备份机制
- 集群内提交(DataNode上提交)
- 第一个block存在当前DataNode节点(根据就近原则)
- 第一个备份的block存储在与第一个block不同机架的随机一台服务器上
- 第二个备份存在放与第一个备份相同的机架上,但是不是同一台服务器上的随机一台服务器。
- 集群外提交
- 第一个block存放在一个负载不是很高的一台服务器上
- 第一个备份的block存储在与第一个block不同机架的随机一台服务器上
- 第二个备份存在放与第一个备份相同的机架上,但是不是同一台服务器上的随机一台服务器。
.
2.3安全模式
每次启动集群的时候都会启动安全模式,相当于初始化的工作,完成后即可对外提供服务
- 加载fsimage到内存
- 当edits不为空时,此时NameNode将其操作并合并(除初始化时是NameNode合并,其余时候都是SecondaryNode)但是可以得知NameNode也可以合并edits
- 检查DataNode的健康,是否存活
- 若某个DataNode挂掉,会把它本来存储的数据进行备份。
.
2.4权限
他依据Linux里面的权限,他是为了防止好人做错事,不防止坏人做坏事。
2.5读流程
- 首先用户端发送请求到NameNode
- Namenode会判断client是否有权向,如果有权限的话会将datanode的元数据信息返回给client
- Client按照距离和顺序去读取datanode中的block,当datanode发生异常的话会进行记录并上传给datanode节点,剩余的数据读取会略过这个节点
- 读取block之后通过append将block整合成一个完整的文件进行使用
2.6写流程
- client计算block的数量,切割大文件成一个个block
- 用户端client向NameNode汇报上传文件的权限、数据块block数和上传时间,这些内容在此时被加载到NameNode的内存中。
- 请求一个id号和请求存放的block位置
- NameNode将当前负载不高的DataNode的地址发送给client
- 将block切割成一个个packet(64K),然后源源不断地往Pipeline管道(多个备份和一份数据)中传送,实现并行存储。
- DataNode存储完一个块后向NameNode汇报当前的存储情况(block的位置),此时此信息被加载到NameNode内存中。
- 重复上述步骤,直到传送完所有的block
.
2.7HDFS的优缺点
- 优点
- 副本机制,数据安全
- 分布式存储,适合批处理
- 高可用
- 元数据持久化
- 禁掉了一些功能,使集群更加完美(修改文件、文件一旦上传成功,不能修改block块的大小)
- 缺点
- 无法毫秒级的读写数据
- 读写发杂,找NN请求
- 形成管道,文件切割block,block,packet - 不适合存储大量的小文件,容易造成元数据过多,NN内存溢出
- 1.将小文件合并成大文件
- 2.联邦机制 - 不能并发写入,但是可以并发的读取
- 无法毫秒级的读写数据
.
2.8HDFS的操作
命令 | 功能 | 例子 |
---|---|---|
hdfs dfs -ls
| 列出文件或者目录内容 | hdfs dfs -ls / |
hdfs dfs -lsr
| 递归的列出目录内容 | hdfs dfs -lsr / |
hdfs dfs -mv | 将hdfs上的文件移动到目的文件夹 | hdfs dfs -mv /user/hadoop/a.txt /user/test,将/user/hadoop下的a.txt文件移动到/user/test目录下 |
hdfs dfs -rm
| 将hdfs上路径为path的文件移动到回收站 | hdfs dfs -rm /test.txt |
hdfs dfs -put | 将本地文件上传到HDFS的目录下 | hdfs dfs -put /home/hadoop/test.txt /user/hadoop |
hdfs dfs -mkdir
| 在hdfs上创建路径为path的目录 | hdfs dfs -mkdir /user/test |
hdfs dfs -appendToFile | 往文件中追加信息 | hdfs dfs -appendToFile /abc.txt /usr/test |
hdfs dfs -copyToLocal
| 将HDFS上的文件复制到本地 | hdfs dfs -copyToLocal … 本地目录 |
hdfs dfs -df -h
| 查看文件系统的磁盘空间 | hdfs dfs -df -h / |
hdfs dfs -chgrp
| 更改文件的属组 | hdfs dfs -chgrp supergroup zxj |
hdfs dfs -chown -R zxj(拥有者):zzz(组) … | 更改文件的组和拥有者 | hdfs dfs -chown -R zxj(拥有者):zzz(组) … |
hdfs dfs -chmod -R 777
| 更改文件的权限 | hdfs dfs -chmod -R 777 /text |
.
2.9HDFS的搭建
hadoop集群环境搭建之伪分布式集群环境搭建
hadoop集群环境搭建之完全分布式集群环境搭建
hadoop集群环境搭建之高可用的完全分布式集群环境搭建
hadoop集群环境搭建之集群客户端的搭建