目录
1 实验名称:
2 实验目的
3 实验内容
4 实验原理
5 实验过程或源代码
5.1 HDFS的基本操作
5.2 HDFS-JAVA接口之读取文件
5.3 HDFS-JAVA接口之上传文件
5.4 HDFS-JAVA接口之删除文件
6 实验结果
6.1 HDFS的基本操作
6.2 HDFS-JAVA接口之读取文件
6.3 HDFS-JAVA接口之上传文件
6.4 HDFS-JAVA接口之删除文件
1 实验名称:
分布式文件系统HDFS
2 实验目的
1.理解HDFS存在的优势,理解HDFS体系架构,学会在环境中部署HDFS学会HDFS基本命令。
2.理解HDFS的读写操作原理,掌握HDFS的一些常用命令,理解实际操作HDFS读写时的流程。
3 实验内容
(1)HDFS的基本操作
(2)HDFS-JAVA接口之读取文件
(3)HDFS-JAVA接口之上传文件
(4)HDFS-JAVA接口之删除文件
4 实验原理
HDFS(Hadoop Distributed File System)是一个分布式文件系统,是谷歌的GFS山寨版本。它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。
HDFS文件系统的角色分为三种(Master和Slave的结构,主从节点结构),分为NameNode、Secondary NameNode和DataNode三种角色。
HDFS为分布式计算存储提供了底层支持,采用Java语言开发,可以部署在多种普通的廉价机器上,以集群处理数量积达到大型主机处理性能。HDFS 架构原理HDFS采用master/slave架构。一个HDFS集群包含一个单独的NameNode和多个DataNode。Namenode管理文件系统的元数据,而Datanode存储了实际的数据。
5 实验过程或源代码
5.1 HDFS的基本操作
1.启动Hadoop,在HDFS中创建/usr/output/文件夹:
start-dfs.sh
hadoop fs -mkdir /usr
hadoop fs -mkdir /usr/output
2.在本地创建hello.txt文件并添加内容:“HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。”:vim hello.txt
3.将hello.txt上传至HDFS的/usr/output/目录下:hadoop fs -put hello.txt /usr/output
4.删除HDFS的/user/hadoop目录:hadoop fs -rm -r /user/hadoop
5.将Hadoop上的文件hello.txt从HDFS复制到本地/usr/local目录:hadoop fs -copyToLocal /usr/output/hello.txt /usr/local
5.2 HDFS-JAVA接口之读取文件
1.使用FSDataInputStream获取HDFS的/user/hadoop/目录下的task.txt的文件内容,并输出。代码实现如下:
URI uri = URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
Configuration config = new Configuration();
FileSystem fs = FileSystem.get(uri,config);
InputStream in = null;
try{
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out,2048,false);
}catch (Exception e){
IOUtils.closeStream(in);
}
5.3 HDFS-JAVA接口之上传文件
1.在/develop/input/目录下创建hello.txt文件,并输入如下数据:迢迢牵牛星,皎皎河汉女。纤纤擢素手,札札弄机杼。终日不成章,泣涕零如雨。河汉清且浅,相去复几许?盈盈一水间,脉脉不得语。《迢迢牵牛星》。命令行:
mkdir /develop
mkdir /develop/input
cd /develop/input
vim hello.txt
start-dfs.sh
2.使用FSDataOutputStream对象将文件上传至HDFS的/user/tmp/目录下,并打印进度。代码实现如下:
File localPath = new File("/develop/input/hello.txt");
String hdfsPath = "hdfs://localhost:9000/user/tmp/hello.txt";
InputStream in = new BufferedInputStream(new FileInputStream(localPath));
Configuration config = new Configuration();
FileSystem fs = FileSystem.get(URI.create(hdfsPath), config);
long fileSize = localPath.length() > 65536 ? localPath.length() / 65536 : 1;
FSDataOutputStream out = fs.create(new Path(hdfsPath), new Progressable() {
long fileCount = 0;
public void progress() {
System.out.println("总进度" + (fileCount / fileSize) * 100 + "%");
fileCount++;
}
});
IOUtils.copyBytes(in, out, 2048, true);
5.4 HDFS-JAVA接口之删除文件
1.启动hadoop:start-dfs.sh
2.实现如下功能:删除HDFS的/user/hadoop/目录(空目录);删除HDFS的/tmp/test/目录(非空目录);列出HDFS根目录下所有的文件和文件夹;列出HDFS下/tmp/的所有文件和文件夹。代码实现如下:
String root = "hdfs://localhost:9000/";
String path = "hdfs://localhost:9000/tmp";
String del1 = "hdfs://localhost:9000/user/hadoop";
String del2 = "hdfs://localhost:9000/tmp/test";
Configuration config = new Configuration();
FileSystem fs = FileSystem.get(URI.create(root),config);
fs.delete(new Path(del1),true);
fs.delete(new Path(del2),true);
Path[] paths = {new Path(root),new Path(path)};
FileStatus[] status = fs.listStatus(paths);
Path[] listPaths = FileUtil.stat2Paths(status);
for (Path path1 : listPaths){
System.out.println(path1);
}
6 实验结果
6.1 HDFS的基本操作
1.文件输出结果
6.2 HDFS-JAVA接口之读取文件
1.获取HDFS的/user/hadoop/目录下的task.txt的文件内容
6.3 HDFS-JAVA接口之上传文件
1.文件上传并打印进度
6.4 HDFS-JAVA接口之删除文件
1.删除文件输出结果