使学生了解文件系统的分类,能够描述不同文件系统的特点 使学生熟悉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构造一个访问的对象
在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)
通过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;
@Before
public 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);
}
@Test
public 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();
}
@Test
public void testDownloadFileToLocal() throws IllegalArgumentException,
IOException {
fs.copyToLocalFile(
new Path("/a.txt"),
new Path("D:\\downloadFile"));
}
@Test
public 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);
}
@Test
public 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("----------------------------");
}
}
}
HDFS提供了一种Federation(联邦)机制,该机制允许单个HDFS可以存在多个NameNode,从而不仅可以解决HDFS的存储能力受单个NameNode的内存限制,而且可以提高HDFS读写数据的效率。本节课将针对Federation机制进行详细讲解。
HDFS的NameSpace(命名空间)层和Block Storage(数据块存储)层。
>Federation机制使用多个独立的NameNode
教师通过PPT讲解Federation机制的特点。 (1)介绍Federation机制的优点。
① NameSpace的可扩展性 ② 高性能 ③ 隔离机制
(2)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
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