您当前的位置: 首页 >  Java

星许辰

暂无认证

  • 0浏览

    0关注

    466博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Java API访问HFDS

星许辰 发布时间:2021-07-26 15:03:38 ,浏览量:0

目录
  • 1.概述
  • 2.客户端核心类
  • 3.代码实现
    • 3.1.使用IDEA创建一个Maven项目
    • 3.2.配置pom.xml文件
    • 3.3.编写代码

1.概述

HDFS在生产应用中主要是Java客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(例如增删改查)HDFS上的文件。 在编写代码操作HDFS之前,个人电脑上的开发环境如下: (1)在CentOS中安装好hadoop-3.1.4,并搭建好hadoop集群; (2)在windows中安装好JDK1.8、Maven3.8.1以及IDEA2019;

2.客户端核心类

(1)Configuration:配置对象类,用于加载或设置参数属性。 (2)FileSystem:文件系统对象基类,针对不同文件系统有不同的具体实现。此外,该类封装了文件系统的相关操作方法。

3.代码实现 3.1.使用IDEA创建一个Maven项目

(1)点击Create New Project 在这里插入图片描述 (2)选择Maven,点击Next 在这里插入图片描述 (3)根据自己的实际情况为自己的项目取名(Name和ArtifactId一般相同),然后点击Finish。 在这里插入图片描述

3.2.配置pom.xml文件

根据需要向pom.xml文件中添加以下依赖和插件(在< project >标签下)


    
        org.apache.hadoop
        hadoop-common
        3.1.4
    
    
        org.apache.hadoop
        hadoop-client
        3.1.4
    
    
        org.apache.hadoop
        hadoop-hdfs
        3.1.4
    
    
        junit
        junit
        4.13
    



    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.1
            
                1.8
                1.8
            
        
    

若是本地Maven仓库没有这些依赖和插件,则联网后会自动下载,然后按照下图所示,刷新项目。 在这里插入图片描述

3.3.编写代码

创建一个名为HDFSClientTest类,然后编写代码即可。下面的代码主要从创建文件夹、上传文件以及下载文件这三个方面进行了测试。不过值得注意的是,在测试下载文件这一部分的时候,可能会出现这样的错误提示:java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset。 原因:Hadoop访问windows本地文件系统,要求Windows上的本地库能正常工作,其中Hadoop使用某些Windows API来实现类似posix的文件访问权限,而这些功能需要hadoop.dll和winutils.exe来实现。 解决办法:下载Hadoop源码在windows平台编译,编译出windows本地库。然后配置Hadoop环境变量。 使用这里提供的 《hadoop-3.1.4_winutils.zip》(提取码:hadp ),配置好之后重启IDEA即可。具体配置方法如下: 将下载的压缩包解压放在一个名称为英文的目录下(例如D盘的softwares目录),然后在电脑的环境变量中做如下配置:

HADOOP_HOME=D:\softwares\hadoop-3.1.4
path=;%HADOOP_HOME%\bin

检查方法:在windows中的命令行模式下,输入命令hadoop,然后回车,如果出现以下结果,则说明配置成功。 在这里插入图片描述 具体代码如下:

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

import java.io.IOException;

public class HDFSClientTest {

    private static Configuration conf=null;
    private static FileSystem fs=null;

    //初始化方法,用于和HDFS集群建立连接
    @Before
    public void connect2HDFS() throws IOException {
        //设置客户端的身份,以用于和HDFS集群建立连接
        System.setProperty("HADOOP_USER_NAME","root");
        //创建配置对象
        conf = new Configuration();
        //设置操作的文件系统时HDFS,并且指定HDFS操作地址
        conf.set("fs.defaultFS","hdfs://node1.itcast.cn:8020");
        //创建FileDSystem对象实例
        fs = FileSystem.get(conf);
    }

    //测试:创建文件夹
    @Test
    public void mkdir() throws IOException {
        //首先判断文件夹是否存在
        if(!fs.exists(new Path("/itheima"))){
            //创建文件夹
            fs.mkdirs(new Path("/itheima"));
        }
    }

    //测试:上传文件
    @Test
    public void putFile2HDFS() throws IOException {
        //创建本地文件路径
        Path src = new Path("E:\\testData\\1.txt");
        Path dst = new Path("/it/1.txt");
        //上传文件
        fs.copyFromLocalFile(src,dst);
    }

    //测试:下载文件
    @Test
    public void getFile2Local() throws IOException {
        //文件路径
        Path src = new Path("/it/1.txt");
        Path dst = new Path("E:\\");
        //下载文件
        fs.copyToLocalFile(src,dst);
    }

    //关闭客户端和HDFS的连接
    @After
    public void close(){
        //首先判断文件系统实例是否为null
        if(fs!=null) {
            try {
                fs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
关注
打赏
1665627467
查看更多评论
立即登录/注册

微信扫码登录

0.6149s