一、HDFS的体系结构
1、NameNode:主节点
- 职责:管理维护HDFS
维护了两个非常重要的文件: edits文件 -----> 记录操作日志(事务日志) fsimage文件 ----> HDFS的元信息(映像文件)
- HDFS操作日志:edits文件
位置:find . -name edits* 最新的操作日志:edits_inprogress**** 都是二进制 HDFS提供一个工具:edits viewer 日志查看器 ----> XML Demo: hdfs dfs -mkdir /mydemo hdfs oev -i edits_inprogress_0000000000000000106 -o ~/a.xml
-
HDFS的元信息:fsimage文件
就跟edits文件在一起 记录:数据块的位置、冗余信息 也是一个二进制 HDFS提供一个 image viewer ----> 文本或者xml hdfs oiv -i fsimage_0000000000000000005 -o ~/b.xml -p XML
问题:edits文件和fsimage文件,哪个文件提现了HDFS最新的状态? edits文件
2、DataNode:保存数据块
- 1.x 64M 2.x 128M
- 位置:find . -name blk*
- Demo:上传一个大于128M的文件 hdfs dfs -put hadoop-2.7.3.tar.gz /tools 查看数据块的文件
- 一般原则:数据块的冗余度一般跟数据节点个数一致,最大不要超过3 在生产环境下,至少两个数据节点
3、SecondaryNameNode:第二名称节点
- 作用:把edits中最新的状态信息合并到fsimage文件中,以减少namenode日志文件大小
- 合并过程: SecondaryNameNode从nameNOdef复制日志与映像文件,将日志合并到映像文件上,并将最新映像文件回传给namenode,这个过程发生在HDFS发出检查点的时候
- Web Console:http://192.168.157.111:50090
- 检查点:checkpoint
1默认每60分钟 fs.check.period 配置可修改时间
2当edits文件到达64M fs.check.size 配置修改大小
二、HDFS的操作
- 1、通过Web Console: 50070、50090
- 2、命令行
1 操作命令 hdfs dfs ***** -mkdir 创建目录 举例:hdfs dfs -mkdir /aaa hdfs dfs -mkdir -p /bbb/ccc -p 表示如果父目录不存在 先创建父目录 -ls 查看某个目录 -ls -R 查看某个目录,包含子目录 简写: -lsr -put 上传数据 hdfs dfs -put data.txt /input -copyFromLocal 上传数据 hdfs dfs -copyFromLocal data.txt /input -moveFromLocal 上传数据(相当于 ctrl+x 剪切) -copyToLocal 下载数据 -get 下载数据 -rm 删除目录 -rmr 删除目录(包含子目录) hdfs dfs -rmr /tools rmr: DEPRECATED: Please use 'rm -r' instead. 日志: 18/04/09 21:35:40 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted /tools ---> 成功删除(对比:回收站) -getmerge: 把某个目录下的文件先合并,再下载(提高效率) [root@bigdata111 temp]# vi student01.txt [root@bigdata111 temp]# vi student02.txt [root@bigdata111 temp]# hdfs dfs -mkdir /students [root@bigdata111 temp]# hdfs dfs -put student0*.txt /students [root@bigdata111 temp]# hdfs dfs -ls /students [root@bigdata111 temp]# hdfs dfs -getmerge /students ~/temp/allstudent.txt -cp: hdfs dfs -cp /input/data.txt /input/data2.txt -mv: hdfs dfs -cp /input/data.txt /students -count: hdfs dfs -count /students hdfs dfs -count /students 1 2 29 /students 目录个数, 文件个数, 文件总计大小 输入路径 -du 每个文件的大小 [root@bigdata111 temp]# hdfs dfs -du /students 19 /students/student01.txt 10 /students/student02.txt -text、-cat 查看文件的内容 hdfs dfs -cat /students/student01.txt balancer: 平衡操作 (2)管理命令 hdfs dfsadmin ***** -report: 输出HDFS的报告(Summary) -safemode: 安全模式 [root@bigdata111 temp]# hdfs dfsadmin -safemode Usage: hdfs dfsadmin [-safemode enter | leave | get | wait] [root@bigdata111 temp]# hdfs dfsadmin -safemode get Safe mode is OFF [root@bigdata111 temp]# hdfs dfsadmin -safemode enter Safe mode is ON [root@bigdata111 temp]# hdfs dfs -mkdir /aaaa mkdir: Cannot create directory /aaaa. Name node is in safe mode. [root@bigdata111 temp]# hdfs dfsadmin -safemode leave Safe mode is OFF
- 3、Java程序
/**
* 注意:1.需要配置hadoop环境变量
* 2.需要编译好的winutil包导入hadoop安装目录下的bin
* 类似代码设置System.setProperty("HADOOP_USER_NAME", "root");
*/
public class HdfsClientDemo01 {
public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
//1.加载配置
Configuration conf = new Configuration();
//2.设置副本数
conf.set("dfs.replication", "2");
//3.设置块大小
conf.set("dfs.blocksize", "64m");
//4.构造客户端
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.50.183:9000/"), conf, "root");
//5.hdfs数据下载到windows本地
fs.copyToLocalFile(new Path("/hdfs-site.xml"), new Path("c:/"));
//上传文件
//fs.copyFromLocalFile(new Path("c:/words.txt"), new Path("/words222111.txt"));
//6.关闭资源
fs.close();
}
}
public class HdfsIo {
Configuration conf = null;
FileSystem fs = null;
@Before
public void init() throws IOException, InterruptedException, URISyntaxException {
conf = new Configuration();
fs = FileSystem.get(new URI("hdfs://192.168.50.183:9000/"), conf, "root");
}
/*
* 文件上传HDFS
*
*/
@Test
public void putFileToHDFS() throws IllegalArgumentException, IOException {
//1.获取输入流
FileInputStream fis = new FileInputStream(new File("c:/2017级个人详细信息表.txt"));
//2.获取输出流
FSDataOutputStream fos = fs.create(new Path("/2017级个人详细信息表.txt"));
//3.流的拷贝
IOUtils.copyBytes(fis, fos, conf);
//4.关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
/*
* 文件下载HDFS
*/
@Test
public void getFileFromHDFS() throws IllegalArgumentException, IOException {
//1.获取输入流
FSDataInputStream fis = fs.open(new Path("/hunterhenshuai"));
//2.获取输出流
FileOutputStream fos = new FileOutputStream(new File("c:/hunterhenshuai"));
//3.流的对拷
IOUtils.copyBytes(fis, fos, conf);
//4.关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
}
三、HDFS上传下载原理解析
NameNode缓存元信息,默认:1000M
四、HDFS的高级功能
回收站
HDFS的回收站:默认禁用
参数配置: core-site.xml
单位:分钟
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
删除文件时日志对比:
没有回收站
18/04/09 21:35:40 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /tools ---> 成功删除(对比:回收站)
回收站
Moved: 'hdfs://bigdata111:9000/tools/a.zip' to trash at: hdfs://bigdata111:9000/user/root/.Trash/Current
HDFS回收站的本质:ctrl +x 移动到一个隐藏目录
查看回收站
hdfs dfs -lsr /user/root/.Trash/Current
从回收站中恢复
hdfs dfs -cp /user/root/.Trash/Current/tools/a.zip /tools
[-expunge] 清空回收站
快照:snapshot(是一种备份)
本质:cp命令 默认禁用
管理命令
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
操作命令
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
针对目录开启快照:hdfs dfsadmin -allowSnapshot /students
创建一个备份 :hdfs dfs -createSnapshot /students backup_student_0411_01
hdfs dfs -put student03.txt /students
hdfs dfs -createSnapshot /students backup_student_0411_02
对比快照 :hdfs snapshotDiff /students backup_student_0411_01 backup_student_0411_02
恢复快照: hdfs dfs -cp /input/.snapshot/backup_input_01/data.txt /input
配额(quota)
- 名称配额: 限制某个目录下,文件的个数
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
hdfs dfs -mkdir /folder1
hdfs dfsadmin -setQuota 3 /folder1
实际是:N-1
- 空间配额: 限制某个目录下,文件的大小
注意:如果hdfs文件系统中的文件个数或者大小超过了配额限制,会出现错误。
[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]
hdfs dfs -mkdir /folder2
设置空间配额:1M
hdfs dfsadmin -setSpaceQuota 1M /folder2
错误:
The DiskSpace quota of /folder2 is exceeded: quota = 1048576 B = 1 MB but diskspace consumed = 134217728 B = 128 MB
注意:设置的值一定不能小于128M
安全模式:safemode
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。如果HDFS处于安全模式,则表示HDFS是只读状态。
- 当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdfs-default.xml(dfs.namenode.threshold-pct)中定义了一个最小的副本的副本率0.999。我们的副本率0.6明显小于0.99,因此系统会自动的复制副本到其他的dataNode,使得副本率不小于0.999.如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多余的3个副本。
- 在命令行下是可以控制安全模式的进入、退出和查看的。
命令 hdfs dfsadmin -safemode get 查看安全模式状态
命令 hdfs dfsadmin -safemode enter 进入安全模式状态
命令 hdfs dfsadmin -safemode leave 离开安全模式
HDFS的集群
HDFS的HA