HDFS(Hadoop Distributed File System),是一个文件系统,用于存储文件,通过目录树来定位文件,其实,它是分布式的,联合多台服务器实现功能。HDFS容错性高,适合处理大数据。
使用场景:
- 适合一次写入,多次读出的场景;
- 不支持文件的修改;
- 适合于用来做数据分析,不适合用过来做网盘。
缺点:
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储;
2.1 大量小文件会占用NameNode大量的内存来存储文件目录和块信息。
2.2 小文件存储的寻址时间会超过读取时间。 - 不支持并发写入、文件随机修改;
3.1 一个文件只能有一个写,不允许多线程同时写。
3.2 仅支持数据追加,不支持文件的随机修改。
HDFS组成架构
HDFS文件块大小
HDFS的文件在物理上是分块(block)存储的,块的大小可以通过配置参数(dfs.blocksize
)来规定,在Hadoop2.x版本中默认是128M,老版本是64M。
块的大小与磁盘的传输速率有关系:
- 在集群的block中,寻址时间为10ms
- 当寻址时间为传输时间的1%时,为最佳状态。
- 目前磁盘的传输速度普遍为100MB/s,因此block的大小为:
HDFS的Shell操作
-
hadoop fs -help rm
:查看rm命令的帮助信息 -
hadoop fs -ls /
:显示目录信息 -
hadoop fs -mkdir -p /user/input
:在HDFS上创建目录 -
hadoop fs -moveFromLocal ./demo.txt /user/input/
:将本地的demo.txt文件剪切粘贴到HDFS -
hadoop fs -copyFromLocal ./demo.txt /user/input/
:将本地的demo.txt文件拷贝到HDFS
-put
命令与-copyFromLocal
功能相同
-
hadoop fs -copyToLocal /user/input/demo.txt ./
:将HDFS上的demo.txt拷贝到本地
-get
命令与-copyToLocal
功能相同
-
hadoop fs -appendToFile ./append.txt /user/input/demo.txt
:将本地的append.txt中的内容追加到已经存在的文件demo.txt的末尾 -
hadoop fs -getmerge /user/input/* ./zaiyiqi.txt
:将HDFS上/user/input/
目录下的所有文件合并下载到本地,并将结果保存在zaiyiqi.txt
中。 -
hadoop fs -du -h /user/
:统计文件夹的大小
hadoop fs -du -h -s /
:根目录下所有文件夹大小的总和
-
hadoop fs -setrep 2 /demo.txt
:设置demo.txt的副本数为2
当副本数大于数据节点的个数时,数据的实际副本数仍然为节点数,只有当新增节点时,才会生成新的副本,直到增加的节点数与数据的副本数相同时停止。
HDFS写数据流程
1.节点距离计算
两个节点到达最近的公共祖先的距离总和。
2.Hadoop2.7.2副本节点选择
HDFS读数据流程
NameNode和SecondaryNameNode
1. NN和2NN的工作机制
所有的元数据存储在NN的内存中,同时在NN的本地磁盘会备份一个FsImage,以保证断电时数据不会丢失。但是这样每次元数据更新时同时更新FsImage时效率很低,此时,增加一个Edits文件,每当元数据有变化就将变动追加到Edits中,这样断电后就可以通过FsImag和Edits合并生成元数据。但是如果Edits的文件很大时,恢复一次元数据的效率非常低,应该定期进行FsImage和Edits的合并,而这个工作是由2NN完成的。
2. FsImage和Edits解析
2.1. 将Fsimage格式化成可查阅的文件
hdfs oiv -p XML -i fsimage_000*** -o fsimage.xml
2.2. 将Edits格式化成可查阅的文件
hdfs oev -p XML -i edits_000*** -o edits.xml
3. CheckPoint时间设置
3.1. 通常情况下,SecondaryNameNode每隔一小时执行一次
hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
3.2, 一分钟检查一次操作数,当操作数达到一百万时,SecondaryNameNode执行一次
hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
</property>
<property>
<name>dfs.namenode.checkpoint.check_period</name>
<value>60</value>
</property>
4.NameNode故障处理
4.1 将SecondaryNameNode中的数据拷贝到NameNode存储数据的目录,
步骤如下:
I. kill -9 NameNode进程
II. 删除NameNode存储的数据
rm -rf /opt/module/hadoop_2.x.x/data/tmp/dfs/name/*
III. 拷贝SecondaryNameNode中的数据到原NameNode存储数据的目录
scp -r secondaryNameNode:/opt/modeul/hadoop_2.x.x/data/tmp/dfs/namesecondary/* ./data/tmp/ds/name/
IV. 重新启动NameNode
4.2 使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中的数据拷贝到NameNode中
步骤如下:
I. 修改hdfs-site.xml文件
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</vaue>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop-2.x.x/data/tmp/dfs/name</value>
</property>
II. kill -9 NameNode进程
III. 删除NameNode存储的数据
IV. 如果2NN和NN没有在一个主机节点上,需要将2NN存储数据的目录拷贝到NN存储数据的平级目录(也就是和/name处于同一目录下),并删除in_ust.lock文件
V. 导入检查点数据
bin/hdfs namenode -importCheckpoint
VI. 启动NameNode
bin/hadoop_daemon.sh start namenode
5. 集群的安全模式
DataNode工作机制
1. DataNode掉线时限参数设置
hdfs-site.xml中的参数
heartbest.recheck.interval
和dfs.heatbeat.interval
,二者单位均为毫秒
2. 服役新节点
直接从已有的datanode上克隆一个主机,然后删除/data和/logs文件,启动服务器,即可加入新节点
但是这样做很危险,容易被人加入一台主机,偷走数据
3. 添加白名单
可以在NameNode主机上添加白名单,允许在白名单上的主机节点访问NameNode。具体配置如下:
I. 在NameNode的hadoop_2.x.x/etc/hadoop/
目录下创建dfs.hosts文件,再文件里添加主机名
34.56.73.166
...
II. 在hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>hadoop_2.x.x/etc/hadoop/dfs.hosts</value>
</property>
III. 刷新NameNode,更新ResourceManager节点
hdfs dfsadmin -refreshNodes
yarn rmadmin refreshNodes
4. 黑名单退役
在黑名单上的主机都会被强制退出。具体配置如下:
I. 在NameNode的hadoop_2.x.x/etc/hadoop/
目录下创建dfs.hosts.exclude文件,加入要退役的节点
II. 在NameNode的hdfs-stie.xml配置文件中添加dfs.hosts.exclude属性
<property>
<name>dfs.hosts.exclude</name>
<value>hadoop_2.x.x/etc/hadoop/dfs.hosts.exclude</value>
</property>
III. 刷新NameNode和ResourceManger。
IV. 在退役节点上进行单节点退出
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop nodemanager
HDFS 2.x新特性
1. 小文件存档
2. 回收站
将删除的文件在不超时的情况下,恢复元数据,防止误删除、备份等作用。默认是关闭的。
启用回收站,在NN的core-site.xml中:
<property>
<name>fs.trash.interval</name>
<value>1</value> # 一分钟
</property>
修改访问垃圾回收站的用户名称,在NN的core-site.xml中:
<property>
<name>hadoop.http.staticuser.user</name>
<value>user_name</value>
</property>