IDEA使用HDFS的JavaApi

news2024/11/25 0:58:10

注:以下代码操作是利用junit在java测试文件夹中实现。

1. 准备工作

1.1 创建测试类

创建测试类,并定义基本变量

public class HDFSJAVAAPI {
    // 定义后续会用到的基本变量
    public final String HDFS_PATH = "hdfs://hadoop00/";
    Configuration conf = null;
    FileSystem fs = null;
}

1.2 定义资源初始化方法

注释@Before的作用是在后续每次测试方法之前先执行此方法,进行资源初始化。

    @Before
    // 用于初始化HDFS配置,执行打开资源的操作
    public void Init() throws Exception {
        System.out.println("打开资源初始化完成!");

        // 如果是无参构造函数,那么将加载默认的配置文件
        conf = new Configuration();
        //获取FileSystem实例
        //对于文件的操作都会在 hdfs://user/root/ 文件夹下进行
        fileSystem = FileSystem.get(URI.create(HDFS_PATH), conf, "root");
        
    }

1)关于Configuration

Hadoop使用org.apache.hadoop.conf.Configuration处理配置信息。这个类是作业的配置信息类,任何作用的配置信息必须通过Configuration传递,因为通过Configuration可以实现在多个mapper和多个reducer任务之间共享信息。

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

2)关于FileSystem

FileSystem是一个通用的文件系统API,这里使用的文件系统是HDFS,获取FileSystem实例有下面这几个静态方法。

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 )
  • 第一个方法返回的是默认文件系统(在core-site.xml中指定的,如果没有指定,则使用默认的本地文件系统)。
  • 第二个方法通过给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则默认返回文件系统。
  • 第三个方法作为给定用户来访问文件系统,对安全来说至关重要。

1.3 定义资源关闭方法

注释@After的作用是每次测试完成一个方法后都执行此操作,将资源关闭。

@After
// 用于关闭资源
public void Shot() throws Exception {
    // 将对象都置空
    fs = null;
    conf = null;
    System.out.println("资源已关闭!");
}

2. 利用Java操作HDFS

2.1 创建目录

@Test
public void mkdir() throws Exception {
    fs.mkdirs(new Path("HDFSAPI/test"));
}

执行结果:

在这里插入图片描述

1)FileSystem实例提供了创建目录的方法:

public boolean mkdirs(Path f) throws IOException

这个方法可以一次性创建所有必要但还没有的父目录,就像java.io.File类的mkdirs()方法。如果目录(以及所有父目录)都已经创建成功,则返回true。

注:因为指定了用户root所以新键的文件夹默认放在/user/root/下

2.2 上传本地文件到HDFS

    public void copyFromLocalFile() throws Exception {
        Path src = new Path("D:\\天\\Documents\\文本文件\\登岳阳楼.txt");
        Path dst = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/");
        fs.copyFromLocalFile(src, dst);
    }

执行结果:

在这里插入图片描述

2.3 读取文件

    @Test
    public void readFile() {
        FSDataInputStream in = null;
        try {
            in = fs.open(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt"));
            IOUtils.copyBytes(in, System.out, 4096, false);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(in);
        }
    }

执行结果:

在这里插入图片描述

1)FSDataInputStream对象:

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

package org.apache.hadoop.fs;

public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable{
}

Seekabel接口支持在文件中找到指定位置,并提供一个查询当前位置相对于文件起始位置偏移量(getPos())的查询方法:

public interface Seekable {
    void seek(long pos) throws IOException;
    long getPos() throws IOException;
}

调用seek()来定位大于文件长度的位置会引发IOException异常。与java.io.InputStreamskip()不同,seek()可以移到文件中的任意一个绝对位置,skip()则只能相对于当前位置定位到一个新位置。

// 使用seek()方法,将HDFS中的一个文件在标准输出上显示两次
    @Test
    public void readFileTwice() {
        FSDataInputStream in = null;
        try {
            in = fs.open(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt"));
            IOUtils.copyBytes(in, System.out, 4096, false);
            in.seek(0); //回到文件的开头
            IOUtils.copyBytes(in, System.out, 4096, false);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(in);
        }
    }

执行结果:

在这里插入图片描述

2.4 重命名文件

@Test
public void rename() throws Exception {
    Path oldPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/登岳阳楼.txt");
    Path newPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/ClimbingTheYueyangTower.txt");
    System.out.println(fs.rename(oldPath, newPath));
}

执行结果:

在这里插入图片描述

1)FileSystem实例提供了重命名文件的方法:

public boolean rename(oldPath f1, newPath f2)

2.5 创建文件

@Test
public void create() throws Exception {
    //FSDataOutputStream类是Hadoop对于写操作提供的一个类,这个类重载了很多write方法用于写入不同类型的数据
    //像FSDataIntputStream类一样,要获得FSDataOutputStream类的对象,就必须通过FileSystem类来和HDFS建立连接,然后
    //通过路径返回FSDataOutputStream实例(对象)。
    FSDataOutputStream output = fs.create(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello.txt"));
    output.write("hello world".getBytes());
    output.flush();
    output.close();
}

执行结果:
在这里插入图片描述

1)FSDataOutputStream对象

FileSystem实例的create()方法返回FSDataOutputStream对象,与FSDataInputStream类相似,它也有一个查询文件当前位置的方法:

package org.apache.hadoop.fs;
public class FSDataOutputStream extends DataOutputStream implements Syncable {
    public long getPos() throws IOException {
    }
}

但与FSDataInputStream类不同的是,FSDataOutputStream类不允许在文件中定位。这是因为HDFS只允许一个已打开的文件顺序写入,或在现有文件的末尾追加数据。

2.6 查询文件系统

查看某个目录下的所有文件

@Test
public void listFile() throws Exception {
    //FileStatus对象封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息。
    //FileStatus对象一般由FileSystem的getFileStatus()方法获得,调用该方法的时候要把文件的Path传递进去。
    FileStatus[] listStatus = fs.listStatus(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test"));
    for (FileStatus fileStatus : listStatus) {
        String isDir = fileStatus.isDirectory()?"文件夹":"文件"; // 文件 / 文件夹
        String permission = fileStatus.getPermission().toString();// 权限
        short replication = fileStatus.getReplication(); // 副本系数
        long len = fileStatus.getLen(); //长度
        String path = fileStatus.getPath().toString();   // 路径
        System.out.println(isDir + "\t" +permission + "\t" + replication + "\t" + len + "\t" + path);
    }
}

执行结果:

在这里插入图片描述

1)列出文件:

查找一个文件或目录的信息很实用,但通常还需要能够列出目录中的内容。这就是FileSystemlistStatus()方法的功能:

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

2.7 查看文件块信息

    @Test
    public void getFileBlockLocation() throws Exception {
        FileStatus fileStatus = fileSystem.getFileStatus(new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/ClimbingTheYueyangTower.txt"));
        BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());

        for (BlockLocation block : blocks) {
            for (String host : block.getHosts()) {
                System.out.println(host);
            }
            for (String name : block.getNames()) {
                System.out.println(name);
            }
        }
    }

注:这里获取元数据中的主机名和主机地址。

执行结果:

在这里插入图片描述

1)文件元数据:FileStatus

FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、副本、修改时间、所有者以及权限信息。

FeilSystemgetFileStatus()方法用于获取文件或目录的FileStatus对象。


参考资料:

  • 《Hadoop权威指南–大数据分析与存储》 第四版
  • 《Hadoop应用开发基础》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

基于Freeswitch实现的Volte网视频通知应用

现在运营商的Volte网络已经很好的支持视频通话了,因此在原来的电话语音通知的基础上,可以更进一步实现视频的通知,让用户有更好的体验,本文就从技术角度,基于Freeswitch来实现此类应用(本文假设读者已对Fre…

【Maven】linux部署maven

简介 最近学习hyperledger-fabric超级账本(区块链),需要使用到java和maven,所以重新学习了一下如何部署maven,这里附上参考文档。在附上官方网站的下载地址:https://maven.apache.org/download.cgi。首先去…

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成,可以发现n3时的二叉搜索树可以由,头节点分别为1、2、3时的所有结果组成!定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式,dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

idea远程开发环境搭建

idea远程开发环境搭建 一、安装包下载二、环境准备2.1服务器端jdk、maven安装,代码下载略2.2JetBrainsClients下载配置 三、远程环境配置3.1 创建项目3.2 填写服务器连接信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4aa09073af5e4a66a5e83e7c5d1…

《异常检测——从经典算法到深度学习》25 基于深度隔离林的异常检测算法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

《论文阅读:Backdoor Attacks Against Dataset Distillation》

数据浓缩下的后门攻击 1. 摘要 数据集蒸馏已成为训练机器学习模型时提高数据效率的一项重要技术。它将大型数据集的知识封装到较小的综合数据集中。在这个较小的蒸馏数据集上训练的模型可以获得与在原始训练数据集上训练的模型相当的性能。然而,现有的数据集蒸馏技…

儿童学python语言能做什么,孩子学python哪个机构好

大家好,小编为大家解答儿童学python语言能做什么的问题。很多人还不知道孩子学python哪个机构好,现在让我们一起来看看吧! Source code download: 本文相关源码 我们准备了很久的Python3课程终于要来了。 为什么Python3课程花了我们这么久的时…

draw.io学习笔记

1、链接 1.1、自动连接图形 鼠标放在图形上,点击出现的箭头,会自动出常用图形 1.2、固定连接 如果拖动其中一个图形的话,固定链接的形状会是曲线连过去。 方法:不要点击左边图形鼠标放在边框上面左边出现绿圆点鼠标左键点击图形的…

【模拟电路】常见电子元器件

一、常见电子元器件 二、电阻器 三、电容器 四、电感器 五、电容电感组成LRC振荡电路 六、保险丝、熔断器 七、锂电池 八、接插件 九、蜂鸣器 立创商城_一站式电子元器件采购自营商城-嘉立创电子商城 华秋商城(原"华强芯城")官网_电子元器件采购网_自营现货电子元器…

Python之自然语言处理库snowNLP

一、介绍 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是&…

【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (3) - 再次认识DataBricks 前言 Azure Databricks有access token,是具有ADB内部最高权限的token。在云环境中这些高级别权限的sec…

Javaweb小案例-基于SpringBoot+Vue实现的Timo商城

前言 Timo商城是基于Springbootvue的web商城系统,包含了商城的后台管理系统手机端微信小程序端 底层采用web-flash作为底层基础框架搭建 基本功能包含一下模块基础模块 部门管理用户管理角色管理菜单管理权限分配参数管理数据字典管理定时任务管理操作日志登录日志…

写回(write back)与 写分配(write allocate)的差异

写回(write back): 写回是一种缓存策略,它延迟将修改后的数据写入主存。当发生写入操作时,修改的数据首先被写入缓存中。相应的缓存行被标记为“脏”,表示已经被修改。写操作在此时被视为完成,…

饥荒Mod 开发(二五):常用组件 总结

饥荒Mod 开发(二四):制作一把万能工具 在前面的文章介绍了很多和饥荒相关的知识点,做了很多有趣的东西,接下来简单做个总结,总结一下组件的用法 组件用法 一个预制物可以添加多个组件,每个组件会有自己的功能&#x…

模板匹配方法

模板匹配 类似于卷积,模板在原图像上从原点进行滑动,计算模板与原图像被覆盖的地方的差别程度,共用6种计算方法,将每次计算的结果放到一个矩阵里,作为结果输出。 假如原图像大小为AxB,模板为axb&#xff0…

启动springboot时报错 APPLICATION FAILED TO START 包冲突

启动springboot时报错 APPLICATION FAILED TO START 包冲突 problem 具体日志如下 *************************** APPLICATION FAILED TO START ***************************Description:An attempt was made to call a method that does not exist. The attempt was made fr…

【开源】基于Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

GLTF编辑器实现逼真的石门模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中,每个像素点都包含了一个法线向量&#xff0…

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…