HDFS:Hadoop内分布式存储组件,可以构建分布式文件系统用于数据存储
基础架构:
-
NameNode:主角色,独立进程,负责管理;
-
DateNode:从角色,独立进程,负责数据的存储;
-
SecondaryNameNode:辅助角色,协助NameNode整理元数据;
-
start-dfs.sh执行原理(stop-dfs.sh类似)
- 首先启动SecondaryNameNode辅助节点;
- 读取core-site.xml内容找到dfs.defaultFS,确定NameNode 所在服务器,启动NameNode;
- 读取workers,确定DataNode服务器,启动DataNode;
-
某一个服务器的启停:hadoop-daemon.sh (start | status | stop) (namenode | …) 或者 hdfs --dameon (start | status | stop) (namenode | …)
HDFS的Shell操作
-
结构与Linux文件类似
-
协议头:hdfs://namenode:port/
-
基本命令:
#hadoop fs [可选项] hdfs dfs [可选项] 类似 #1、创建文件夹 hdfs dfs -mkdir [-p] <path> #2、查看文件 hdfs dfs -ls [-h(显示文件大小)] [-R(全部显示)] [<path> ...] #3、上传文件到hdfs hdfs dfs -put [-f(覆盖文件)] [-p(保留权限)] <localsrc> ... <dst> hdfs dfs -put file:///etc/profile hdfs://node1:8020/itcast #4、查看文件 hdfs dfs -cat <src> hdfs dfs -cat <src> | more #5、下载文件 hdfs dfs -get [-f] [-p] <src> ... <localdst> #6、复制 hdfs dfs -cp [-f] <src> ... <dst> #7、追加 或 删除文件,不能修改 hdfs dfs -appendToFile <localdst> ... <dst> #8、移动 hdfs dfs -mv <src> ... <dst> #9、删除文件或文件夹 hdfs dfs -rm -r [-skipTrash] URI [UrI ...]
开启回收站
<!--core-site.xml:不需要重启集群,在当前机器执行-->
<!--保留时间-->
<!--检查时间间隔-->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value>
</property>
HDFS存储原理
-
基本单位:block块,默认为256MB (有利于统一管理)
-
副本机制:node1中的数据的副本放在其他节点(replication 表示一共有几份)
-
HDFS副本块数配置:hdfs-site.xml
<property> <name>dfs.replication</name> <value>3</value> </property>
#上传文件时临时生效 hdfs dfs -D dfs.replication=2 -put test.txt /temp/ #重新设置副本块 hdfs dfs -setrep [-R] 2 <path> #查看副本数 hdfs fsck <path> [-files [-blocks [-locations]]] #-files 列出路径内文件是否正常 #-files -blocks 输出文件块报告(块数和副本数) #-files -blocks -locations 输出每一个block的详情
-
block配置:hdfs-site.xml
<property> <name>dfs.blocksize</name> <value>268435356</value> </property>
-
NameNode元数据管理和维护
- edits文件:流水账文件,记录hdfs的每一个操作,及其一些细节;
- edits定期合并:记录一个文件的最终状态(压缩),通过合并得到FSImage文件;
- 若没有FSImage文件,则合并edits文件。若两种文件都存在,则合并两类文件;
- 合并的控制参数:dfs.namenode.checkpoint.period,默认一小时;dfs.namenode.checkpoint.txns,默认100万次事务;满足其中一个即可。定期检查条件是否满足参数 dfs.namenode.checkpoint.check.period,默认为60秒。
- 由SecondaryNameNode来执行合并;
-
数据写入流程:
- 客户端向NameNode发送写入请求;
- NameNode审核权限和其他条件,告知客户端写入DataNode的地址;
- 客户端向指定的地址节点发送数据包;
- 被写入数据的DataNode同时完成副本的复制工作,将其接受的数据发给其他节点;
- 写入完成后,告知NameNode,记录;
-
数据读取流程:
- 客户端向NameNode申请读取某文件;
- NameNode审核后,返回此文件的block列表(找到距离最近的一份);
- 客户端读取;