HDFS之Java客户端操作

news2024/11/18 22:44:41

HDFS之Java客户端操作


文章目录

  • HDFS之Java客户端操作
    • 写在前面
    • 准备Windows关于Hadoop的开发环境
      • 下载依赖
      • 配置HADOOP_HOME环境变量
      • 配置Path环境变量
    • 创建Maven工程
      • XML文件
      • 创建新的Package
      • 创建HdfsClient类
      • 执行程序
    • HDFS的API操作


写在前面

  • Hadoop版本:Hadoop-3.1.3
  • Linux版本:CentOS7.5
  • IDE工具:IntelliJ IDEA(Windows环境下)

HDFS的Java客户端操作也是入门Hadoop开发的学习重点

准备Windows关于Hadoop的开发环境

下载依赖

https://github.com/steveloughran/winutils

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kp9sqiA6-1676719698127)(0.png)]

根据自己的Hadoop安装版本选择对应版本的依赖,如果需要更高版本的依赖,请从以下地址下载

https://github.com/cdarlint/winutils/tree/master/hadoop-3.2.0/bin

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WIN6suQi-1676719698128)(1.png)]

将下载的文件拷贝到你存储Hadoop依赖的路径中(比如是E:\Development目录下)

配置HADOOP_HOME环境变量

选择系统变量,跟JAVA_HOME的配置是一样的

配置Path环境变量

  • 编辑环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GM0msSjX-1676719698128)(2.png)]

需要重启电脑,使得环境生效

创建Maven工程

XML文件

创建一个Maven工程 HdfsClientDemo,并导入相应的依赖坐标+日志添加,pom.xml文件内容如下:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.12.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.3</version>
    </dependency>
</dependencies>

在项目的 src/main/resources 目录下,新建一个文件,命名为 log4j2.xml ,在文件中填入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error" strict="true" name="XMLConfig">
    <Appenders>
        <!-- 类型名为Console,名称为必须属性 -->
        <Appender type="Console" name="STDOUT">
            <!-- 布局为PatternLayout的方式,
            输出样式为[INFO] [2018-01-22 17:34:01][org.test.Console]I'm here -->
            <Layout type="PatternLayout"
                    pattern="[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c{10}]%m%n" />
        </Appender>

    </Appenders>

    <Loggers>
        <!-- 可加性为false -->
        <Logger name="test" level="info" additivity="false">
            <AppenderRef ref="STDOUT" />
        </Logger>

        <!-- root loggerConfig设置 -->
        <Root level="info">
            <AppenderRef ref="STDOUT" />
        </Root>
    </Loggers>
</Configuration>

创建新的Package

包名:cn.whybigdata.hdfs

创建HdfsClient类

尝试连接Hadoop集群并创建新的目录/xiyouji/sunwukong

public class HdfsClient{	
    @Test
    public void testMkdirs() throws IOException, InterruptedException, URISyntaxException{		
		// 1 获取文件系统
		Configuration configuration = new Configuration();
		// 配置在集群上运行
		// configuration.set("fs.defaultFS", "hdfs://node01:9820");
		// FileSystem fs = FileSystem.get(configuration);
		FileSystem fs = FileSystem.get(new URI("hdfs://node01:9820"), configuration, "whybigdata");	
		// 2 创建目录
		fs.mkdirs(new Path("/xiyouji/sunwukong"));		
		// 3 关闭资源
		fs.close();
	}
}

执行程序

运行时需要配置用户名称whybigdata

在这里插入图片描述

客户端去操作HDFS时,是有一个用户身份的。默认情况下,HDFS客户端API会从JVM中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=whybigdata,whybigdata为用户名称。

HDFS的API操作

常见的API操作包括:文件上传、下载;删除文件和目录;文件重命名、移动、查看文件详情;HDFS文件和文件夹的判别。带如下所示:

package cn.whybigdata.hdfs;

/**
 * @author whybigdata
 * @create 2022-12-17-16:21
 */

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;


/**
 * 1. 和 HDFS 建立连接
 * 2. 调用 API 完成具体功能
 * 3. 关闭连接
 */
public class HdfsClientTest {

    private FileSystem fs;

    /**
     *  TODO 判断是文件还是目录
     * @throws IOException
     */
    @Test
    public void testFileStatus() throws IOException{
        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus status : fileStatuses) {
            if (status.isDirectory()) {
                System.out.println("DIR:" + status.getPath().getName());
            } else {
                System.out.println("FILE:" + status.getPath().getName());
            }
        }
    }


    /**
     *  TODO 查看文件详情
     * @throws IOException
     */
    @Test
    public void testListFiles() throws IOException{
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("文件名" + fileStatus.getPath().getName());
            System.out.println("块大小" + fileStatus.getBlockSize());
            System.out.println("副本数" + fileStatus.getReplication());
            System.out.println("权限信息:" + fileStatus.getPermission());
        }
    }


    /**
     *  TODO HDFS文件更名和移动
     * @throws IOException
     */
    @Test
    public void testRename() throws IOException{
        // 移动文件
//        fs.rename(new Path("/sanguo/liubie.txt"), new Path("/client_test"));
        // 更名
        fs.rename(new Path("/client_test/liubie.txt"), new Path("/client_test/xiaoqiao.txt"));
    }


    /**
     * TODO 删除文件和目录
     *
     */
    @Test
    public void testDelete() throws IOException {
        fs.delete(new Path("/client_test/hello.txt"), true);
    }


    /**
     * TODO 下载文件
     *
     */
    @Test
    public void testCopyToLocal() throws IOException {
        fs.copyToLocalFile(false, new Path("/client_test/hello.txt"),
                new Path("E:\\Test"), true);
    }

    /**
     * TODO 上传文件
     *  测试配置的优先级 Configuration > hdfs-site.xml > hdfs-default.xml
     */
    @Test
    public void testCopyFromLocal() throws IOException {
        fs.copyFromLocalFile(false, true,
                new Path("E:\\hello.txt"),
                new Path("/client_test"));
    }



    /**
     * TODO 获取 HDFS 对象
     * @throws IOException
     * @throws InterruptedException
     */
    @Before
    public void init() throws IOException, InterruptedException {
        // HDFS访问路径 hdfs://node01:9820
        URI uri = URI.create("hdfs://node01:9820");
        // conf : 配置对象
        Configuration conf = new Configuration();
        conf.set("dfs.replication", "6");
        // user : 操作用户(用哪个用户操作HDFS)
        String user = "whybigdata";
        // 获取HDFS的客户端连接(文件系统对象)
        fs = FileSystem.get(uri, conf, user);
    }


    /**
     * TODO 关闭资源
     */
    @After
    public void close() throws IOException {
       fs.close();
    }

    /**
     *  TODO 获取HDFS的客户端连接
     *  uri : HDFS访问路径 hdfs://node01:9820
     *  conf : 配置对象
     *  user : 操作用户(用哪个用户操作HDFS)
     */
    @Test
    public void testCreateHdfsClient() throws IOException, InterruptedException {
        // HDFS访问路径 hdfs://node01:9820
        URI uri = URI.create("hdfs://node01:9820");
        // conf : 配置对象
        Configuration conf = new Configuration();
        // user : 操作用户(用哪个用户操作HDFS)
        String user = "whybigdata";
        // 获取HDFS的客户端连接(文件系统对象)
        FileSystem fileSystem = FileSystem.get(uri, conf, user);
        System.out.println(fileSystem.getClass().getName());
        // 关闭资源
        fileSystem.close();
    }
}

注意:

  • 获取HDFS对象操作封装为一个 init() 方法
  • HDFS文件更名和移动:调用的是同一个方法rename()
  • 使用之后记得要关闭资源fileSystem.close()

全文结束!

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

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

相关文章

CentOS忘记密码重置密码教程

文章目录 前言背景介绍&#xff1a;操作步骤 前言 今天打开了很久没有用过的CentOS虚拟机&#xff0c;然后发现我好像将所有的密码全部忘记了&#xff0c;根本登录不进去&#xff0c;最终在网找到了解决办法&#xff0c;这里记录一下&#xff0c;希望对大家有帮助 背景介绍&a…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电&#xff0c;开发板正常启动后&#xff0c;使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下&#xff0c;然后使用以下命令对开机自启动脚本 rcS 进行查看&#xff0c;如下图所示&#xff1a; vi rcS 从上…

机器学习优化器和SGD和SGDM实验对比(编程实现SGD和SGDM)

机器学习优化器和SGD和SGDM实验对比 博主最近在学习优化器&#xff0c;于是呢&#xff0c;就做了一个SGD和SGDM的实验对比&#xff0c;可谓是不做不知道&#xff0c;一做吓一跳&#xff0c;这两个算法最终对结果的影响还是挺大的&#xff0c;在实验中SGDM明星要比SGD效果好太多…

HHU云计算期末复习(下)Hadoop、虚拟化技术、openstack

文章目录 第五章 Hadoop分布式文件系统HDFS分离元数据和数据&#xff1a;NameNode和DataNode流水线复制 第七章 虚拟化技术7.1 虚拟化技术简介7.2 虚拟机迁移7.3 网络虚拟化 第八章 openstack8.1 计算服务NovaRabbitMQ 8.2 Swift 第九章 云计算数据中心9.1 云数据中心特征9.2 网…

Android firebase google登录配置流程和app内测发布流程

googlePlay使用OAuth2.0保护账号安全&#xff0c;且与firebase相关。如果配置错误&#xff0c;会出现error code比如&#xff1a; 10&#xff1a; auth&#xff0c;如clientId不对&#xff1b; 7: 网络或墙的问题&#xff1b; 12500&#xff1a;签名问题。 正确配置流程 Relea…

【Redis】不卡壳的 Redis 学习之路:事务

本文是Redis系列第三篇&#xff0c;前两篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#x…

2.Apache Hive

Apache Hive概述 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统&#xff0c;可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为Hivev查询语言&#xff08;HQL&#xff09;&#xf…

SpringBoot3之GraalVM之Windows详细安装及使用教程

配置Maven环境变量 我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 %MAVEN_HOME%\bin安装Visual Studio Community 因为GraalVM需要调用操作系统的底层工具&#xff0c;而Windows底层工具是VisualStudio&#xff0c;所以我们要先下载…

2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题&#xff0c;共50分) 1.数据文件“abc.txt”中包含若干个英文单词&#xff0c;如图所示&#xff1a; 读取文件“abc.txt”中数据的Python程序段如下&#xff1a; file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wo…

Flink报错大全

1.flink版本由1.13.6提升到1.15.2 maven jar依赖问题 官方因为1.15.2弃用了2.11版本的scala,jar的命名也发生改变,部分默认的2.12版本的scala不用再特声明 1.15.2版本maven依赖 <repositories><repository><id>aliyunmaven</id><name>阿里云…

构建交互式颜色选择器:介绍Gradio的ColorPicker模块和方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

环二肽试剂:Cyclo(-Hyp-Gly),环二肽含有一个六元环结构,结构稳定

编辑作者|陕西新研博美生物科技有限公司​ 英文名称&#xff1a;Cyclo(-Hyp-Gly) 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;N/A 分子式&#xff1a;C7H10N2O3 分子量&#xff1a;170.17Cyclo(-Hyp-Gly)结构式&#xff1a; 反应机理&#xff1a; Cyclo(-Hyp-Gly)环二肽…

【vscode设置默认浏览器为google,配置默认浏览器没有google,VS Code 报Windows找不到文件‘chrome‘】

问题描述 VS Code 报Windows 找不到‘chrome’ 项目启动ctar鼠标左键快捷打开并没有使用默认浏览器 并且自己去浏览器配置并提供完整的选项 解决方案&#xff1a; 网上有很多其他的答案不过对我都没有 最后解决是在google里配置 不是默认浏览器会有个按钮 点一下就跳转到系统…

设计模式第19讲——命令模式(Command)

目录 一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象命令&#xff08;Command&#xff09;——Command 5.2 接收者&#xff08;Receiver&#xff09;——Chef 5.3 具体命令&#xff08;Co…

第十六章、Spring AOP开发中的一个坑

坑&#xff1a;在同⼀个业务类中&#xff0c;进⾏业务⽅法间的相互调⽤&#xff0c;只有最外层的⽅法,才是加⼊了额外 功能的(内部的⽅法&#xff0c;通过普通的⽅式调⽤&#xff0c;都调⽤的是原始⽅法)。如果想让内层的⽅法也 调⽤代理对象的⽅法&#xff0c;就要实现Appicat…

如何在SQL Server中实现Ungroup操作

概要 我们经常在SQL Server中使用group by语句配合聚合函数&#xff0c;对已有的数据进行分组统计。本文主要介绍一种分组的逆向操作&#xff0c;通过一个递归公式&#xff0c;实现ungroup操作。 代码和实现 我们看一个例子&#xff0c;输入数据如下&#xff0c;我们有一张产…

【需求实现】Tensorflow2的曲线拟合(二):进度条简化

文章目录 导读普通的输出方式上下求索TensorBoard是个不错的切入点与Callback参数对应的Callback方法官方的内置Callback官方进度条简单的猜测与简单的验证拼图凑齐了&#xff01; 导读 在训练模型的过程中往往会有日志一堆一堆的困扰。我并不想知道&#xff0c;因为最后我会在…

C# Excel表列名称

168 Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 输入&#xff1a;columnNumber 1 输出&#xff1a;“A”…

Unity与Android交互(4)——接入SDK

【前言】 unity接入Android SDK有两种方式&#xff0c;一种是把Unity的工程导出google project的形式进行接入&#xff0c;另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说&#xff0c;SDK也是…

一文了解PoseiSwap的质押系统

PoseiSwap 正在向订单簿 DEX 领域深度的布局&#xff0c;并有望成为订单簿 DEX 领域的早期开创者。