hadoop jar包_【大数据学习】Hadoop的HDFS的API接口开发小实战

本文详细介绍了如何在Windows 10环境下为Hadoop开发做准备,包括安装Java、配置Hadoop环境、添加第三方工具winutils、配置IDE(Idea)并连接HDFS,以及编写和测试HDFS API。重点展示了如何在纯Java项目中实践HDFS操作。
摘要由CSDN通过智能技术生成

在部署完了高可用的集群的基础上,开始对目前的集群做一次HDFS的小开发,练练手。


我的开发环境在Windows 10 64位的机器上,因此需要针对Windows的开发环境进行前期准备。

1、保证Windows系统上安装了java,并确保存Java在系统环境变量中

2、将hadoop程序包中share/hadoop目录下的有关jar包全部拷贝到一个目录下,并将此目录放置在一个干净的目录【无特殊字符、无中文等】下,为了以后导包使用,建议该文件目录命名为:hadoop_usr_lib,同时将hadoop源码包和二进制包同时解压到同一目录下,方便管理。

我将此目录放置在c:/usr目录下。

4799c90606367f9c30fb555a81f543ad.png

3、配置hadoop在windows下的环境

(1)由于Hadoop的二进制包的运行对于Linux系统环境比较友好,对Windows并不太友好,因此为了能够使得Hadoop能够始应Windows环境,我们需要在Github上下载有关Hadoop的第三方工具,名为winutils的一套类库。下载链接:https://github.com/kontext-tech/winutils,找到对应版本并下载。这里,我们使用的是Hadoop-3.3.0版本。

76a834f2fe7a6322b2cf2bd55c9ef37d.png

(2)下载好之后,找到对应版本,打开并将bin目录下的文件覆盖原Hadoop的二进制目录下的bin目录中。

1580151d8cc59c915e6b75800cab5589.png

(3)然后将hadoop.dll放到系统的动态链接库的文件中,即:C:\Windows\System32

6bef982e9fc05993b1152a2e38285088.png

 重启电脑,保证链接生效

(4)然后设置Hadoop的环境变量

在系统环境变量中添加HADOOP_HOME,具体如下:

e19a91e91a72c31cc628f5d9b14c0b16.png

然后将其bin目录添加至系统path中,具体如下:

a57f1868618f76a7852bc6d97950c10d.png

 最后添加HADOOP_USER_NAME变量,具体如下:

8c051cbe92e4a8ff7d83d710364e5fc1.png

4、在idea下配置Hadoop开发环境以及连接插件

打开idea,新建一个项目,我创建了一个纯Java项目,仅用于练习Hadoop-HDFS的API的开发小实战以及后续的MR小实战。在实际的开发生产中,绝对不建议使用纯Java项目开发Hadoop,这样做太蠢了。。。好了,我们继续。

(1)导入之前我们创建好的Jar包目录到idea开发路径中。

在File下,点击Project Structure,然后选择Libraries,点击“+”添加之前的hadoop_usr_lib

03fc871453d518f0a3473b6d20de9218.png

(2)下载针对idea的hadoop插件,有两种插件可以选择,一个是GitHub上的一个开源插件,地址为:https://github.com/fangyuzhong2016/HadoopIntellijPlugin。另一个是idea上的官方插件,叫做big data tools。

当然,我采用第二个插件。

d9bbfdd9071bfa78bd7787be1b5cb224.png

 安装即可。当然,认为下载很慢的话,可以进入如下地址自行下载:https://plugins.jetbrains.com/plugin/12494-big-data-tools/versions

 下载好之后,根据下图顺序进行操作,安装插件。

17964be7ef193babbe43767650824896.pngde5aaa706031c63de815611a8c12f4d1.png

 然后点击ok,进行安装,可能需要一点时间,然后有提示重启IDE即可。

630f9e03a14c8df9309d8512709130fa.png

 在重启后,能看到IDE的右边侧栏有Big Data Tools的选项。

(3)使用插件,连接hadoop的HDFS服务

1a6fcdb0c736633551cf3bf25d6cf162.png

这里选择HDFS,然后配置,测试连接(首先确定哪个namenode是出于active的状态!)

d85ff3e975d8fa8723d4c8bfb0976fa5.png

然后就可以使用idea的工具进行文件操作了。当然这一步可以省略,使用hadoop给的可视化界面进行文件操作也是可以的。

这里,可能会有很多坑!!!若有问题,请在公号后台发送消息,看见后我会处理。

5、在idea下开发Hadoop的API

(1)首先,需要在根目录下,创建conf文件目录,用于存储hadoop的配置文件,目的是告知程序namenode的位置。

(2)创建ha子目录,用于存放ha的集群配置。当然,可以创建其他的子目录,用于存放其他的集群配置,便于灵活切换。

(3)在服务器上把core-site.xml和hdfs-site.xml两个文件拉去下来,然后放置在ha目录下

74a12317c5b17426f6d3ddab57bdb5b6.png

(4)将ha目录作为根目录配置

3ce9c330954f235aadcb54c92624b0d5.png

(5)创建包,类,开始编写API。

编写的具体代码如下:

package com.test.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*;import org.apache.hadoop.io.IOUtils;import java.io.*;class HdfsApi {    Configuration conf; //hadoop提供的一个配置类,专门用于读取配置    FileSystem fs;    public void Conn() throws Exception {        /**         * 这是连接器函数,针对hdfs的连接         */        conf = new Configuration(true);//为true,会执行读取我们在ha下面的配置文件        fs = FileSystem.get(conf); //根据配置文件,返回对应的实例对象    }    public void Close() throws Exception {        /**         * 这是连接关闭函数,针对hdfs的关闭         */        fs.close();    }    public void MakeDir() throws Exception {        /**         * 这是在hdfs中创建目录的API         */        Path iFile = new Path("/testApi");        if (fs.exists(iFile)){            fs.delete(iFile,true);//true,递归删除        }        fs.mkdirs(iFile);    }    public void upload() throws Exception {        /**         * 这是一个上传接口,用于将文件上传至hdfs         */        Path f = new Path("/testApi/testUploadFile.txt");        FSDataOutputStream output = fs.create(f);// 返回对象快捷键:ctrl+alt+v        InputStream input  = new BufferedInputStream(new FileInputStream(new File("C:\\usr/test_for_hadoop_hdfs_api.txt")));        IOUtils.copyBytes(input,output,conf,true); //hadoop的工具类,里面有按字符拷贝的函数,最后自动关闭流,无需人为操作。    }    public void download() throws Exception {        /**         * 这是一个下载接口,用于从hdfs将文件下载至本地         */        Path f = new Path("/testApi/testUploadFile.txt");        OutputStream output = new BufferedOutputStream(new FileOutputStream(new File("C:\\usr/test_download.txt")));        FSDataInputStream input = fs.open(f);        IOUtils.copyBytes(input,output,conf,true);    }    public void GetFileBlocks() throws Exception {        /**         * 获取文件的块的信息         */        Path path = new Path("/testApi/testUploadFile.txt");        FileStatus iFile = fs.getFileStatus(path);        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(iFile, 0, iFile.getLen());        for (BlockLocation b : fileBlockLocations) {            System.out.println(b);        }    }}

对上述代码进行单元测试,生成单元测试代码如下:

package test.com.test.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*;import org.apache.hadoop.io.IOUtils;import org.junit.Test;import org.junit.Before;import org.junit.After;import java.io.*;/*** HdfsApi Tester.** @author * @since 
9月 20, 2020
* @version 1.0*/ public class HdfsApiTest { Configuration conf; //hadoop提供的一个配置类,专门用于读取配置 FileSystem fs; @Before public void before() throws Exception { conf = new Configuration(true);//为true,会执行读取我们在ha下面的配置文件 fs = FileSystem.get(conf); //根据配置文件,返回对应的实例对象 } @After public void after() throws Exception { fs.close(); } /** * Method: Conn() */ @Test public void testConn() throws Exception { //TODO: Test goes here... } /** * Method: Close() */ @Test public void testClose() throws Exception { //TODO: Test goes here... } /** * Method: MakeDir() */ @Test public void testMakeDir() throws Exception { //TODO: Test goes here... Path iFile = new Path("/testApi"); if (fs.exists(iFile)){ fs.delete(iFile,true);//true,递归删除 } fs.mkdirs(iFile); } /** * Method: upload() */ @Test public void testUpload() throws Exception { //TODO: Test goes here... Path f = new Path("/testApi/testUploadFile.txt"); FSDataOutputStream output = fs.create(f);// 返回对象快捷键:ctrl+alt+v InputStream input = new BufferedInputStream(new FileInputStream(new File("C:\\usr/test_for_hadoop_hdfs_api.txt"))); IOUtils.copyBytes(input,output,conf,true); //hadoop的工具类,里面有按字符拷贝的函数,最后自动关闭流,无需人为操作。 } /** * Method: download() */ @Test public void testDownload() throws Exception { //TODO: Test goes here... Path f = new Path("/testApi/testUploadFile.txt"); OutputStream output = new BufferedOutputStream(new FileOutputStream(new File("C:\\usr/test_download.txt"))); FSDataInputStream input = fs.open(f); IOUtils.copyBytes(input,output,conf,true); } /** * Method: GetFileBlocks() */ @Test public void testGetFileBlocks() throws Exception { //TODO: Test goes here... Path path = new Path("/testApi/testUploadFile.txt"); FileStatus iFile = fs.getFileStatus(path); BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(iFile, 0, iFile.getLen()); for (BlockLocation b : fileBlockLocations) { System.out.println(b); } }}

以上函数单元测试均通过,到这里一个简单的HDFS的编码小实战结束!

9b37b5afd76d252a6bc35f1a914ff2f9.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值