HDFS
HDFS:分布式文件存储
1.HDFS架构
- client:
文件切分。文件上传的时候,client将文件切分成一个个的block,然后进行存储;
与NameNode交互,获取文件的位置信息;
与DataNode交互,读取或者写入数据;
提供命令俩管理和访问HDFS,比如启动或者关闭 - NameNode:
管理HDFS的名称空间;
管理数据块(block)的映射信息;
配置副本策略;
处理客户端读取请求; - DataNode:
存储实际的数据,存在datanode的磁盘上;
执行数据块的读写;
周期性的向NameNode汇报心跳信息 - SecondryNameNode:
辅助NameNode,但是不可顶替;
合并fsimage和edits,负责数据管理备份
2.HDFS副本机制:
- block:数据库
HDFS最基本的存储单元
默认大小:128M(2.x) - 作用:避免数据丢失
- 默认数:3
- 存放机制:
一个在本地机架节点,一个在同一机架不同节点,一个在不同机架的节点
3.HDFS命令
-ls :列出目录下的所有文件 -R 递归显示
-mkdir :创建目录 -p 递归创建
-moveFromLocal :从本地上传到hdfs(剪切) -moveFromLocal localpath tarpath
-moveToLocal :移动到本地(剪切)
-put :本地上传到hdfs(复制) -put localsrc tarsrc
-get :从hdfs移动到本地(复制) -get tarsrc localsrc
-mv :在hdfs系统上移动文件,不可与local互相移动(剪切)
-rm :删除,默认放在回收站 -r 递归删除
-cp :在hdfs上实现复制 -f 进行覆盖 -p 深度拷贝
-cat :查看文件
-chmod :修改权限 -R 修改整个目录的权限
-chown :修改所属用户和用户组 -R 修改整个目录的用户和用户组
-appendToFile :追加文件 -appendToFile localsrc tarsrc
hdfs dfs -count -q -h dir 查看dir的限额配置
hdfs dfsadmin -setQuota num dir 给dir设置数额限制为num(dir本身也算一个)
hdfs dfsadmin -clrQuota num dir 清除数量限额
hdfs dfsadmin -setSpaceQuota size dir 给dir设置大小限制为size,最小为block*3=384M
hdfs dfsadmin -clrSpaceQuota dir 清除数量大小
hdfs dfsadmin -safemod get 查看安全模式
hdfs dfsadmin -safemod enter 查看安全模式
hdfs dfsadmin -safemod leave 查看安全模式
4.Java实现HDFS文件的读取
- 新建maven的project → 设置maven地址:file - setting - Build,… - maven
导包:导入需要的Hadoop包 - 新建Class:src - java - package - Class
- 创建文件夹
//1.创建配置文件(hadoop.conf)
Configuration conf = new Configuration();
//2.获取文件系统(hadoop.fs)
Filesystem fs = Filesystem.get(new URL("hdfs://hadoop100:9000"),conf,user,"root")
//3.调用API操作
fs.mkdir(new Path("")
//4.关闭资源
fs.close()
上传文件: 1 2 4 不变,只需要改变3
fs.copyFromLocalFile(new Path("local path"),new Path("hdfs path"))
5.HDFS写文件过程
- client分块:128M为一个block,最后剩余的不够128M的为一个block
- client请求上传第一个数据块
- nodename检测上传权限与目标路径是否存在
- namenode返回一个datanode列表(DN1,DN2,DN3)给client
- client与就近的DN之间建立pipeline连接,三个DN之间也建立pipeline连接
- client向就近的DN传递数据,传递的单位为packet,大小为64kb;数据会传递到DN1的内存中进行缓存,然后落在磁盘中,同时也往下一个DN中传递
- 第三个DN传递成功后往前依次响应写入成功
- 第二个block重复以上的动作
6.HDFS读文件
- client向namenode请求下载文件
- 权限检查,文件block列表检查,根据就近原则选出每一个block对应的主机列表
- namenode返回block对应的主机列表给client
- client和每一个block对应的主机建立pipeline
- client开始数据的读取,读取的单位是packet(64kb),每条pipeline可以并行读取
- client将读取的block合并为一个完整的文件
7.HDFS的元数据管理
- fsimage:
元数据的镜像,存放的是比较完整的元数据信息,一般不一定是最新的数据 - edits:
最近一段时间的操作日志,有最新的元数据的信息 - secondarynamenode:
- secondarynamenode将fsimage、edits复制过来。(触发条件:默认1h,或者64M;参数可以在core-site.xml中修改)
- 将fsimage和edits合并,产生新的fsimage,清空edits
- 用新的fsimage替换掉旧的fsimage实现更新
8.HDFS的高可用机制
- 原理
在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每个HDFS集群只有一个namenode,一旦这个节点不可用,则整个HDFS集群将处于不可用状态。
HDFS高可用(HA)方案就是为了解决上述问题而产生的,在HA HDFS集群中会同时运行两个Namenode,一个作为活动的Namenode(Active),一个作为备份的Namenode(Standby)。备份的Namenode的命名空间与活动的Namenode是实时同步的,所以当活动的Namenode发生故障而停止服务时,备份Namenode可以立即切换为活动状态,而不影响HDFS集群服务。