云计算-JavaAPI与Hadoop的互联的实现

news2024/11/25 10:54:45

云计算-JavaAPI与Hadoop的互联的实现

文章目录

  • 云计算-JavaAPI与Hadoop的互联的实现
    • 一、环境准备
    • 二、HDFS 基本的命令操作
    • 三、HDFS客户端操作
        • IntelliJ IDEA 环境准备
        • 通过API操作HDFS
          • 主函数程序进行连接测试
          • 1. 初始化hdfs连接获得FileSystem对象
          • 1. HDFS获取文件系统
          • 2. HDFS创建文件夹
          • 3. 查看HDFS文件夹
          • 4. HDFS文件上传
          • 5. 下载HDFS文件
          • 6. 查看HDFS文件详情
          • 7. 删除HDFS文件或文件夹
          • 8.判断HDFS文件和文件夹
          • 9. 通过I/O流操作HDFS

一、环境准备

  1. 已经搭建好的hadoop伪分布式集群,详见👉 云计算-Hadoop-2.7.7 最小化集群的搭建

  2. hadoop-2.7.7.tar.gz 压缩包

  3. IntelliJ IDEA(IntelliJ在业界被公认为最好的Java开发工具)或者 eclipse (著名的跨平台的自由集成开发环境)或者 其它自己用着顺手的 Code Editor。

二、HDFS 基本的命令操作

(1)查看帮助
    hdfs dfs -help 
    
(2)查看当前目录信息
    hdfs dfs -ls /
    
(3)上传文件
    hdfs dfs -put /本地路径 /hdfs路径
    
(4)剪切文件
    hdfs dfs -moveFromLocal a.txt /aa.txt
    
(5)下载文件到本地
    hdfs dfs -get /hdfs路径 /本地路径
    
(6)合并下载
    hdfs dfs -getmerge /hdfs路径文件夹 /合并后的文件
    
(7)创建文件夹
    hdfs dfs -mkdir /hello
    
(8)创建多级文件夹
    hdfs dfs -mkdir -p /hello/world
    
(9)移动hdfs文件
    hdfs dfs -mv /hdfs路径 /hdfs路径
    
(10)复制hdfs文件
    hdfs dfs -cp /hdfs路径 /hdfs路径
    
(11)删除hdfs文件
    hdfs dfs -rm /a.txt
    
(12)删除hdfs文件夹
    hdfs dfs -rm -r /hello
    
(13)查看hdfs中的文件
    hdfs dfs -cat /hello.py
    hdfs dfs -tail -f /hello.py
    
(14)查看文件夹中有多少个文件
    hdfs dfs -count /文件夹名称
    
(15)查看hdfs的总空间
    hdfs dfs -df /
    hdfs dfs -df -h /
    
(16)修改副本数    
    hdfs dfs -setrep 1 /a.txt

参考链接: HDFS常用命令的学习

三、HDFS客户端操作

IntelliJ IDEA 环境准备

这里呢我们主要是通过java API与hadoop集群进行互联从而实现HDFS的客户端操作

首先,在本机解压下载好的 hadoop-2.7.7.tar.gz 因为里面有我们需要的jar包.

然后的话把解压后的以下所有包导入到你的java运行环境里面

你的解压路径/hadoop-2.7.7/share/hadoop/common/下面有3个

你的解压路径/hadoop-2.7.7/share/hadoop/common/lib 下面的全部

你的解压路径/hadoop-2.7.7/share/hadoop/hdfs/ 下面有3个

你的解压路径/hadoop-2.7.7/share/hadoop/hdfs/lib 下面的全部

你的解压路径/hadoop-2.7.7/share/hadoop/yarn/ 下面有13个

你的解压路径/hadoop-2.7.7/share/hadoop/yarn/lib 下面的全部

你的解压路径/hadoop-2.7.7/share/hadoop/httpfs/tomcat/lib 下面的全部

在这里插入图片描述

至于添加的方法有很多种:

  • 法一:如过你使用的是maven包管理工具,那么pom.xml配置文件需要导入的依赖如下:
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.7.7</version>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.7.7</version>
</dependency>
 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.7</version>
</dependency>   
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>5.8.1</version>
</dependency>
<dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.8.0</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
 </dependency>

参考 : HDFS3 客户端操作(基于IDEA) Maven构建Hadoop(基于eclipse)

  • 法二: 直接把这些包添加到系统环境变量当中,然后原生编译.java文件就行,或者通过参数指定jar包路径
  • 法三: 由于借助 IntelliJ IDEA 进行操作,所以我们的流程比较简单,新建项目的时候构建系统选择 IntelliJ就行了,具体步骤如下: (推荐)
  1. 创建IDEA 项目

在这里插入图片描述
在这里插入图片描述

(当然,java命名规范是项目名全部小写,包名全部小写,类名首字母大写,我这里就暂且不管了)

创建完成之后会有个 main 文件,可以运行试试,能输出"hello,world" 代表可以正常使用java.

  1. 添加 hadoop中的jar包 (可以直接选择lib文件夹导入)

在这里插入图片描述

  1. 新建java文件进行代码编写

在这里插入图片描述

我这里将其命名为 MyHadoopTest1,后面的代码都在该文件中进行编写.

通过API操作HDFS

记得打开你的虚拟机并启动Hadoop集群

先导入后续操作相关的包

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.*;
import org.apache.zookeeper.common.IOUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;

下面的代码就不做过的的解释了,关键地方会有注释,特别说明,由于为了方便操作及调试,我们都采用单元测试的方式进行代码的编写(即不依赖主函数单独运行)

并且我这里采用的是 JUnit5和JUnit4有些许不同,可参考 JUnit4和JUnit5的主要区别

主函数程序进行连接测试
/* 主函数程序测试是否可以连接成功 */
    public static void main(String[] args) throws Exception {
        BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境
        //1.实列化获得hdfs文件系统
        Configuration configuration = new Configuration();
        //2.连接的集群地址,访问nameNode的端口
        String user = "root";
        FileSystem fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, user);
        //3.打印输出测试连接是否成功
        System.out.println(fileSystem);
        // 3 关闭资源
        fileSystem.close();
        System.out.println("--------over---------");
    }

连接成功输出类似如下:

在这里插入图片描述

由于影响查看结果,后面我们就不对Log4j环境进行配置了,所以请忽略后文警告log4j:WARN!

1. 初始化hdfs连接获得FileSystem对象
/* 初始化hdfs连接获得FileSystem对象 */
    // 默认使用9000端口号,50070是客户端的端口号
    public static final String HDFS_PATH = "hdfs://192.168.242.201:9000";
    // 用于实列化hadoop的hdfs配置文件对象,用来修改配置
    private Configuration configuration;
    // 用于实列化文件系统对象fileSystem,用来对hdfs中的文件进行操作
    private FileSystem fileSystem;

    @BeforeEach //在每个测试方法执行前要执行的方法
    public void fun_before() throws URISyntaxException, IOException, InterruptedException {
        // 自动快速地使用缺省Log4j环境,要查看日志请打开下面行2行的注释
//        BasicConfigurator.configure();
//        System.setOut(new PrintStream(new File("./outLog.txt")));
        //实列化hadoop的hdfs配置文件对象
        configuration = new Configuration(); //new成功即获取成功
        //实列化hdfs文件系统对象fileSystem
        fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, "root");
        System.out.println("fun_before():--------start---------");
    }

    @AfterEach  //每个测试方法执行后要执行的方法
    public void fun_after() throws Exception {
        fileSystem.close(); //关闭hdfs文件系统对象fileSystem
        System.out.println("fun_after():--------over---------");
    }
1. HDFS获取文件系统

见上面 @BeforeEach 操作,其中,根据文档,获取FileSystem有5种方式,这里我随便挑了一种我常用的方法进行测试.

2. HDFS创建文件夹

在Hdfs根目录下创建文件夹test1和test2

@Test
public void testMkdir() throws Exception {
    fileSystem.mkdirs(new Path("/test1"));
    fileSystem.mkdirs(new Path("/test2"));
}

在这里插入图片描述

3. 查看HDFS文件夹

查看根目录下有那些文件或文件夹

@Test
public void testLSR() throws IOException {
    Path path = new Path("/");
    FileStatus fileStatus = fileSystem.getFileStatus(path);
    System.out.println("*************************************");
    System.out.println("文件根目录: " + fileStatus.getPath());
    System.out.println("文件目录为:");
    for (FileStatus fs : fileSystem.listStatus(path)) {
        System.out.println(fs.getPath());
    }
}

在这里插入图片描述

4. HDFS文件上传

将本地路径的hadoop.txt上传到HDFS,请先在本地新建该文件并输入自定义内容

@Test
public void testPUT() throws Exception {
    Path srcPath = new Path("E:/Java程序设计/Hadoop_test/src/hadoop.txt");
    Path dstPath = new Path("/test1");
    fileSystem.copyFromLocalFile(false, srcPath, dstPath);
    fileSystem.close();
    System.out.println("*************************************");
    System.out.println("文件上传成功!");
}

在这里插入图片描述

5. 下载HDFS文件

将 /test1文件夹下的hadoop.txt文件下载到本地并命名未hadoop_1.txt

@Test
public void testGET() throws Exception {
    InputStream in = fileSystem.open(new Path("/test1/hadoop.txt"));
    OutputStream out = Files.newOutputStream(Paths.get("./hadoop_1.txt"));
    IOUtils.copyBytes(in, out, 4096, true);
    System.out.println("*************************************");
    System.out.println("文件下载成功!");
}
6. 查看HDFS文件详情

查看刚刚上传的 hadoop.txt 文件中的内容

@Test
public void testCAT() throws Exception {
    Path path = new Path("/test1/hadoop.txt");
    FSDataInputStream fsDataInputStream = fileSystem.open(path);
    System.out.println("*************************************");
    System.out.println("文件内容如下:");
    int c;
    while ((c = fsDataInputStream.read()) != -1) {
        System.out.print((char) c);
    }
    fsDataInputStream.close();
}

在这里插入图片描述

7. 删除HDFS文件或文件夹

删除/test2文件夹

@Test
public void testRM() throws Exception {
    Path path = new Path("/test2");
    fileSystem.delete(path, true);
    System.out.println("*************************************");
    System.out.println("删除成功!");
}

删除 /test1文件夹下面的 hadoop.txt 文件

    @Test
    public void testRM1() throws Exception {
        Path path = new Path("test1/hadoop.txt");
        fileSystem.delete(path, true);
        System.out.println("*************************************");
        System.out.println("删除成功!");
    }

在这里插入图片描述

8.判断HDFS文件和文件夹
@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException {
    //获取文件配置信息
    configuration = new Configuration();
    fileSystem = FileSystem.get(new URI("hdfs://192.168.242.201:9000"), configuration, "root");
    //判断是文件还是文件夹
    FileStatus[] lisFileStatus = fileSystem.listStatus(new Path("/"));
    for (FileStatus fileStatus : lisFileStatus) {
        //如果是文件
        if (fileStatus.isFile()) {
            System.out.println(fileStatus.getPath().getName() + " is 文件");
        } else {
            System.out.println(fileStatus.getPath().getName() + " is 文件夹");
        }
    }
}

在这里插入图片描述

9. 通过I/O流操作HDFS

上传文件

public void io_1() throws Exception {
    // 1 获取文件系统
    configuration = new Configuration();
    configuration.set("dfs.client.use.datanode.hostname", "true");
    configuration.set("fs.defaultFS", "hdfs://192.168.242.201:8020");
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.242.201:9000"), configuration, "root");

    // 2 创建输入流
    FileInputStream fis = new FileInputStream(new File("./hello.py"));

    // 3 获取输出流
    FSDataOutputStream fos = fs.create(new Path("/hello.py"));

    // 4 流对拷
    IOUtils.copyBytes(fis, fos, configuration.size());

    // 5 关闭资源
    IOUtils.closeStream(fos);
    IOUtils.closeStream(fis);
    fs.close();

    System.out.println("over>>>>>>>>>>上传");
}

下载文件

public void io_2() throws Exception {
    // 1 获取文件系统
    configuration = new Configuration();
    configuration.set("dfs.client.use.datanode.hostname", "true");
    configuration.set("fs.defaultFS", "hdfs://192.168.242.201:8020");
    FileSystem fs = FileSystem.get(new URI("hdfs://192.168.242.201:9000"), configuration, "root");
    // 2 获取输入流
    FSDataInputStream fis = fs.open(new Path("/hello.txt"));

    // 3 获取输出流
    FileOutputStream fos = new FileOutputStream(new File("./helloworld.py"));

    // 4 流的对拷
    IOUtils.copyBytes(fis, fos, configuration.size());

    // 5 关闭资源
    IOUtils.closeStream(fos);
    IOUtils.closeStream(fis);
    fs.close();

    System.out.println("over>>>>>>>>>>下载");
}

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

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

相关文章

Redis集群方案备忘录

文章目录哨兵模式官方Redis ClusterJedis&#xff08;客户端分片&#xff09;Codis&#xff08;代理分片&#xff09;哨兵模式 优点 哨兵模式是基于主从模式的&#xff0c;解决可主从模式中master故障不可以自动切换故障的问题。缺点 &#xff08;1&#xff09;是一种中心化的…

Express 6 指南 - 路由 6.3 路线路径 Route paths

Express Express 中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Express6 指南 - 路由6.3 路线路径 Route paths6 指南 - 路由 6.3 路线路径 Route paths 【这翻译得…生怕国人看懂】 路由路径与请求方法相结合&#xff0c;定义了可以…

大数据培训课程之序列化案例实操

序列化案例实操 1. 需求 统计每一个手机号耗费的总上行流量、下行流量、总流量 &#xff08;1&#xff09;输入数据 &#xff08;2&#xff09;输入数据格式&#xff1a; 7 13560436666 120.196.100.99 1116 954 200 id…

编辑器实现思路

复杂项目 业务的复杂性: 交互的复杂性数据结构和状态的复杂性,例如级联选择器需要遍历树结构,还有一些需要链表、栈、队列等多项目依赖,工程的复杂性性能优化流程的复杂性 git flowlint 工具单元测试commit信息Code ReviewCI/CD开发一个编辑器 例如低代码的编辑器 编辑器…

如何批量旋转图片?学会这三种方法就能轻松实现

对于喜爱拍照的小伙伴来说&#xff0c;你们的手机或者相机应该有很多图片素材吧。那么在整理这些图片到电脑的时候&#xff0c;你们的图片会不会出现方向不一致的情况呢&#xff1f;有的是倒着的&#xff0c;有的是左旋了90。想要将这些图片都调整为同一个方向&#xff0c;靠手…

Delete `␍` 最简单最有效的解决方法和解释(VScode)

一、原因 VScode 出现 Delete ␍ 的原因&#xff0c;大部分都是因为安装了 Prettier 插件指定了文件的结尾换行符与系统不一致导致的&#xff0c;就是下面这个插件 由于历史原因&#xff0c;windows 和 linux 两个系统的文本文件的换行符不一致&#xff1b;Windows在换行的时候…

空域图像增强-图像灰度变换

1.图像灰度变换。自选一张图片&#xff0c;完成以下图像处理&#xff1a;①显示图像的灰度直方图&#xff1b;②直方图均衡化&#xff0c;对比变化前后的图像和灰度直方图&#xff1b;③对图像进行线性灰度变换&#xff0c;对某部分灰度值进行扩展&#xff0c;压缩其它灰度值区…

汽车空调器前缸盖数控加工工艺的制订及夹具设计

目  录 摘  要 &#xff11; Abstract 2 1 引言 3 2 零件的分析 4 2.1 零件的作用 4 2.1.1空调压缩机的功用和要求 4 2.1.2 汽车空调压缩机的一般结构 4 2.1.3 斜盘式压缩机的结构特点 4 2.1.4 斜盘式压缩机的优点 5 2.2 零件的工艺分析 5 3 数控机床的加工性能分析 10 3.1…

[附源码]计算机毕业设计JAVA校园跑腿系统

[附源码]计算机毕业设计JAVA校园跑腿系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

2023年软考备考,系统分析师知识点速记,速看

2023上半年软考系统分析师知识点速记分享给大家&#xff0c;快来一起打卡学习吧&#xff01; 1、企业集成分类&#xff1a;按组织范围分 2、企业集成分类&#xff1a;按集成点分 3、企业战略与信息化战略集成方法 业务与IT整合&#xff08;BITA&#xff09;&#xff1a;重心是…

计算机组成原理习题课第三章-4(唐朔飞)

计算机组成原理习题课第三章-4&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

计算机网络——OSI参考模型

计算机网络的分层结构 OSI参考模型 世界上第一个提出网络结构的公司IBM公司&#xff0c;其他的公司有美国国防部提出的TCP/IP 为了支持不同的网络结构的互联互通&#xff0c;国际标准化组织于1984年提出的开放的系统互联&#xff08;OSI&#xff09;参考模型。 OSI参考模型在…

光栅莫尔信号四倍频细分电路模块的设计与仿真研究

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

Kafka是什么?

简介&#xff1a; Kafka 是⼀种高吞吐量、分布式、基于发布/订阅的消息系统&#xff0c;最初由 LinkedIn公司开发&#xff0c;使⽤Scala语⾔编写&#xff0c;⽬前是 Apache 的开源项⽬。broker&#xff1a;Kafka 服务器&#xff0c;负责消息存储和转发topic&#xff1a;消息类别…

地理知识:墨卡托坐标系

1 介绍 等角圆柱形地图投影法 假设地球被围在一个中空的圆柱里&#xff0c;其赤道与圆柱相接触&#xff0c;然后再假想地球中心有一盏灯&#xff0c;把球面上的图形投影到圆柱体上&#xff0c;再把圆柱体展开&#xff0c;这就是一幅标准纬线为零度&#xff08;即赤道&#xff…

论文阅读-----使用可分离脚印的x射线3D CT向前和向后投影

Long Y , Fessler J A , Balter J M . 3D Forward and Back-Projection for X-Ray CT Using Separable Footprints[J]. IEEE Transactions on Medical Imaging, 2010, 29(11):1839-1850. 摘要 在x射线计算机断层扫描(CT)中&#xff0c;迭代重建三维图像的方法比传统的滤波反投影…

汇编语言——王爽版 总结

汇编语言-王爽summary《考试复习版》 摆烂一学期&#xff0c;期末抱佛脚 只针对必要内容总结&#xff0c;并非按目录总结 文章目录汇编语言-王爽summary《考试复习版》只针对必要内容总结&#xff0c;并非按目录总结前言一、基础知识汇编语言的组成存储器指令和数据存储单元CPU…

H2N-Gly-Gly-βAla-COOH, 42538-53-4

用作多肽和蛋白质亚硝化的低分子模型化合物。cas编号(净):627-74-7。 编号: 200129中文名称: 三肽Gly-Gly-βAlaCAS号: 42538-53-4单字母: H2N-GG-βA-OH三字母: H2N-Gly-Gly-βAla-COOH氨基酸个数: 3分子式: C7H13N3O4平均分子量: 203.2精确分子量: 203.09等电点(PI): 6.11pH7…

图解LeetCode——1779. 找到最近的有相同 X 或 Y 坐标的点(难度:简单)

一、题目 给你两个整数 x 和 y &#xff0c;表示你在一个笛卡尔坐标系下的 (x, y) 处。同时&#xff0c;在同一个坐标系下给你一个数组 points &#xff0c;其中 points[i] [ai, bi] 表示在 (ai, bi) 处有一个点。当一个点与你所在的位置有相同的 x 坐标或者相同的 y 坐标时&…

带你学习不一样的数据仓库系列-框架概念

编者按&#xff1a;本系列文章参考总结自IBM,FaceBook&#xff0c;Google等数据仓库构建英文文章&#xff0c;部分章节为直译过来&#xff0c;部分内容加上乐哥6年陌陌&#xff0c;快手等工作经验总结而来&#xff0c;让大家了解真实国外大厂数仓构建之路&#xff0c;国外同行对…