HDFS之Java客户端操作

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{	@Testpublic 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*/@Testpublic 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*/@Testpublic 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*/@Testpublic 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 删除文件和目录**/@Testpublic void testDelete() throws IOException {fs.delete(new Path("/client_test/hello.txt"), true);}/*** TODO 下载文件**/@Testpublic 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*/@Testpublic void testCopyFromLocal() throws IOException {fs.copyFromLocalFile(false, true,new Path("E:\\hello.txt"),new Path("/client_test"));}/*** TODO 获取 HDFS 对象* @throws IOException* @throws InterruptedException*/@Beforepublic void init() throws IOException, InterruptedException {// HDFS访问路径 hdfs://node01:9820URI 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 关闭资源*/@Afterpublic void close() throws IOException {fs.close();}/***  TODO 获取HDFS的客户端连接*  uri : HDFS访问路径 hdfs://node01:9820*  conf : 配置对象*  user : 操作用户(用哪个用户操作HDFS)*/@Testpublic void testCreateHdfsClient() throws IOException, InterruptedException {// HDFS访问路径 hdfs://node01:9820URI 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.hqwc.cn/news/2242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis实战——短信登录(二)

Redis代替session redis中设计key 在使用session时&#xff0c;每个用户都会有自己的session&#xff0c;这样虽然验证码的键都是“code”&#xff0c;但是相互不影响&#xff0c;从而确保每个用户获取到的验证码只能够自己使用&#xff0c;当使用redis时&#xff0c;redis的ke…

【永久服务器】EUserv

1. 请先自行准备网络&#xff08;我用的伦敦还可以&#xff09;、以及visa卡&#xff0c;淘宝可以代付&#xff0c;我总共花了97人民币&#xff08;10.94欧代付费&#xff09; 现在只能申请一台&#xff0c;多了会被删除&#xff0c;也就是两欧元&#xff0c;然后选择visa卡 选…

Appium之xpath定位详解

目录 一、基础定位 二、contains模糊定位 三、组合定位 四、层级定位 前面也说过appium也是以webdriver为基的&#xff0c;对于元素的定位也基本一致&#xff0c;只是增加一些更适合移动平台的独特方式&#xff0c;下面将着重介绍xpath方法&#xff0c;这应该是UI层元素定位…

linux查找文件内容命令之grep -r ‘关键字‘

目录 grep命令介绍参数选项 grep命令的使用1. 在指定的文件中查找包含的关键字2. 在指定目录下多个文件内容中查找包含的关键字3.在追加的文件内容中查找关键字4. 统计文件中关键字出现的次数5. vi或vim打开的文件查找关键字(补充) 总结 grep命令介绍 Linux操作系统中 grep 命…

C++面向对象丨4. 文件操作

操作系统&#xff1a;Windows IDE&#xff1a;Visual Studio 2019 文章目录 1 文本文件1.1 写文件1.2 写文件实例1.3 读文件1.4 读文件实例 2 二进制文件2.1 写文件2.2 写文件实例2.2 读文件2.4 读文件实例 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会…

【虚拟机搭建-VMware设置固定IP】VMWare中CentOS如何设置固定IP【不成功手把手教学】

1、背景 在日常工作学习中&#xff08;比如博主在之前学习k8s过程中&#xff0c;windows本地搭建虚拟机&#xff0c;重启windows后&#xff09;虚拟机的IP会发生变化&#xff0c;所以该篇文章详细记录VMWare中CentOS如何设置固定IP 2、虚拟机安装 参考&#xff1a; https:/…

虚幻引擎(UE5)-大世界分区WorldPartition教程(三)

文章目录 前言LevelInstance的使用1.ALevelInstance2.选择Actor创建关卡3.运行时加载LevelInstance 总结 上一篇&#xff1a;虚幻引擎(UE5)-大世界分区WorldPartition教程(二) 前言 在制作大关卡时&#xff0c;可能会遇到这样一种情况&#xff0c;就是关卡中的某些Actor会重复…

基于51单片机的智能灌溉系统

目录 基于51单片机的智能灌溉系统一、原理图二、部分代码三、视频演示 基于51单片机的智能灌溉系统 功能&#xff1a; 1.通过LCD屏幕显示光照强度、土壤湿度以及温度 2.通过按键调整手自动模式、手动模式下可手动打开灌溉 3.若温湿度不在范围内&#xff0c;实现报警功能 4.通过…

如何在前端写播放音频

ml(html文档、wxml文档等) <audio action{{action}} src"http://music.163.com/song/media/outer/url?id2059780541.mp3"></audio> js文档 action:{"method":"play"}

第十六届CISCN复现MISC——国粹

国粹 不是我说&#xff0c;我当时比赛的时候&#xff0c;在那里叭叭叭的数的老用心了结果他是一道非常不常规的图片密码题&#xff0c;又是一种我没见过的题型 看了一些大佬的解题&#xff0c;知道他是一个坐标类型的图片拼凑 发现很多都提到了opencv&#xff0c;又是一个知识…

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>阿里云…

一步一步学OAK之九:通过OAK相机实现视频帧旋转

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 定义变量Setup 5: 定义旋转矩形的四个顶点坐标Setup 6: 创建pipelineSetup 7: 创建节点Setup 8: 设置属性Setup 9: 建立链接Setup 10: 连接设备并启动管道Setup 11: 创建与DepthAI设备通信的输入队列和输…