2021-12-08 迈向程序猿的第四十五步

本文详细介绍了如何使用IDEA管理HDFS,包括解压Hadoop,配置环境变量,处理32位系统兼容问题,验证环境,创建Java项目,导入HDFS相关jar包,实现文件的上传、下载、目录操作等。同时,文章也讲解了通过Maven创建项目连接HDFS,配置Maven环境,指定本地仓库和阿里云镜像,以及验证连接的过程。
摘要由CSDN通过智能技术生成

目录

一.IDEA远程管理HDFS

1.1  解压hadoop-2.7.6.tar.gz到本地磁盘

1.2 配置环境变量

1.3 由于Hadoop是在32位系统上编译的,并且对windows支持不好,所以需要把64的编译本地库文件(下图的两个文件),放入bin目录中。

 1.4 验证环境变量

1.5 如果报错:Error: JAVA_HOME is incorrectly set

1.6 提取HDFS的资源jar包

1.7 打开IDEA新建个java项目

1.8 项目下新建一个lib文件夹

 1.9 将_jars的所有jar包导入到lib中

 1.10 新建个Test类

 1.11 获取分布式文件系统对象

1.12 通过IDEA对HDFS进行文件的上传和下载

1.13 通过IDEA进行对HDFS的目录创建和删除

1.14 通过IDEA实现对HDFS上文件的重命名

1.15 通过IOUtils对文件进行上传和下载

1.16 API之文件状态

二.通过创建Maven项目连接HDFS

2.1 将Maven压缩包解压到本地磁盘

2.2 配置环境变量

2.3 修改settings.xml文件

2.3.1 指定本地仓库

2.3.2 指定aliyun镜像(下载资源速度更快)

2.4 创建maven项目

2.5 导入jar包依赖

2.6 验证连接


一.IDEA远程管理HDFS

1.1  解压hadoop-2.7.6.tar.gz到本地磁盘

 

1.2 配置环境变量

- HADOOP_HOME:    D:\apps\hadoop-2.7.6
- PATH: %HADOOP_HOME%\bin 和 %HADOOP_HOME%\sbin

1.3 由于Hadoop是在32位系统上编译的,并且对windows支持不好,所以需要把64的编译本地库文件(下图的两个文件),放入bin目录中。

 1.4 验证环境变量

C:\Users\usr>hadoop version

1.5 如果报错:Error: JAVA_HOME is incorrectly set

那就找到etc/hadoop/下的hadoop-env.cmd,修改JAVA_HOME的内容如下格式即可
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_221

如果还不好用,那么重新装一个JDK,路径上别带空格

1.6 提取HDFS的资源jar包

 

为了方便开发,我们可以将相关的jar提取出来。
1. 在hadoop-2.7.6目录下创建以上目录(参考图片)
2. 进入share目录中的doc子目录,搜索default.xml。将四个默认的xml文件copy到_default目录中,方便以后查看
3. 进入share目录中,搜索*.jar。将搜索到的所有jar文件copy到_jars目录下,重复的跳过。大约208个jar包左右。
4. 在_jars目录中,搜索test,将搜索到的jar包剪切到_tests目录下。这是一些关于程序测试的jar包,提取出来。大约36个左右
5. 在_jars目录中,搜索source,将搜索到的jar包剪切到_sources目录下。这些jar包是hadoop的源码包。想看源码的可以使用,大约28个
6. 此时,_jars目录中剩下的都是hadoop的相关api的jar包,大约144个。

1.7 打开IDEA新建个java项目

1.8 项目下新建一个lib文件夹

 1.9 将_jars的所有jar包导入到lib中

 

 1.10 新建个Test类

 1.11 获取分布式文件系统对象

(注意这里导包,导的都要是hadoop的!!!!)

package com.csdn;

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

import java.io.IOException;

public class Test1 {
    @Test
    public void testGetFileSystem() throws IOException {
        //创建配置对象,用于加载配置信息(四个默认的配置文件:core-default.xml,hdfs-default.xml,mapred-default.xml,yarn-default.xml)
        Configuration conf = new Configuration();
        //修改fs.defaultFS属性的值
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        //使用FileSystem类的静态方法get(Configuration conf);返回fs.defaultFS定义的文件系统
        FileSystem fs = FileSystem.get(conf);
        System.out.println("文件系统对象的类型名:"+fs.getClass().getName());
    }
}

1.12 通过IDEA对HDFS进行文件的上传和下载

 @Test
    public void testFileUpload() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);
        //将本地的一个文件D:/file1,上传到HDFS上 /file1
        //1. 使用Path描述两个文件
        Path localPath = new Path("D:/file1");
        Path hdfsPath = new Path("/file1");
        //2.调用上传方法
        fs.copyFromLocalFile(localPath,hdfsPath);
        //3.关闭
        fs.close();
        System.out.println("上传成功");
    }
    @Test
    public void testFileDownload() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);
        //从HDFS上下载一个文件/file1,下载到本地 D:/file2
        //1. 使用Path描述两个文件
        Path hdfsfile = new Path("/file1");
        Path local = new Path("D:/file2");
        //2. 调用下载方法进行下载
        fs.copyToLocalFile(hdfsfile,local);
        fs.close();
        System.out.println("下载成功");
    }

1.13 通过IDEA进行对HDFS的目录创建和删除

@Test
    public void testMkdir() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);

        //1. 测试创建目录,描述一个目录
        Path hdfsfile = new Path("/dir1");
        //2. 调用创建目录的方法
        fs.mkdirs(hdfsfile);
        fs.close();
        System.out.println("创建成功");
    }
    @Test
    public void testDelete() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);

        //1. 测试删除目录,描述一个目录
        Path hdfsfile = new Path("/dir1");
        //2. 调用创建目录的方法
        fs.delete(hdfsfile,true);
        fs.close();
        System.out.println("删除成功");
    }

1.14 通过IDEA实现对HDFS上文件的重命名

   @Test
    public void testRename() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);

        //1. 测试重命名,将file1改为file01
        Path oldName = new Path("/file1");
        Path newName = new Path("/file01");
        //2.调用重命名方法
        fs.rename(oldName,newName);
        fs.close();
        System.out.println("命名成功");
    }

1.15 通过IOUtils对文件进行上传和下载

  @Test
    public void putFile() throws IOException, URISyntaxException {
        //1 连接HDFS 文件系统
        Configuration conf=new Configuration();
        //获得文件系统
        FileSystem fs=FileSystem.get(new URI("hdfs://182.168.10.101:8020"),conf);
        // 创建输入流,读取输入文件
        FileInputStream input=new FileInputStream(new File("c://a.txt"));
        // 创建输出流
        FSDataOutputStream out=fs.create(new Path("/gg.txt"));
        //IO的流拷贝
        IOUtils.copyBytes(input, out, conf);
        //关闭资源
        IOUtils.closeStream(input);
        IOUtils.closeStream(out);
        System.out.println("上传完毕");
    }
    @Test
    public void getFile() throws IOException, URISyntaxException {
        // 1 连接HDFS 文件系统
        Configuration conf = new Configuration();
        // 获得文件系统
        FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.101:8020"), conf);
        // 获取输入流 从HDFS上读取
        FSDataInputStream input=fs.open(new Path("/gg.txt"));
        // 获取输出流
        FileOutputStream out=new FileOutputStream(new File("c://gg.txt"));
        //流拷贝
        IOUtils.copyBytes(input, out, conf);
        //关闭流
        IOUtils.closeStream(input);
        IOUtils.closeStream(out);
        System.out.println("下载完成");
    }

1.16 API之文件状态

@Test
    public void testFileStatus() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020");
        FileSystem fs = FileSystem.get(conf);
        //1. 描述你要读取的文件 /file02
        Path path = new Path("/file02");
        //获取文件的状态信息
        RemoteIterator<LocatedFileStatus> it = fs.listLocatedStatus(path);
        while(it.hasNext()){
            // 取出对象
            LocatedFileStatus status = it.next();
            System.out.println("name:"+status.getPath());
            //获取位置
            BlockLocation[] locate = status.getBlockLocations();
            for(BlockLocation bl:locate){
                System.out.println("当前块的所有副本位置:"+Arrays.toString(bl.getHosts()));
                System.out.println("当前块大小:"+bl.getLength());
                System.out.println("当前块的副本的ip地址信息:"+Arrays.toString(bl.getNames()));
            }
            System.out.println("系统的块大小:"+status.getBlockSize());
            System.out.println("文件总长度:"+status.getLen());
        }
    }

二.通过创建Maven项目连接HDFS

2.1 将Maven压缩包解压到本地磁盘

 

2.2 配置环境变量

Path:

 

2.3 修改settings.xml文件

2.3.1 指定本地仓库

 

2.3.2 指定aliyun镜像(下载资源速度更快)

 

2.4 创建maven项目

 

 

2.5 导入jar包依赖

2.6 验证连接

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

import java.io.IOException;

public class Test2 {
    @Test
    public void testConnect() throws IOException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.10.101:8020/");
        FileSystem fs = FileSystem.get(conf);
        System.out.println(fs.getClass().getName());
        fs.close();
    }
}

(=-=今天就分享到这里,IDEA对HDFS的远程相关操作,切记导包的时候一定要注意,避免自动导包,导错包!)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值