HDFS分布式文件系统
- 参考
- 学习目标
- 第三课时
- 知识点1-HDFS的Java API介绍
- 知识点2-案例-使用Java API操作HDFS
- 第四课时
- 知识点1-Federation机制的实现原理
- 知识点2-Federation机制的特点
- 知识点3-Federation机制的实现
- 知识点4-Erasure Coding
参考
maven的setting.xml配置文件详解
http://tch.ityxb.com
学习目标
使学生了解文件系统的分类,能够描述不同文件系统的特点
使学生熟悉HDFS架构,能够描述HDFS架构的主要组件及其作用
使学生了解HDFS的特点,能够简述HDFS的特点
使学生掌握HDFS的文件读写原理,能够叙述HDFS读写文件的流程
使学生熟悉HDFS的健壮性,能够叙述HDFS心跳机制、副本机制和负载均衡等策略
使学生掌握HDFS的Shell操作,能够灵活运用HDFS Shell命令操作HDFS
使学生掌握HDFS的Java API操作,能够灵活使用Java API编写应用程序操作HDFS
使学生熟悉Federation机制,能够描述Federation机制的结构、特点并实现Federation机制。
使学生了解Erasure Coding,能够简述Erasure Coding节省存储空间的原理
第三课时
除了通过HDFS Shell操作HDFS之外,还可以通过HDFS提供的Java API操作HDFS,其核心是使用HDFS提供的Java API构造一个访问的对象
知识点1-HDFS的Java API介绍
在HDFS Java API中,常用的一个核心包为
org.apache.hadoop.fs
该包提供了常用的FileSystem、FileStatus、FSDataInputStream、FSDataOutputStream和Path类。
FileSystem类:用于介绍为对文件进行一系列操作。
FileStatus类:该类用于向客户端展示HDFS中文件和目录的元数据,包括文件大小、Block大小、副本信息和修改时间等。
FSDataInputStream类:表示HDFS输入流,用于实现HDFS写入文件的操作。
FSDataOutputStream类:表示HDFS输出流,用于实现HDFS读取文件的操作。
Path类:表示HDFS中的一个目录或一个文件路径。
HDFS中对文件的一系列操作,通常使用org.apache.hadoop.fs包下的FileSystem类实现。HDFS的Java API中FileSystem类的常用方法。
① copyFromLocalFile(Path src,Path dst)
② copyToLocalFile(boolean delSrc, Path src, Path dst)
③ mkdirs(Path f)
④ rename(Path src, Path dst)
⑤ delete(Path f,boolean recursive)
知识点2-案例-使用Java API操作HDFS
通过IntelliJ IDEA开发工具编写Java应用程序演示使用Java API操作HDFS,操作步骤如下。
(1)配置案例环境
(2)添加Maven库依赖
(3)获取客户端对象
(4)上传文件到HDFS
(5)从HDFS下载文件
(6)目录操作
(7)查看目录中的文件信息
(8)在Windows配置Hadoop运行环境
(9)运行Java应用程序
(10)查看HDFS下载到本地文件系统的文件
(11)查看HDFS的目录
打开IDEA,选择Maven,设置settings.xml文件
在pom.xml中添加Maven依赖
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.3.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency>
创建类Hdfscurdtest1
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;import java.io.FileNotFoundException;
import java.io.IOException;public class hdfscurdtest1 {FileSystem fs = null;@Beforepublic void init() throws IOException {Configuration conf = new Configuration();conf.set("fs.defaultFS","hdfs://192.168.100.3:9000");System.setProperty("HADOOP_USER_NAME","root");fs = FileSystem.get(conf);}@Testpublic void testAddFileToHdfs() throws Exception{Path src = new Path("d:\\data\\a.txt");Path des = new Path("/a/a.txt");Path des1 = new Path("/a/b/c/a.txt");Path des2 = new Path("/a2/a.txt");Path des3 = new Path("/a.txt");fs.copyFromLocalFile(src,des);fs.copyFromLocalFile(src,des1);fs.copyFromLocalFile(src,des2);fs.copyFromLocalFile(src,des3);fs.close();}@Testpublic void testDownloadFileToLocal() throws IllegalArgumentException,IOException {fs.copyToLocalFile(new Path("/a.txt"),new Path("D:\\downloadFile"));}@Testpublic void testMkdirAndDeleteAndRename() throws Exception {fs.mkdirs(new Path("/a/b/c"));fs.mkdirs(new Path("/a2/b2/c2"));fs.rename(new Path("/a"), new Path("/a3"));fs.delete(new Path("/a2"), true);}@Testpublic void testListFiles() throws FileNotFoundException,IllegalArgumentException, IOException {RemoteIterator<LocatedFileStatus> listFiles =fs.listFiles(new Path("/a"), true);while (listFiles.hasNext()) {LocatedFileStatus fileStatus = listFiles.next();System.out.println("文件名:" + fileStatus.getPath().getName());System.out.println("文件的副本数:" + fileStatus.getReplication());System.out.println("文件的权限:" + fileStatus.getPermission());System.out.println("文件大小:" + fileStatus.getLen() + "字节");BlockLocation[] blockLocations =fileStatus.getBlockLocations();for (BlockLocation bl : blockLocations) {String[] hosts = bl.getHosts();System.out.println("文件的Block所在虚拟机的主机名:");for (String host : hosts) {System.out.println(host);}}System.out.println("----------------------------");}}
}
第四课时
知识点1-Federation机制的实现原理
HDFS提供了一种Federation(联邦)机制,该机制允许单个HDFS可以存在多个NameNode,从而不仅可以解决HDFS的存储能力受单个NameNode的内存限制,而且可以提高HDFS读写数据的效率。本节课将针对Federation机制进行详细讲解。
HDFS的NameSpace(命名空间)层和Block Storage(数据块存储)层。
Block Management(数据块管理器)和 Storage(物理存储)
>Federation机制使用多个独立的NameNode
知识点2-Federation机制的特点
教师通过PPT讲解Federation机制的特点。
(1)介绍Federation机制的优点。
① NameSpace的可扩展性
② 高性能
③ 隔离机制
(2)Federation机制的缺点。
① 交叉访问
② 数据移动效率低
知识点3-Federation机制的实现
Federation机制的实现,主要是通过修改Hadoop的自定义配置文件hdfs-site.xml实现,该配置文件存在参数dfs.nameservices用于指定多个NameNode中不同NameSpace的唯一标识符,通过NameSpace的唯一标识符可以指定不同NameNode的配置信息,例如NameNode的RPC通信地址、Http通信地址等。
操作步骤如下。
(1)前提准备
①关闭Hadoop的HDFS和YARN
②删除HDFS的数据和元数据
(2)修改hdfs-site.xml配置文件
(3)分发hdfs-site.xml配置文件
(4)格式化HDFS文件系统
(5)启动Hadoop集群
(6)使用不同的NameNode
知识点4-Erasure Coding
PPT结合实际操作的方式讲解Erasure Coding。
(1)介绍Erasure Coding(纠删码)。
(2)介绍条带化技术。
(3)介绍HDFS通过条带化实现Erasure Coding的原理。
(4)通过示意图介绍应用Erasure Coding的HDFS如何存储文件。
(5)介绍常用的Erasure Coding策略。
① RS-10-4-1024k
② RS-6-3-1024k
③ RS-3-2-1024k
(6)演示通过Admin Commands类型的HDFS Shell子命令ec的子命令选项应用Erasure Coding来存储文件。
① -enablePolicy
② -setPolicy
③ -getPolicy
④ -unsetPolicy
⑤-disablePolicy