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

这篇具有很好参考价值的文章主要介绍了云计算与大数据实验四 HDFS编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的

  1. 深入理解HDFS工作原理和编程思想

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

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

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

二、实验内容

  1. HDFSJava API接口进行文件的读写操作

  2. HDFSJava API接口进行之上传文件操作

  3. HDFSJava API接口进行之删除文件操作

三、实验步骤

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

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

第3关:hdfs-java接口之上传文件,云计算与大数据,大数据,hdfs,云计算,文件读写,文件上传与删除

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

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

FileSystem对象

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

代码如下:

public sattic void main(String[] args){
    URI uri = URI.create("hdfs://localhost:9000/user/tmp/test.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);
    }
}

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

public static FileSystem get(Configuration conf)throws IOException
public static FileSystem get(URI uri,Configuration conf)throws IOException
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()函数来获取文件的输入流。

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

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

第3关:hdfs-java接口之上传文件,云计算与大数据,大数据,hdfs,云计算,文件读写,文件上传与删除

编写代码实现如下功能:

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

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

相关代码:

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

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

FSDataOutputStream对象

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

public FSDataOutputStream create(Path p)throws IOException

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

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

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

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

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

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

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

预期输出:

第3关:hdfs-java接口之上传文件,云计算与大数据,大数据,hdfs,云计算,文件读写,文件上传与删除

 相关代码:

shell指令:

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

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

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

public FileStatus[] listStatus(Path f)throws IOException
public FileStatus[] listStatus(Path f,PathFilter filter)throws IOException
public FileStatus listStatus(Path[] files)throws IOException
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/的所有文件和文件夹。

预期输出:

第3关:hdfs-java接口之上传文件,云计算与大数据,大数据,hdfs,云计算,文件读写,文件上传与删除

 相关代码:

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

四、实验心得 

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

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

会使用HDFSJava接口进行之删除文件文章来源地址https://www.toymoban.com/news/detail-715767.html

到了这里,关于云计算与大数据实验四 HDFS编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云计算实验 HDFS编程

    【实验作业1】自己动手实现HDFS Shell 基于已经学习到的Hadoop API编程知识,自己动手实现一个简单的HDFS Shell程序,程序名称为HShell,要求能够支持以下功能: 1.使用HShell -cp 本地路径 HDFS路径,将文件从Linux本地文件系统拷贝到HDFS指定路径上。 2.使用HShell -rm 路径删除文件 3.使

    2024年02月08日
    浏览(28)
  • 大数据实验三-HBase编程实践

    目录 一.实验内容 二.实验目的 三.实验过程截图及说明 1、安装HBase 2、配置伪分布式模式: 3、使用hbase的shell命令来操作表: 4、使用hbase提供的javaAPI来编程实现类似操作: 5、实验总结及心得体会 6、完整报告在文章开头,挂载。 HBase编程实践: 1)在Hadoop基础上安装H

    2024年04月12日
    浏览(64)
  • 【大数据实验五】 MapReduce初级编程实践

    1实验目的 1.通过实验掌握基本的MapReduce编程方法; 2.掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。 2实验平台 已经配置完成的Hadoop伪分布式环境。 (1)操作系统:Linux(Ubuntu18.04) (2)Hadoop版本:3.1.3 3实验内容和要求 1.编程实现文件

    2024年02月03日
    浏览(152)
  • 大数据实验 实验六:Spark初级编程实践

    实验环境:Windows 10 Oracle VM VirtualBox 虚拟机:cnetos 7 Hadoop 3.3 因为Hadoop版本为3.3所以在官网选择支持3.3的spark安装包 解压安装包到指定文件夹 配置spark-env.sh 启动成功 (1) 在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数; (2) 在spark-shell中读

    2024年02月04日
    浏览(85)
  • 云计算技术 实验四 HDFS操作方法和基础编程

    参考资料为: 教材代码-林子雨编著《大数据基础编程、实验和案例教程(第2版)》教材所有章节代码_厦大数据库实验室博客 1 . 实验学时 4学时 2 . 实验目的 熟悉HDFS的基本shell命令 熟悉HDFS的web管理 掌握HDFS编程实践 3 . 实验内容 (一)参考实验指南的内容,完成相关的HDF

    2024年02月08日
    浏览(37)
  • (十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

    本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移,HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController (ZKFC)进程。ZooKeeper 是维护少量协调数据,通知客户端这些

    2024年02月13日
    浏览(42)
  • (十一)大数据实战——hadoop高可用之HDFS手动模式高可用

    本节内容我们介绍一下hadoop在手动模式下如何实现HDFS的高可用,HDFS的高可用功能是通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode很快的切换到另外一台机器,

    2024年02月14日
    浏览(40)
  • 【黑马2023大数据实战教程】VMWare虚拟机部署HDFS集群详细过程

    视频:黑马2023 VMWare虚拟机部署HDFS集群 注意!这些操作的前提是完成了前置准备中的服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等操作!!! 操作在这里 大数据集群环境准备过程记录(3台虚拟机) 1.上传Hadoop安装包到node1节点中 rz -bey 2.解压缩安装包到

    2023年04月27日
    浏览(43)
  • 云计算与大数据实验七 HBase的安装与基本操作

    一、实验目的 回顾 Hadoop 和 Zookeeper安装与配置 掌握 HBase 安装与配置 理解HBase工作原理 掌握HBase表的基本操作 二、实验内容 HBase 安装与配置 使用 HBase shell 指令创建表 使用 HBase shell 命令添加/删除数据 使用命令删除表 三、实验步骤 (一)HBase 安装与配置 HBase安装 HBase 的安

    2024年02月03日
    浏览(47)
  • 大数据技术原理与应用实验指南——HDFS JAVA API编程实践

    1. 实验目的 (1) 熟练使用HDFS操作常用的Shell命令。 (2) 熟悉HDFS操作常用的Java API。 2. 实验内容 (1) 编程实现指定功能,并利用Hadoop提供的Shell命令完成相同任务(文件的上传、下载、输出、删除、移动等操作)。 (2) 有余力编写一个Java程序,读取HDFS中的指定文件。

    2024年02月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包