草庐IT

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

Python-AI Xenon 2023-04-18 原文

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

文章目录

一、环境准备

  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.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
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://192.168.242.201:9000"), 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---------");
    }

小技巧: Junit5可以在在idea里面进行下载,下面输入@Test之后点击黄灯泡选择5.8.1就可以下载啦

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 static void io1() throws Exception {
        // 1 获取文件系统
        Configuration configuration = new Configuration();
        configuration.set("dfs.client.use.datanode.hostname", "true");
//        configuration.set("fs.defaultFS", "hdfs://ea99qngm2v98asii1aZ:8020");
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.242.201:9000"), configuration, "root");

        // 2 创建输入流
        FileInputStream fis = new FileInputStream(new File("E:\\Java程序设计\\Hadoop_test\\src\\hello.py"));

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

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

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

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

下载文件

public static 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("E:\\Java程序设计\\Hadoop_test\\src\\helloworld.py"));

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

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

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

有关云计算-JavaAPI与Hadoop的互联的实现的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  9. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  10. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

随机推荐