大数据学习:使用Java API操作HDFS

news2024/11/30 0:45:49

文章目录

      • 一、创建Maven项目
      • 二、添加依赖
      • 三、创建日志属性文件
      • 四、在HDFS上创建文件
      • 五、写入HDFS文件
        • 1、将数据直接写入HDFS文件
        • 2、将本地文件写入HDFS文件
      • 六、读取HDFS文件
        • 1、读取HDFS文件直接在控制台显示
        • 2、读取HDFS文件,保存为本地文件

一、创建Maven项目

在这里插入图片描述

二、添加依赖

  • pom.xml文件里添加hadoopjunit依赖
    在这里插入图片描述
<dependencies>
        <dependency>
            <!--hadoop客户端-->
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.4</version>
        </dependency>
        <!--单元调试框架-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    </dependencies>

三、创建日志属性文件

  • resources目录里创建log4j.properties文件
    在这里插入图片描述
    在这里插入图片描述
  • 代码
log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/hdfs.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

四、在HDFS上创建文件

  • /ied01目录创建hadoop2.txt文件
  • 创建net.xxr.hdfs包,在包里创建CreateFileOnHDFS
    在这里插入图片描述
    在这里插入图片描述
  • 编写create1()方法
package net.xxr.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.net.URI;

public class CreateFileOnHDFS {
    public void create1() throws Exception{
        // 创建配置对象
        Configuration conf = new Configuration();
        // 定义统一资源标识符
        String uri = "hdfs://master:9000";
        // 创建文件系统对象(基于HDFS的文件系统)
        FileSystem fs = FileSystem.get(new URI(uri), conf);
        // 创建路径对象(指向文件)
        Path path = new Path(uri + "/ied01/hadoop2.txt");
        // 基于路径对象创建文件
        boolean result = fs.createNewFile(path);
        // 根据返回值判断文件是否创建成功
        if (result) {
            System.out.println("文件[" + path + "]创建成功!");
        }else {
            System.out.println("文件[" + path + "]创建失败!");
        }
    }
}


  • 结果
    在这里插入图片描述
  • 利用HDFS集群WebUI查看
    在这里插入图片描述
  • 编写create2()方法,实现判断文件是否存在
 @Test
    public void create2() throws Exception{
        // 创建配置对象
        Configuration conf = new Configuration();
        // 定义统一资源标识符
        String uri = "hdfs://master:9000";
        // 创建文件系统对象(基于HDFS的文件系统)
        FileSystem fs = FileSystem.get(new URI(uri), conf);
        // 创建路径对象(指向文件)
        Path path = new Path(uri + "/ied01/hadoop2.txt");
        // 判断路径对象指向的文件是否存在
        if (fs.exists(path)) {
            // 提示用户文件已存在
            System.out.println("文件[" + path + "]已存在!");
        }else{
            // 基于路径对象创建文件
            boolean result = fs.createNewFile(path);
            // 根据返回值判断文件是否创建成功
            if (result) {
                System.out.println("文件[" + path + "]创建成功!");
            }else {
                System.out.println("文件[" + path + "]创建失败!");
            }

        }
    }
  • 结果
    在这里插入图片描述

五、写入HDFS文件

  • net.xxr.hdfs包里创建WriteFileOnHDFS
    在这里插入图片描述

1、将数据直接写入HDFS文件

package net.xxr.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.net.URI;

/*
功能:写入HDFS文件
作者:小小榕
日期:2022年11月30日
 */

public class WriteFileOnHDFS {
    @Test
    public void write1() throws Exception{
        // 创建配置对象
        Configuration conf = new Configuration();
        conf.set("dfs.client.use.datanode.hostname","true");
        // 定义统一资源标识符
        String uri = "hdfs://master:9000";
        // 创建文件系统对象(基于HDFS的文件系统)
        FileSystem fs = FileSystem.get(new URI(uri), conf,"root");
        // 创建路径对象(指向文件)
        Path path = new Path(uri + "/ied01/hadoop2.txt");
        // 创建文件系统数据字节输出流
        FSDataOutputStream out = fs.create(path);
        // 通过字节输出流向文件写数据
        out.write("Hello Hadoop World".getBytes());
        // 关闭输出流
        out.close();
        // 关闭文件系统对象
        fs.close();
        System.out.println("文件[" + path + "]写入成功");
    }
}

  • 结果
    在这里插入图片描述
  • 利用HDFS集群WebUI查看
    在这里插入图片描述

2、将本地文件写入HDFS文件

  • 在项目根目录创建一个文本文件test.txt
    在这里插入图片描述
  • 创建create2()方法
@Test
    public void write2() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname", "true");
        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建文件系统对象
        FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
        // 创建路径对象(指向目录或文件)
        Path path = new Path(uri + "/ied01/exam2.txt");
        // 创建文件系统数据字节输出流对象
        FSDataOutputStream out = fs.create(path);
        // 创建文件字符输入流对象
        FileReader fr = new FileReader("test.txt");
        // 创建缓冲字符输入流对象
        BufferedReader br = new BufferedReader(fr);
        // 定义行字符串
        String nextLine = "";
        // 通过循环读取缓冲字符输入流
        while ((nextLine = br.readLine()) != null) {
            // 在控制台输出读取的行
            System.out.println(nextLine);
            // 通过文件系统数据字节输出流对象写入指定文件
            out.write(nextLine.getBytes());
        }
        // 关闭文件系统字节输出流
        out.close();
        // 关闭缓冲字符输入流
        br.close();
        // 关闭文件字符输入流
        fr.close();
        // 提示用户写入文件成功
        System.out.println("本地文件[test.txt]成功写入[" + path + "]!");
    }
  • 结果
    在这里插入图片描述
  • 其实这个方法的功能就是将本地文件复制(上传)到HDFS,有没有更简单的处理方法呢?有的,通过使用一个工具类IOUtils来完成文件的相关操作
  • 编写create2_()方法
@Test
    public void write2_() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname", "true");
        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建文件系统对象
        FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
        // 创建路径对象(指向目录或文件)
        Path path = new Path(uri + "/ied01/test2.txt");
        // 创建文件系统数据字节输出流对象
        FSDataOutputStream out = fs.create(path);
        // 创建文件字节输入流对象
        FileInputStream in = new FileInputStream("test.txt");
        // 利用IOUtils类提供的字节拷贝方法来复制文件
        IOUtils.copyBytes(in, out, conf);
        // 关闭文件字节输入流
        in.close();
        // 关闭文件系统数据字节输出流
        out.close();
        // 关闭文件系统
        fs.close();
        // 提示用户写入文件成功
        System.out.println("本地文件[test.txt]成功写入[" + path + "]!");
    }
  • 结果
    在这里插入图片描述
  • 查看/ied01/test.txt内容
    在这里插入图片描述

六、读取HDFS文件

  • net.xxr.hdfs包里创建ReadFileOnHDFS
    在这里插入图片描述

1、读取HDFS文件直接在控制台显示

  • 编写read1()方法
package net.xxr.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

/*
功能:读取HDFS文件
作者:小小榕
日期:2022年11月30日
 */

public class ReadFileOnHDFS {
    @Test
    public void read1() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname", "true");
        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建文件系统对象
        FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
        // 创建路径对象(指向目录或文件)
        Path path = new Path(uri + "/ied01/test2.txt");
        // 创建文件系统数据字节输入流对象
        FSDataInputStream in = fs.open(path);
        // 创建缓冲字符输入流对象,提高读取效率(字节流-->字符流-->缓冲流)
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        // 定义行字符串
        String nextLine = "";
        // 通过循环读取缓冲字符输入流
        while ((nextLine = br.readLine()) != null) {
            // 在控制台输出读取的行内容
            System.out.println(nextLine);
        }
        // 关闭缓冲字符输入流
        br.close();
        // 关闭文件系统数据字节输入流
        in.close();
        // 关闭文件系统
        fs.close();
    }
}


  • 结果
    在这里插入图片描述
  • 利用IOUtils类简化代码
  • 创建read1_()测试方法
    在这里插入图片描述

2、读取HDFS文件,保存为本地文件

  • 任务:将/ied01/test2.txt下载到项目下download目录里
  • 创建download目录
    在这里插入图片描述
  • 创建read2()方法
@Test
    public void read2() throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname", "true");
        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建文件系统对象
        FileSystem fs = FileSystem.get(new URI(uri), conf, "root");
        // 创建路径对象(指向目录或文件)
        Path path = new Path(uri + "/ied01/test2.txt");
        // 创建文件系统数据字节输入流对象
        FSDataInputStream in = fs.open(path);
        // 创建文件字节输出流
        FileOutputStream out = new FileOutputStream("download/exam.txt");
        // 读取HDFS文件(靠输入流),写入本地文件(靠输出流)
        IOUtils.copyBytes(in, out, conf);
        // 关闭文件系统数据字节输入流
        in.close();
        // 关闭文件字节输出流
        out.close();
        // 关闭文件系统
        fs.close();
        // 提示用户文件下载成功
        System.out.println("文件[" + path + "]下载到本地文件[download/exam.txt]!");
    }
  • 结果
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

Spring Security 中重要对象汇总

前言 已经写了好几篇关于 Spring Security 的文章了&#xff0c;相信很多读者还是对 Spring Security 的云里雾里的。这是因为对 Spring Security 中的对象还不了解。本文就来介绍介绍一下常用对象。 认证流程 SecurityContextHolder 用户认证通过后&#xff0c;为了避免用…

【JavaWeb】Servlet系列 --- HttpServlet【底层源码分析】

HttpServlet一、什么是协议&#xff1f;什么是HTTP协议&#xff1f;二、HTTP的请求协议&#xff08;B -- > S&#xff09;1. HTTP的请求协议包括4部分&#xff08;记住&#xff09;2. HTTP请求协议的具体报文&#xff1a;GET请求3. HTTP请求协议的具体报文&#xff1a;POST请…

生成式模型和判别式模型

决策函数Yf(x)Y f(x)Yf(x)或者条件概率分布 P(Y∣X)P(Y|X)P(Y∣X) 监督学习的任务都是从数据中学习一个模型&#xff08;也叫做分类器&#xff09;&#xff0c;应用这一模型&#xff0c;对给定的输入xxx预测相应的输出YYY,这个模型的一般形式为:决策函数Yf(x)Y f(x)Yf(x)&…

java 每日一练(6)

java 每日一练(6) 文章目录单选不定项选择题编程题单选 1.关于抽象类与最终类&#xff0c;下列说法错误的是&#xff1f;   A 抽象类能被继承&#xff0c;最终类只能被实例化。   B 抽象类和最终类都可以被声明使用   C 抽象类中可以没有抽象方法&#xff0c;最终类中可以没…

Bean 管理(工厂bean)

IOC操作Bean 管理&#xff08;FactoryBean&#xff09; 下面是在Bean 管理&#xff08;工厂bean&#xff09;之前的学习&#xff0c;基于xml方式注入集合并实现 基于xml方式注入集合并实现 &#xff1a;http://t.csdn.cn/H0ipR Spring 有两种类型bean&#xff0c;一种普通bean…

第五章. 可视化数据分析分析图表—图表的常用设置2

第五章. 可视化数据分析分析图 5.2 图表的常用设置2 本节主要介绍图表的常用设置&#xff0c;设置标题和图例&#xff0c;添加注释文本&#xff0c;调整图表与画布边缘间距以及其他设置。 7.设置标题&#xff08;title&#xff09; 1).语法&#xff1a; matplotlib.pyplot.ti…

iOS15适配 UINavigationBar和UITabBar设置无效,变成黑色

今天更新了xcode13&#xff0c;运行项目发现iOS15以上的手机导航栏和状态栏之前设置的颜色等属性都不起作用了&#xff0c;都变成了黑色&#xff0c;滚动的时候才能变成正常的颜色&#xff0c;经确认得用UINavigationBarAppearance和UITabBarAppearance这两个属性对导航栏和状态…

开发SpringBoot+Jwt+Vue的前后端分离后台管理系统VueAdmin - 前端笔记

一个spring security jwt vue的前后端分离项目&#xff01;综合运用&#xff01; 关注公众号 MarkerHub&#xff0c;回复【 VueAdmin 】可以加群讨论学习、另外还会不定时安排B站视频直播答疑&#xff01; 首发公众号&#xff1a;MarkerHub 作者&#xff1a;吕一明 视频讲解&…

半年卖8万吨辣条,卫龙再闯IPO

“辣条大王”卫龙美味全球控股有限公司&#xff08;下称“卫龙”&#xff09;于11月23日重新递表&#xff0c;继续冲刺“辣条第一股”。 作为千禧一代撑起的童年“神话”&#xff0c;卫龙的上市之路却波折重重&#xff1b;它曾于2021年5月、2021年11月及此次重启IPO。 卫龙是…

线程池ThreadPoolExecutor

线程池的生命周期 private final AtomicInteger ctl new AtomicInteger(ctlOf(RUNNING, 0)); ThreadPoolExecutor使用一个ctl变量代表两个信息&#xff0c;线程池的运行状态 (runState) 和 线程池内有效线程的数量 (workerCount)&#xff0c;高三位表示状态。 workerCount&am…

MySQL 数据库存储引擎

目录 一、存储引擎简介 二、MyISAM存储引擎 1、MylSAM介绍 2、MyISAM表支持3种不同的存储格式 3、MylSAM的特点 4、MyISAM使用的生产场景 三、InnoDB存储引擎 1、InnoDB介绍 2、InnoDB的特点 3、InnoDB适用生产场景 4、MyISAM和InnoDB的区别 四、查看和修改存储引擎…

CloudAlibaba - Nacos服务注册与配置中心

文章目录一.CloudAlibaba简介1. 介绍2. 依赖3. 主要组件4. 资料文档二.Nacos服务注册与发现1. 简介2. Nacos安装3. Nacos服务注册3.1 注册服务生产者3.2 服务消费者注册和负载4. Nacos服务中心对比三.Nacos配置中心1. 基础配置搭建2. Nacos中添加配置信息2.1 Nacos中的匹配规则…

单商户商城系统功能拆解40—分销应用—分销设置

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

前端js传入Long类型精度丢失解决办法

目录 问题背景 解决过程 1.对比数据库数据 2.查询资料 解决方法 问题背景 在进行业务开发的 时候发现更新数据库中的一条数据没有成功&#xff0c;查看SQL日志发现SQL正常执行无错误信息&#xff0c;但是受影响行数为0&#xff0c;但是数据是从前端传过来的 &#xff0c;一…

面试官:MySQL explain你会关注哪些字段

编号字段名称字段说明值重要性1idSELECT查询序号&#xff0c;即为sql语句执行的顺序。数字越大越优先执行1、2、3...★★2select_typeselect类型&#xff0c;用于区分是普通查询、子查询或联合查询simple&#xff1a;简单的查询&#xff0c;不含子查询和联合查询primary&#x…

玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载

目前的机型出厂都会自带一些内置软件。个别的还无法删除。各种弹窗广告 等等占用系统资源。操作卡顿。而很多卸载软件有需要root权限才可以运行。那么有没有方法可以无需root就可以卸载内置软件呢。答案是有的。而且方法很多。今天的帖子就列举一下常用的操作步骤 操作前了解的…

自己搭建网站【搭建网站】

现在搭建网站也不只是企业公司商家的专利&#xff0c;很多个人用户都想拥有属于自己的一个网站。那么怎么自己搭建网站呢&#xff1f;下面给大家简单说说。 一、申请域名 域名是访问网站的地址&#xff0c;这是必须要有的&#xff0c;可以在域名服务商网站上申请。申请域名需要…

科普-鸟哥私房菜中的“od -t oCc /etc/issue”的意思

文章摘录展示 看到这里是困惑的&#xff0c;毕竟看这里没有写oCc 的格式 既然文章不能找到答案&#xff0c;那么&#xff0c;我们看详细的说明吧&#xff08;man od&#xff09; 如图&#xff0c;想必我们应该很清楚了 &#xff0c;o[size] 对应的参数oC &#xff0c;就可以很…

2022.11.27Find a way HDU - 2612

Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city.…

MySql索引详解-各种索引的定义与区别和应用

MySql索引详解-各种索引的定义与区别和应用一、索引基础&#xff1a;增删改查1.新增索引的几种方式2.删除索引的几种方式3.修改索引的几种方式4.查询索引的几种方式二、索引的分类1.主键索引2.唯一索引3.普通索引4.复合索引5.全文索引三、总结什么是索引&#xff1f;索引的作用…