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;
@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("----------------------------");
}
}
}
第四课时
知识点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