分布式文件系统:HDFS

1、分布式文件系统:HDFS

技术上,核心问题是:
(1)数据的存储:分布式的文件系统(∞)
(2)数据的计算:分布式计算(MapReduce,Spark RDD等)
补充:生活中,用的最多的分布式文件系统是网盘

Hadoop 3.x:HDFS纠删码的技术,能够节约一半的存储空间

2、最重要的是学习原理和体系架构

(一)分布式文件系统的基本原理

(1)硬盘不够大(多几个硬盘)

(2)硬盘不够安全(借助google思想,采用数据的冗余,没有硬盘,存到内存里,采用数据冗余,同一份数据多存几遍。。。HDFS默认的数据块冗余度:3)

具体结构:

客户端只有数据
服务器端(分布式文件系统,由多个硬盘(DataNode数据节点)组成):需要有一个管理员(NameNode,名称节点)->不负责存储,只需要管理这些硬盘的状态。
分布式文件系统:HDFS_第1张图片
数据块:1.x64M
2.x 128M
从客户端的数据传到硬盘之后,(假设数据块是128M)如果三份都是这样从客户端到硬盘,则需要传送3*128M,效率奇低,所以,第一份传到硬盘之后,可以通过数据块的水平复制,把第一份数据块复制两份给另外两个硬盘,这样很快。

3、HDFS的体系架构

1、NameNode:HDFS的管理员(主节点)
职责:接收客户端的请求,管理和维护HDFS

2、SecondaryNameNode:第二名称节点是做什么的?
职责:合并NameNode中的edit logs到fsimage中
edit logs:操作日志
fsimage:元信息文件

3、DataNode:按数据块保存数据
职责:按数据块保存数据(默认值为128M)

4、Hadoop的安装模式:3种
(1)本地模式:一台机器
(2)伪分布模式:一台机器
(3)全分布模式:至少3台

4、分析

1、伪分布模式的特点
(1)只需要一台机器,在单机上模拟一个分布式的环境
(2)具备HDFS的所有功能
(3)NameNode、SecondaryNameNode、DataNode运行在同一个机器中

2、操作HDFS:三种不同的方式
(1)命令行
(2)Web Console
(3)Java API

5、HDFS的启动过程

1、加载元信息文件fsimage
2、加载日志
3、设置检查点
4、进入安全模式

补充:什么是安全模式?
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性,如果HDFS处于安全模式,则表示HDFS是只读状态

当集群启动的时候,会首先进入安全模式。当系统处于安全模式时,会检查数据块的完整性。假设设置的副本数(即参数dfs.reolication)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdfs-default.xml中定义一个最小的副本的副本率为0.999.

6、JAVA API例子

1、创建目录(有截图代码)0401
2、把数据上传到HDFS(有截图代码)
(1)创建一个输入代表上传的文件InputStream
(2)创建一个指向HDFS的输出流OutputStream到0401的目录上
(3)利用工具被实现上传,从输入流写到输出流(IOUtils.copyBytes)

7、快速复习

(一)专门解决一个海量大数据存储的一个分布式文件系统
1、Hadoop集群的搭建
2、HDFS集群的初步认识
3、HDFS的核心设计
4、HDFS的shell操作
5、HDFS的java api的使用

(二)底层的具体实现思路:
HDFS集群的核心功能:
1、上传(写)
2、下载

API的底层实现其实就是通过字节流来实现的

namenode是管理datanode的一个节点
namenode管理datanode主动的形式
namenode被动的管理:所有的datanode都是自发的去联系namenode

8、副本存放策略

并不是规定死的,并不是一定按照某个策略走
倚靠:一定是选取不满不忙的机器
三个副本块的节点选取都要遵循这个倚靠

上传流程
1、客户端发起请求
客户端怎么知道请求发给哪个节点的哪个进程?
因为客户端会提供一些工具来解析出你所制定的HDFS集群的主节点是谁,以及端口号等信息(URL)
当前请求会包含一个非常重要的信息:上传的数据的总大小

2、namenode会响应客户端的这个请求
namenode的职责:
(1)管理元数据(抽象目录树结构)
用户上传的那个文件要存储的目录不存在的话,如果不存在不会创建

(2)响应请求
真正的操作:做一系列校验
1)校验客户端的请求是否合理
2)校验客户端是否有权限进行上传

3、如果namenode返回给客户端的结果是通过,那就是允许上传

就会给客户端返回对应的所有的数据块的多个副本的存放节点列表

file1_blk1 hadoop02 hadoop03 hadoop04
file1_blk2 hadoop03 hadoop04 hadoop05

4、客户端在获取到了namenode返回回来的所有数据块的多个副本的存放地的数据之后,就可以按照顺序逐一进行数据块的上传操作

5、对要上传的数据进行逻辑切片
物理切片 1和2
逻辑切片1

切片分成两个阶段:
1)规划怎么切
2)真正的切

file1_blk1:file1:0:128
file1_blk2:file:128:256

6、开始上传第一个数据块

7、客户端会做一系列准备操作:
1)依次发送请求去连接对应的datanode

管道(pipline):clinet-node1-node2-node3
按照一个个数据包的形式进行发送的
每次传输完一个数据包,每个副本节点都会进行校验,

2)在客户端会启动一个服务:
用户就是用来等到将来要在这个pipline数据管道上进行传输的数据包的校验信息
客户端就能知道当前从client到写node1,2,3三个节点上去的数据是否都写入正确和成功

8、client会正式的把这个块中的所有packet都写入到对应的副本节点
9、client进行校验,如果校验通过,表示该数据块写入成功
10、重复7,8,9三个操作,来继续上传其他的数据块
11、客户端在意识到所有的数据块都写入成功之后,会给namenode发送一个反馈,就是告诉namenode当前客户端上传的数据已经成功。

你可能感兴趣的:(#,杂乱无章)