大数据学习第五天笔记

前言

本文写于2024年5月31日
其中使用的技术以及软件可能会在未来某个时刻失效,本文主要用于个人学习,请后来者在批判实践的基础上审视本文。
同时,本文这里就不进行错误复现与解决办法,网上有很多答疑的帖子

环境:
VMware® Workstation 16 Pro
MobaXterm_Portable_v12.4
CenterOS7 64
Windows10

Windows配置Hadoop环境

Hadoop支持使用java编程控制,往后的java编程需要在Windows的idea中完成,而且java代码的运行测试需要Hadoop环境,所以需要在Windows中配置一个和虚拟机一样的Hadoop环境


在虚拟机中找到Hadoop的安装目录,复制一份Hadoop目录,并在新副本中删除share文件,因为这个文件是Hadoop对外提供网页服务的文件夹,体积很大,而且在Windows的编程中也不需要这些网页服务,删除之后体积很小便于我们从虚拟机中下载

//复制Hadoop文件
cp -r hadoop3.1.3/ /opt/softs/hadoop3.1.3-temp
//删除share文件
rm -rf  hadoop3.1.3/ /opt/softs/hadoop3.1.3-temp/share

在这里插入图片描述
在这里插入图片描述
在MobaXterm_Portable中右击文件,选择download,选择下载的路径

在这里插入图片描述
从linux中下载的Hadoop是基于linux系统运行的,所以需要将Hadoop软件/bin目录下的部分linux脚本替换为windows脚本,至于这些脚本文件我之后会补上下载链接
在这里插入图片描述
在Windows中配置Hadoop环境,与linux中配置Hadoop类似,但是要在系统运行目录下添加Hadoop运行依赖库
在这里插入图片描述
在Windows任务栏的搜索框中直接输入path,进入系统环境变量配置
首先配置HADOOP_HOME,变量值为你自己从linux下载的Hadoop的所在目录
在这里插入图片描述
然后在系统path中添加Hadoop的/bin目录
在这里插入图片描述
回到Hadoop软件/bin目录下,尝试点击以下文件,如出现cmd命令窗口一闪而过则证明成功
在这里插入图片描述

配置java操作Hadoop的基本环境

这里使用idea,毕竟jetbrains的全家桶真的很好用,而且自带maven导入Hadoop相关的包也很方便
如果使用其他软件的话,自行查找相关的maven使用与导包教程


使用idea创建一个完全空白的maven项目
在这里插入图片描述
通过maven导入以下Hadoop的依赖包,然后重新构建maven项目,其中导入junit主要是为了使用它的@Test注释功能

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
        </dependency>
<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.3</version>
        </dependency>

运行java程序操作HDFS文件系统

创建一个新的java类文件
在这里插入图片描述
首先这里是所有的源码

package just.hdfs;


//调用hdfs的api


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

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

public class HdfsApliclient {
    //文件系统对象
    FileSystem fileSystem=null;
    //初始化hdfs文件系统
    @Before
    public void  init() throws URISyntaxException, IOException, InterruptedException {
        //创建文件系统配置对象
        Configuration conf=new Configuration();

        //创建文件系统对象
        fileSystem= FileSystem.get(new URI("hdfs://bigdata4:8020"),conf,"root");
        System.out.println("hdfs文件系统初始化成功!");
    }
    //创建hdfs目录
    @Test
    public void  createPath() throws IOException {
       boolean result=fileSystem.mkdirs(new Path("/hdfs_api"));
       if(result){
           System.out.println("创建目录成功");
       }
       else {
           System.out.println("创建目录失败");
       }
    }

    public void deletePath() throws IOException {
        Path deletePath=new Path("/hdfs_api");
        //判断是否存在这个目录
        if(fileSystem.exists(deletePath)){
            //目录存在,删除
            //delete(Path f,boolean recursive)路径,是否递归删除
            boolean result=fileSystem.delete(deletePath,true);

            System.out.println(result==true?"删除成功":"删除失败");

        }
        else {
            System.out.println("目标目录不存在");
        }

    }

    //在hdfs中创建一个文件,并写入指定内容

    public void createHdfsFile() throws IOException {
        //获取数据输出流对象
        FSDataOutputStream fsDataOutputStream=fileSystem.create(new Path("/api_file.txt"));
        //自定义要写入文件的内容
        String line ="hello world";

        //将指定内容写入文件
        fsDataOutputStream.write(line.getBytes());

        //对数据输出流对象进行刷新,也就是强制将以上数据写入
        fsDataOutputStream.flush();

        //关闭输出流
        fsDataOutputStream.close();
    }
    @Test
    public void moveHdfsFile() throws IOException {

        //源文件路径
        Path src= new Path("/api_file.txt");
        //文件新路径与新名字
        Path dst=new Path("/hdfs_api/apiFile.txt");
        boolean result= fileSystem.rename(src,dst);
        if(result){
            System.out.println("文件已修改");
        }else {
            System.out.println("文件修改失败");
        }
    }
    //读取hdfs上的文件内容
    @Test
    public void readHdfsFile() throws IOException {
        //获取数据输入流对象
        FSDataInputStream fsDataInputStream=fileSystem.open(new Path("/hdfs_api/apiFile.txt"));

        //通过IO工具类读取文件中的数据
        //System.out代表的是PrintStream对象,是outputStream的子类
        IOUtils.copyBytes(fsDataInputStream,System.out,2048,false);
        //换行
        System.out.println();
    }

    //从本地上传文件到hdfs上
    @Test
    public void uploadFile() throws IOException {
        //本机源文件
        Path src=new Path("D:\\softs\\HdfsTest\\THIRDPARTYLICENSEREADME.txt");
        //上传hdsf的目标路径
        Path dst=new Path("/hdfs_api");
        //是否删除源文件
        boolean delSrc=true;

        //是否覆盖hdfs上已存在的文件
        boolean overWrite=true;

        fileSystem.copyFromLocalFile(delSrc,overWrite,src,dst);
    }


    //从hdfs上下载文件到本地
    @Test
    public void downloadFile() throws IOException {
        //要下载的文件在hdfs的路径
        Path src=new Path("/hdfs_api/apiFile.txt");

        //文件下载到本地的路径
        Path dst=new Path("D:\\softs\\HdfsTest");
        //是否删除源文件
        boolean delSrc=false;
        //true:下载的文件不会存在crc校验   false:下载的文件有crc校验
        boolean useRawLoaclFileSystem=true;

        fileSystem.copyToLocalFile(delSrc,src,dst,useRawLoaclFileSystem);
    }
    //关闭文件系统对象
    @After
    public  void  close() throws IOException {
        if(fileSystem!=null){
            fileSystem.close();
            System.out.println("hdfs文件系统关闭");
        }
    }
}

下面我会介绍各个方法,java中出现的方法,其实在hfds命令与linux命令中都找得到对应
但是在运行以上代码之前,请先在虚拟机上打开你的Hadoop,yarn可以不用开,本节内容不涉及yarn

start-dfs.sh

在这里插入图片描述

初始化与结束方法

首先是java操作Hadoop服务的初始化与结束方法
操作Hadoop需要创建FileSystem对象
java操作Hadoop应该包括三个周期

创建FileSystem
操作Hadoop
关闭FileSystem
FileSystem fileSystem=null;
@Before
    public void  init() throws URISyntaxException, IOException, InterruptedException {
        //创建文件系统配置对象
        Configuration conf=new Configuration();

        //创建文件系统对象
        fileSystem= FileSystem.get(new URI("hdfs://bigdata4:8020"),conf,"root");
        System.out.println("hdfs文件系统初始化成功!");
    }
     //关闭文件系统对象
    @After
    public  void  close() throws IOException {
        if(fileSystem!=null){
            fileSystem.close();
            System.out.println("hdfs文件系统关闭");
        }
    }

创建目录方法

FileSystem.mkdirs()方法,在hdfs中创建目录
支持输入URI 类型,作为在hdfs中要创建的目录,支持父目录多层创建
返回类型Boolean用于判断是否成功
在这里插入图片描述

//创建hdfs目录
    @Test
    public void  createPath() throws IOException {
       boolean result=fileSystem.mkdirs(new Path("/hdfs_api"));
       if(result){
           System.out.println("创建目录成功");
       }
       else {
           System.out.println("创建目录失败");
       }
    }

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

删除目录

FileSystem.delete(),删除hdfs中的目录
输入两个参数,第一个是URI 类型,用于指定要删除的路径,第二个是Boolean类型,为是否递归删除,如文件夹里有其他文件或目录,则应该设置为ture否则会删除失败
返回类型Boolean用于判断是否成功

@Test
    public void deletePath() throws IOException {
        Path deletePath=new Path("/hdfs_api");
        //判断是否存在这个目录
        if(fileSystem.exists(deletePath)){
            //目录存在,删除
            //delete(Path f,boolean recursive)路径,是否递归删除
            boolean result=fileSystem.delete(deletePath,true);

            System.out.println(result==true?"删除成功":"删除失败");

        }
        else {
            System.out.println("目标目录不存在");
        }

    }

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

创建文件

FileSystem.create()
支持输入URI类型,用于指定文件创建路径与文件名称
返回类型为FSDataOutputStream,是FilterOutputStream的子类的子类,可以像操作FilterOutputStream一样操作FSDataOutputStream。
使用write,flush,close方法完成写入,保存,关闭流

//在hdfs中创建一个文件,并写入指定内容

    public void createHdfsFile() throws IOException {
        //获取数据输出流对象
        FSDataOutputStream fsDataOutputStream=fileSystem.create(new Path("/api_file.txt"));
        //自定义要写入文件的内容
        String line ="hello world";

        //将指定内容写入文件
        fsDataOutputStream.write(line.getBytes());

        //对数据输出流对象进行刷新,也就是强制将以上数据写入
        fsDataOutputStream.flush();

        //关闭输出流
        fsDataOutputStream.close();
    }

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

修改hdfs上的文件路径

fileSystem.rename(src,dst)
支持输入两个参数,第一个参数为URI类型,用于指定目标文件的路径,第二个参数也是RUI类型,指定目标文件将要被移动到的路径与新名字
返回类型Boolean用于判断是否成功

public void moveHdfsFile() throws IOException {

        //源文件路径
        Path src= new Path("/api_file.txt");
        //文件新路径与新名字
        Path dst=new Path("/hdfs_api/apiFile.txt");
        boolean result= fileSystem.rename(src,dst);
        if(result){
            System.out.println("文件已修改");
        }else {
            System.out.println("文件修改失败");
        }
    }

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

读取hdfs文件内容

fileSystem.open()
支持一个URI类型的参数输入,用于打开指定目录的指定文件
返回值为FSDataInputStream,与上面的FSDataOutputStream类似,是FilterInputStream子类的子类
可以通过copyBytes()等方法打印出文件内容

//读取hdfs上的文件内容
    @Test
    public void readHdfsFile() throws IOException {
        //获取数据输入流对象
        FSDataInputStream fsDataInputStream=fileSystem.open(new Path("/hdfs_api/apiFile.txt"));

        //通过IO工具类读取文件中的数据
        //System.out代表的是PrintStream对象,是outputStream的子类
        IOUtils.copyBytes(fsDataInputStream,System.out,2048,false);
        //换行
        System.out.println();
    }

在这里插入图片描述

从本地上传文件到hdfs上

fileSystem.copyFromLocalFile(delSrc,overWrite,src,dst)
支持四个参数输入:
delSrc为Boolean类型,指定是否在上传后删除本地的文件
overWrite为Boolean类型,当上传的hdfs目录下发生文件重名是否覆盖
src为URI类型,指定本地要上传的路径下的文件,
dst为URI类型,指定上传文件后放在hdfs的那个文件夹里
该方法为void,不返回

//从本地上传文件到hdfs上
    @Test
    public void uploadFile() throws IOException {
        //本机源文件
        Path src=new Path("D:\\softs\\HdfsTest\\THIRDPARTYLICENSEREADME.txt");
        //上传hdsf的目标路径
        Path dst=new Path("/hdfs_api");
        //是否删除源文件
        boolean delSrc=true;

        //是否覆盖hdfs上已存在的文件
        boolean overWrite=true;

        fileSystem.copyFromLocalFile(delSrc,overWrite,src,dst);
    }

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

从hdfs上下载文件到本地

fileSystem.copyToLocalFile(delSrc,src,dst,useRawLoaclFileSystem);
它的参数与刚刚的fileSystem.copyFromLocalFile(delSrc,overWrite,src,dst)类似
delSrc为Boolean类型,是否在下载完成后删除hdfs上的源文件
src为URI类型,指定要下载的文件在hdfs上的路径
dst为URI类型,指定从hdfs上的文件要下载到本地的哪个目录
useRawLoaclFileSystem为Boolean类型,是否要使用下载校验,如开启,每次下载后还会附带一个.crc后缀的文件校验下载结果
该方法为void,不返回

//从hdfs上下载文件到本地
    @Test
    public void downloadFile() throws IOException {
        //要下载的文件在hdfs的路径
        Path src=new Path("/hdfs_api/apiFile.txt");

        //文件下载到本地的路径
        Path dst=new Path("D:\\softs\\HdfsTest");
        //是否删除源文件
        boolean delSrc=false;
        //true:下载的文件不会存在crc校验   false:下载的文件有crc校验
        boolean useRawLoaclFileSystem=true;

        fileSystem.copyToLocalFile(delSrc,src,dst,useRawLoaclFileSystem);
    }

在这里插入图片描述

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值