1.高容错性:数据可字宗保存多个副本,通过增加副本的形式,提高容错性。 2.适合处理大数据:数据规模可达到GB,TB甚至是PB级的大数据。文件规模可达到百万。 3.可构建在廉价机器上:通过多副本机制,提高可靠性。2.缺点
1.不适合低延时数据的访问:毫秒级的存储数据时难以实现的。 2.无法高效对大量小文件进行存储。小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标。同时数据块占用大量内存,而NameNode内存有限。 3.不支持并发写入,文件随即修改。一个人间只能读,不允许多线程同时写,仅支持数据追加操作。HDFS组成架构 NameNode
1.管理HDFS命名空间 2.配置副本策略 3.管理数据块信息 4.处理客户端读写请求secondaryNameNode
1.辅助NameNode定期合并Fsimage和Edits文件,并推送至NameNodeDataNode
1.存储十几的数据块 2.执行读写操作 3.向NameNode定期发送心跳HDFS的文件块大小
1.hadoop1.x版本中,一个block的大小为64M 2.hadoop2.x/hadoop3.x版本中,一个block的大小为128M文件块大小可调,但如果文件块太小,则会增加寻址时间,减慢HDFS读写速度;若文件快太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需时间,同样会减慢HDFS读写速度。 HDFS Shell操作 常用命令列表
1.hdfs dfs -ls / 2.hdfs dfs -mkdir [hdfsPath] 3.hdfs dfs -put [localPath] [hdfsPath] 4.hdfs dfs -moveFromLocal [localPath] [hdfsPath] 5.hdfs dfs -coprFromLocal [localPath] [hdfsPath] 6.hdfs dfs -appendToFile [localPath] [hdfsPath] 7.hdfs dfs -cat [hdfsPath] 8.hdfs dfs -chmod/-chown/-chgrp [hdfsPath] // 修改文件所属权限 9.hdfs dfs -mv [oldHdfsPath] [newHdfsPath] 10.hdfs dfs -cp [oldHdfsPath] [newHdfsPath] 11.hdfs dfs -tail [hdfsPath] // 显示文件末尾1kb数据 12.hdfs dfs -rm -r [hdfsPath] 13.hdfs dfs -du [hdfsPath] // 统计文件夹大小信息HDFS 的 API操作 ★注意加载windows依赖,否则无法本地运行 创建文件夹
@Test
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
// 创建一个文件夹操作
fs.mkdirs(new Path("/xiyou/huaguoshan"));
}
HDFS上传操作
@Test
public void testPut() throws IOException {
fs.copyFromLocalFile(false, true, new Path("E:/sunwukong.txt"), new Path("/xiyou/huaguoshan/"));
// del src:删除源数据 override:是否允许覆盖 Path src:源路径 Path dst:目标路径
}
HDFS下载操作
@Test
public void testOut() throws IOException {
fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou"), new Path("D:/"), false);
}
删除目录
@Test
public void testRmdir() throws IOException {
// 删除非空目录
fs.delete(new Path("hdfs://hadoop102/xiyou"), true); // 当第二个参数为false时,代表不进行递归删除,不能删除非空目录.
}
移动HDFS文件
@Test
public void testRemove() throws IOException {
// 修改文件名
// fs.rename(new Path("hdfs://hadoop102/sanguo"),new Path("hdfs://hadoop102/SanGuo"));
// 移动文件并更改文件名
fs.rename(new Path("hdfs://hadoop102/input/word.txt"), new Path("hdfs://hadoop102/cls.txt"));
}
获取文件详情信息
@Test
public void testFileDetails() throws IOException {
RemoteIterator listFiles = fs.listFiles(new Path("hdfs://hadoop102/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("==========" + fileStatus.getPath().getName() + "==========");
// 读取文件权限
System.out.println(fileStatus.getPermission());
// 读取使用者
System.out.println(fileStatus.getOwner());
// 读取用户组
System.out.println(fileStatus.getGroup());
// 读取内存大小
System.out.println(fileStatus.getLen());
// 读取最后的修改时间
System.out.println(fileStatus.getModificationTime());
// 读取副本数量
System.out.println(fileStatus.getReplication());
// 读取块大小
System.out.println(fileStatus.getBlockSize());
// 读取文件名
System.out.println(fileStatus.getPath().getName());
// 读取副本位置
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
}
判断文件形式
@Test
public void testFileType() throws IOException {
// 判断是目录还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("hdfs://hadoop102/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("文件:" + status.getPath().getName());
} else {
System.out.println("目录:" + status.getPath().getName());
}
}
}
HDFS读写流程
HDFS写数据流程
1.Client发起写数据请求,向NameNode发送上传请求 2.NameNode接收客户端请求并检查目标文件路径是否正确,回应Client 3.Client请求第一个block的存储位置 4.NameNode返回可存储的DataNode节点 5.Client请求DataNode上传数据信息,建立DataNode的通信管道 6.DataNode逐一应答客户端 7.客户端用过管道,逐一上传 8.数据传输完成机架感知 HDFS副本选择
1.第一个副本在Client所处节点上。 2.第二个副本在另一台机架的随机节点,增加安全性。 3.第三个读本在第二个副本机架的另一个随机节点,增加效率。 4.之后的副本随机分配在可用机架上,增加高容错。HDFS读数据流程
1.客户端向NameNode发送下载请求 2.NameNode检查元数据信息,DataNode地址,返回给哭护短 3.客户端根据源数据信息,向对应的DataNode发送读数据请求 4.DataNode传输数据至ClientNameNode和SecondaryNameNode工作机制 NameNode工作机制
1.NameNode格式化之后,创建FsImage和Edits文件,启动后,加载日志和镜像文件至内存中 2.客户端对元数据进行增删改操作 3.NameNode记录操作日志,Edits滚动日志 4.SecondaryNameNode定期拷贝Fsimage和Edits文件 5.合并Fsimage和Edits文件至内存中 6.生成新的Fsimage文件 7.当下一次NameNode开启后或者定期拷贝到NameNode 8.修改文件名为FsImage,完成数据的合并oiv和oev oiv查看fsimage镜像文件
hdfs oiv -p 文件类型(XML)-i 镜像文件 -o 转换后的文件路径oev查看Edits文件
hdfs oev -p 文件类型 -i 编辑日志-o 转换后的文件路径DataNode工作机制
1.一个数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件,一个时数据本身,一个时源数据的数据块长度,校验和,以及时间戳 2.DataNode启动后定期向NameNode上报所有块信息,默认6个小时心跳默认三秒一次,向NameNode上报信息 超时时长计算公式
TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval(单位:ms) + 10 * dfs.heartbeat.interval(单位:s)
默认为10分钟+十次心跳



