解决:管理多台机器上的文件系统。分布式文件管理系统
HDFS是其中的一种
定义:HDFS(Hadoop Distributed File System),文件系统,分布式
适用场景:适合一次写入、多次读出的场景,且不支持文件的修改。适合用于数据分析,不合适作为网盘。
优点
高容错性:自动保存多副本,且副本可增加
适合处理大数据:数据规模和文件规模巨大
可以构建在廉价机器上,通过多副本机制,提高可靠性
缺点
不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
无法高效的对大量小文件进行存储:会占用大量内存存目录和块信息。无论文件多大,在NameNode里都会占用一定内存
不支持并发写入、文件随机修改:仅支持数据追加
块的大小可以通过参数 dfs.blocksize 设置
在Hadoop2.X版本中,默认大小是128MB,老版本是64MB,本地运行是32MB
为什么块的大小不能设置太小,也不能设置太大?
HDFS块的大小设置主要取决于磁盘传输速率
理解概念
磁盘 内存
元数据放到内存中(为了访问快),磁盘中也要备份元数据(防止丢失),引入 fsimage
引入edits
,只进行追加(append)操作。保证元数据的更新
先写硬盘 再写内存 保证数据 用追加的方式
合并 fsimage
和 edits
,引入 SecondaryNameNode
2NN的作用:帮助NN对 edits 和 fsimage 进行合并
查看 fsimage
命令:
hdfs oiv
参数:
-p: 选择文件的处理器
-i: 输入的文件
-o: 输出的文件
例如:bin/hdfs oiv -p XML -i fsimage_xxx -o fsimage.xml
查看 edits
命令:
hdfs oev
参数:
-p: 选择文件的处理器
-i: 输入的文件
-o: 输出的文件
例如:bin/hdfs oev -p XML -i edits_xxx -o edits.xml
可以格式化后重启集群,跑一个案例
在 hdfs-default.xml
中修改
触发条件1:每隔一段时间
通常情况下,2NN是每隔一个小时执行一次,3600秒
,默认值是3600
edits已满
每隔1分钟检查一次
默认值是操作数达到一百万,2NN执行一次
代码
1. kill -9 进程号
## 用jps 看进程号
2. rm -rf /$HADOOP_HOME/data/tmp/dfs/name
3. scp -r root@hadoop3:/opt/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./
## 这里的目录和虚拟机名字不唯一,根据自己的来
4. /sbin/hadoop-daemon.sh start namenode
-importCheckpoint
选项启动 NN 的守护进程,从而完成拷贝kill -9 NameNode PID
in_use.lock
文件(平级路径是方法一中的路径)在安全模式中,只读不可写
集群启动完成后,会自动退出安全模式
安全模式退出条件
满足最小副本条件 99.9%的块满足最小副本级别(默认值是1)
刚格式化的集群没有任何块,所以NN不会进入安全模式
基本语法
bin/hdfs dfsadmin -safemode get
bin/hdfs dfsadmin -safemode get enter
bin/hdfs dfsadmin -safemode get leave
bin/hdfs dfsadmin -safemode get wait
增加数据可靠性,相当于在本地建了一个2NN
HA后会讲,ZooKeper会讲
在 hdfs-site.xml
文件中增加以下代码
<property>
<name>dfs.namenode.name.dirname>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2value>
property>
然后停止集群,删除每个集群的data 和 Logs 中所有文件
格式化集群并启动
奇偶校验
CRC校验
有 md5sum 校验
sha256sum 校验 更复杂
一般时间为 10分钟 + 30秒
计算公式
Timeout= 2 * dfs.namenode.heartbeat.recheck-interval + 10*dfs.heart beat.interval
默认的Timeout= 2 * dfs.namenode.heartbeat.recheck-interval
是5分钟
dfs.heart beat.interval
默认是3s
可以去 dfs.namenode.heartbeat
文件里更矮
注意心跳的单位是毫秒
解决数据存储容量不足问题
限制节点加入的方法
添加到白名单的节点,允许访问NameNode
不在白名单的节点,都会被退出
<property>
<name>dfs.hostsname>
<value>/opt/hadoop-2.7.2/etc/hadoop/dfs.hostsvalue>
property>
xsync hdfs-site.xml
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
如果数据不平衡,用该命令实现集群再平衡
sbin/start-balancr.sh
黑名单上的主机会被强制退出
<property>
<name>dfs.hosts.excludename>
<value>/opt/hadoop-2.7.2/etc/hadoop/dfs.hosts.excludevalue>
property>
hdfs dfsadmin -refeshNodes
hdfs dfsadmin -refeshNodes
注意:不允许⽩名单和⿊名单同时出现同⼀个主机名称.
每个目录存储的数据不一样,即:数据不是副本
注意和 NamaNode 区别开
<property>
<name>dfs.datanode.data.dirname>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2value>
property>
服务器之间
用scp命令 实现 推 拉 本地主机中转实现两个远程主机文件复制
集群间
用distcp 命令实现两个Hadoop集群之间的递归数据复制
例如
bin/hadoop distcp hdfs://hadoop1:9000/user/root/hello.txt hdfs://hadoop2:9000/user/root/hello.txt
因为每个文件都是按块存储
大量的小文件会耗尽NameNode中大部分内存
存储小文件需要的磁盘容量和数据快大小无关
例如:1MB的文件设置128MB的块存储,实际用的是1MB磁盘空间而不是128MB
解决方法之一:HDFS存档文件或HAR文件
它将文件存入HDFS块,减少NameNode内存使用的同时,允许对文件进行透明的访问
具体就说:存档的文件对内是一个个独立的文件,对NameNode是一个整体,从而减少了NameNode的内存
步骤
sbin/start-yarn.sh
bin/hadoop archive -archiveName input.har -p /user/root/input /user/root/output
hadoop fs -ls -R har:///user/root/output/input.har
har://
hadoop fs -cp har:///user/root/output/input.har/* /usr/root
如题,在不超时的的情况下可以恢复数据
防止误删,可备份
默认关闭
大数据只考虑存储
说明
步骤
core-site.xml
中增加以下代码<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
core-site.xml
中增加以下代码<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
/user/root/.Trash/
中看hadoop fs -mv /user/root/.Trash/Current/user/ root/input /user/root/input
hadoop fs -expunge
注意:通过API程序删除的⽂件不会经过回收站,需要调⽤moveToTrash()才会进⼊回收站
Trash trash = New Trash(conf);
trash.moveToTrash(path);
相当于对目录做一个备份
不会立即复制所有文件,而是指向同一个文件
当写入发生时,才会产生新文件
记录的是一个差异,根据差异恢复
实际中用的不是特别多
1. 开启指定⽬录的快照:
hdfs dfsadmin -allowSnapshot 路径
2. 禁⽤指定⽬录的快照,默认是禁⽤
hdfs dfsadmin -disallowSnapshot 路径
3. 对⽬录创建快照(当前时间)
hdfs dfs -createSnapshot 路径
4. 以指定名称创建快照
hdfs dfs -createSnapshot 路径 名称
5. 重命名快照
hdfs dfs -renameSnapshot 路径 旧名称 新名称
6. 列出当前⽤户所有可快照⽬录
hdfs lsSnapshotableDir
7. ⽐较两个快照⽬录不同之处(重要)
hdfs snapshotDiff 路径1 路径2
8.删除快照
hdfs dfs -deleteSnapshot 路径 名称
8. 快照恢复
hdfs dfs -cp 源路径 目的路径
在HDFS的写数据过程中,NameNode 会选择距离最近的DataNode 接收数据
节点距离:两个节点到达最近共同祖先的距离总和
cd -
进入
cd $_
进入刚创建的文件夹
进程号 ps
https://hadoop.apache.org/docs/current/api/