云计算与大数据实验四 HDFS编程

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 云计算与大数据实验四 HDFS编程

一、实验目的

  1. 深入理解HDFS工作原理和编程思想
  2. 使用HDFSJava接口进行文件的读写
  3. 使用HDFSJava接口进行之上传文件
  4. 使用HDFSJava接口进行之删除文件

二、实验内容

  1. HDFSJava API接口进行文件的读写操作
  2. HDFSJava API接口进行之上传文件操作
  3. HDFSJava API接口进行之删除文件操作

三、实验步骤

(一)HDFS-JAVA接口之读取文件

我们要深入探索HadoopFileSystem类,它是与Hadoop的某一文件系统进行交互的API

为了完成接下来的操作,你需要学习并掌握:

1.FileSystem对象的使用,2.FSDataInputSteam对象的使用。

FileSystem对象

要从Hadoop文件系统中读取文件,最简单的办法是使用java.net.URL对象打开数据流,从中获取数据。不过这种方法一般要使用FsUrlStreamHandlerFactory实例调用setURLStreamHandlerFactory()方法。不过每个Java虚拟机只能调用一次这个方法,所以如果其他第三方程序声明了这个对象,那我们将无法使用了。 因为有时候我们不能在程序中设置URLStreamHandlerFactory实例,这个时候咱们就可以使用FileSystem API来打开一个输入流,进而对HDFS进行操作。

代码如下:

1. public sattic void main(String[] args){
2.     URI uri = URI.create("hdfs://localhost:9000/user/tmp/test.txt");
3.     Configuration config = new Configuration();
4.     FileSystem fs = FileSystem.get(uri, config);
5.     InputStream in = null;
6.     try {
7.         in = fs.open(new Path(uri));
8.         IOUtils.copyBytes(in, System.out, 2048, false);
9.     } catch (Exception e) {
10.         IOUtils.closeStream(in);
11.     }
12. }

FileSystem是一个通用的文件系统APIFileSystem实例有下列几个静态工厂方法用来构造对象。

1. public static FileSystem get(Configuration conf)throws IOException
2. public static FileSystem get(URI uri,Configuration conf)throws IOException
3. public static FileSystem get(URI uri,Configuration conf,String user)throws IOException

Configuration对象封装了客户端或服务器的配置,通过设置配置文件读取类路径来实现(如:/etc/hadoop/core-site.xml)。

  • 第一个方法返回的默认文件系统是在core-site.xml中指定的,如果没有指定,就使用默认的文件系统。
  • 第二个方法使用给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则返回默认文件系统,
  • 第三个方法作为给定用户来返回文件系统,这个在安全方面来说非常重要。

FSDataInputStream对象

实际上,FileSystem对象中的open()方法返回的就是FSDataInputStream对象,而不是标准的java.io类对象。这个类是继承了java.io.DataInputStream的一个特殊类,并支持随机访问,由此可以从流的任意位置读取数据。

在有了FileSystem实例之后,我们调用open()函数来获取文件的输入流。

1. public FSDataInputStream open(Path p)throws IOException
2. public abst\fract FSDataInputStream open(Path f,int bufferSize)throws IOException

了解了这些,我们在来回顾上文代码,就能更好的理解这些方法的作用了:

编写代码实现如下功能:

使用FSDataInputStream获取HDFS/user/hadoop/目录下的task.txt的文件内容,并输出;

预期输出: WARN [main] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable怕什么真理无穷,进一寸有一寸的欢喜。

相关代码:

1. 1. //启动hadoop: start-dfs.sh
2. 2. package step2;
3. 3. 
4. 4. import java.io.IOException;
5. 5. import java.io.InputStream;
6. 6. import java.net.URI;
7. 7. 
8. 8. import org.apache.hadoop.conf.Configuration;
9. 9. import org.apache.hadoop.fs.FileSystem;
10. 10. import org.apache.hadoop.fs.Path;
11. 11. import org.apache.hadoop.io.IOUtils;
12. 12. 
13. 13. 
14. 14. public class FileSystemCat {
15. 15. 
16. 16.     public static void main(String[] args) throws IOException {
17. 17.         /********* Begin *********/
18. 18.         Configuration config = new Configuration();
19. 19.         URI uri = URI.create("hdfs://localhost:9000/user/hadoop/task.txt");
20. 20.         FileSystem fs = FileSystem.get(uri, config);
21. 21.         InputStream in = null;
22. 22.         try {
23. 23.             in = fs.open(new Path(uri));
24. 24.             IOUtils.copyBytes(in, System.out, 2048, false);
25. 25.         } catch (Exception e) {
26. 26.             IOUtils.closeStream(in);
27. 27.         }
28. 28.         /********* End *********/
29. 29.     }
30. 30. 
31. 31. }

(二)HDFS-JAVA接口之上传文件

FSDataOutputStream对象

我们知道在Java中要将数据输出到终端,需要文件输出流,HDFSJavaAPI中也有类似的对象。 FileSystem类有一系列新建文件的方法,最简单的方法是给准备新建的文件制定一个path对象,然后返回一个用于写入数据的输出流:

public FSDataOutputStream create(Path p)throws IOException

该方法有很多重载方法,允许我们指定是否需要强制覆盖现有文件,文件备份数量,写入文件时所用缓冲区大小,文件块大小以及文件权限。

注意:create()方法能够为需要写入且当前不存在的目录创建父目录,即就算传入的路径是不存在的,该方法也会为你创建一个目录,而不会报错。如果有时候我们并不希望它这么做,可以先用exists()方法先判断目录是否存在。

我们在写入数据的时候经常想要知道当前的进度,API也提供了一个Progressable用于传递回调接口,这样我们就可以很方便的将写入datanode的进度通知给应用了。

1. package org.apache.hadoop.util;
2. public interface Progressable{
3.     public void progress();
4. }

编写代码与脚本实现如下功能:

/develop/input/目录下创建hello.txt文件,并输入如下数据: 迢迢牵牛星,皎皎河汉女。纤纤擢素手,札札弄机杼。终日不成章,泣涕零如雨。河汉清且浅,相去复几许?盈盈一水间,脉脉不得语。《迢迢牵牛星》

使用FSDataOutputStream对象将文件上传至HDFS/user/tmp/目录下,并打印进度。

预期输出:

相关代码:

shell指令:

1. 1. mkdir /develop
2. 2. mkdir /develop/input
3. 3. cd /develop/input
4. 4. touch hello.txt
5. 5. vim hello.txt  插入数据  wq 保存退出
6. 6. start-dfs.sh
1. 1. package step3;
2. 2. 
3. 3. 
4. 4. import java.io.BufferedInputStream;
5. 5. import java.io.FileInputStream;
6. 6. import java.io.FileNotFoundException;
7. 7. import java.io.IOException;
8. 8. import java.io.InputStream;
9. 9. import java.net.URI;
10. 10. import java.io.File;
11. 11. 
12. 12. import org.apache.hadoop.conf.Configuration;
13. 13. import org.apache.hadoop.fs.FSDataOutputStream;
14. 14. import org.apache.hadoop.fs.FileSystem;
15. 15. import org.apache.hadoop.fs.Path;
16. 16. import org.apache.hadoop.io.IOUtils;
17. 17. import org.apache.hadoop.util.Progressable;
18. 18. 
19. 19. 
20. 20. public class FileSystemUpload {
21. 21. 
22. 22.     public static void main(String[] args) throws IOException {
23. 23.         /********* Begin *********/
24. 24.         File localPath = new File("/develop/input/hello.txt");
25. 25.         String hdfsPath = "hdfs://localhost:9000/user/tmp/hello.txt";
26. 26. 
27. 27.         InputStream in = new BufferedInputStream(new FileInputStream(localPath));// 获取输入流对象
28. 28. 
29. 29.         Configuration config = new Configuration();
30. 30. 
31. 31.         FileSystem fs = FileSystem.get(URI.create(hdfsPath), config);
32. 32. 
33. 33.         long fileSize = localPath.length() > 65536 ? localPath.length() / 65536 : 1; // 待上传文件大小
34. 34. 
35. 35.         FSDataOutputStream out = fs.create(new Path(hdfsPath), new Progressable() {
36. 36.             // 方法在每次上传了64KB字节大小的文件之后会自动调用一次
37. 37.             long fileCount = 0;
38. 38. 
39. 39.             public void progress() {
40. 40.                 System.out.println("总进度" + (fileCount / fileSize) * 100 + "%");
41. 41.                 fileCount++;
42. 42.             }
43. 43.         });
44. 44. 
45. 45.         IOUtils.copyBytes(in, out, 2048, true);// 最后一个参数的意思是使用完之后是否关闭流
46. 46.         /********* End *********/
47. 47.     }
48. 48. }

(三)HDFS-JAVA接口之删除文件

我们在开发或者维护系统时,经常会需要列出目录的内容,在HDFSAPI中就提供了listStatus()方法来实现该功能。

1. public FileStatus[] listStatus(Path f)throws IOException
2. public FileStatus[] listStatus(Path f,PathFilter filter)throws IOException
3. public FileStatus listStatus(Path[] files)throws IOException
4. public FileStatus() listStatus(Path[] files,PathFilter filter)throws IOException

当传入参数是一个文件时,他会简单的转变成以数组方式返回长度为1FileStatus对象,当传入参数是一个目录时,则返回0或多个FileStatus对象,表示此目录中包含的文件和目录。

删除文件

使用FileSystemdelete()方法可以永久性删除文件或目录。

public boolean delete(Path f,boolean recursive)throws IOException

如果f是一个文件或者空目录,那么recursive的值可以忽略,当recursize的值为true,并且p是一个非空目录时,非空目录及其内容才会被删除(否则将会抛出IOException异常)。

编写代码实现如下功能:

  • 删除HDFS/user/hadoop/目录(空目录);
  • 删除HDFS/tmp/test/目录(非空目录);
  • 列出HDFS根目录下所有的文件和文件夹;
  • 列出HDFS/tmp/的所有文件和文件夹。

预期输出:

相关代码:

1. 1. package step4;
2. 2. import java.io.IOException;
3. 3. import java.net.URI;
4. 4. import org.apache.hadoop.conf.Configuration;
5. 5. import org.apache.hadoop.fs.FileStatus;
6. 6. import org.apache.hadoop.fs.FileSystem;
7. 7. import org.apache.hadoop.fs.FileUtil;
8. 8. import org.apache.hadoop.fs.Path;
9. 9. 
10. 10. public class FileSystemDelete {
11. 11. 
12. 12.     public static void main(String[] args) throws IOException {
13. 13.     /********* Begin *********/
14. 14.         String root = "hdfs://localhost:9000/";//根目录
15. 15.         String path = "hdfs://localhost:9000/tmp"; //要列出的目录
16. 16.         //待删除的两个目录
17. 17.         String del1 = "hdfs://localhost:9000/user/hadoop";
18. 18.         String del2 = "hdfs://localhost:9000/tmp/test";
19. 19. 
20. 20.         Configuration config = new Configuration();
21. 21.         FileSystem fs = FileSystem.get(URI.create(root),config);
22. 22.         fs.delete(new Path(del1),true);
23. 23.         fs.delete(new Path(del2),true);
24. 24.         Path[] paths = {new Path(root),new Path(path)};
25. 25.         FileStatus[] status = fs.listStatus(paths);
26. 26.         Path[] listPaths = FileUtil.stat2Paths(status);
27. 27. 
28. 28.         for(Path path1 : listPaths){
29. 29.             System.out.println(path1);
30. 30.         }
31. 31.     /********* End *********/
32. 32.     }
33. 33. }

四、实验心得

会使用HDFSJava接口进行文件的读写

会使用HDFSJava接口进行之上传文件

会使用HDFSJava接口进行之删除文件

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
4月前
|
存储 大数据 云计算
大数据与云计算
大数据与云计算
135 2
|
1月前
|
分布式计算 并行计算 大数据
【数据挖掘】百度2015大数据云计算研发笔试卷
百度2015年大数据云计算研发笔试卷的题目总结,涵盖了Hadoop、Spark、MPI计算框架特点、TCP连接建立过程、数组最大和问题、二分查找实现以及灯泡开关问题,提供了部分题目的解析和伪代码。
44 1
|
3月前
|
Java 大数据 API
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
117 0
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
|
3月前
|
存储 分布式计算 大数据
【大数据】分布式文件系统HDFS
【大数据】分布式文件系统HDFS
66 0
【大数据】分布式文件系统HDFS
|
3月前
|
机器学习/深度学习 存储 算法
云计算和大数据处理
云计算和大数据处理
55 1
|
3月前
|
存储 资源调度 大数据
云计算在大数据分析中的弹性资源调度策略
云计算在大数据分析中的弹性资源调度策略
|
2天前
|
监控 安全 网络安全
云计算时代的网络安全挑战与对策
【9月更文挑战第24天】在数字化转型的大潮中,云计算以其灵活性、可扩展性和成本效益成为企业IT架构的核心。然而,随着数据和应用的云端迁移,网络安全威胁也日益增多,给企业的信息安全带来前所未有的挑战。本文将探讨云计算环境下的网络安全问题,分析常见的安全威胁,并提出有效的防御策略。我们将深入讨论如何通过合理的云服务选择、严格的访问控制、数据加密和持续的安全监控来保护云环境,确保企业资产和客户信息的安全。文章旨在为读者提供一套全面的云计算安全框架,帮助他们在享受云计算带来的便利的同时,有效防范潜在的网络风险。
|
2天前
|
人工智能 安全 网络安全
云计算与网络安全:挑战与机遇并存
本文深入探讨了云计算与网络安全之间的紧密关系,分析了云服务、网络安全和信息安全等技术领域的现状、挑战与未来发展趋势。通过对云计算的依赖性增长、网络攻击手段的多样化以及数据保护法规的日益严格等关键问题的剖析,本文旨在为相关从业者提供有价值的见解和应对策略。
16 2
|
2天前
|
SQL 安全 网络安全
云计算与网络安全:技术融合的双刃剑
【9月更文挑战第24天】在数字化时代,云计算如同一把双刃剑,既提供了前所未有的便利和效率,也带来了新的挑战。本文将深入探讨云计算在提升企业竞争力的同时,如何应对网络安全这一日益严峻的问题。我们将从云服务的基础架构出发,分析其潜在的安全漏洞,并结合最新的信息安全技术,提出一系列创新的解决策略。通过这些策略的实施,我们旨在实现云计算环境下的数据保护、访问控制和威胁监测,从而确保企业在享受云计算带来的红利的同时,能够有效地管理和降低网络安全风险。
|
2天前
|
存储 安全 网络安全
云计算与网络安全的交织未来
本文深入探讨了云计算与网络安全的关系,特别是在云服务、网络安全和信息安全等关键技术领域。通过分析当前的技术趋势和挑战,文章旨在提供一个全面的技术概览,帮助读者理解这两个领域的复杂性和重要性。
13 1