HDFS API编程 (Windows eclipse Java工程)

前提条件:

Linux系统下安装好Hadoop2.7.3
Windows系统下安装好eclipse

步骤:

新建java工程

打开eclipse,新建一个普通java工程, File–>New–>Java Project
在这里插入图片描述
在Project name写入项目名称, 点击Finish
在这里插入图片描述
新建好项目,可以看到项目的目录结构如下:
在这里插入图片描述
为项目新建一个类, 右键工程目录下的src–>New–>Class
在这里插入图片描述
Package填写包名, Name填写类名,点击Finish
在这里插入图片描述
创建好类后,出现界面如下
在这里插入图片描述

手动添加API访问HDFS 所需要的jar包(关键步骤)

下载Hadoop安装包源码包至Windows某个目录下(我这里目录是D:\soft\hadoop)

下载地址1:https://pan.baidu.com/s/12C_voZeLm73AtuyTtdKhWg
下载地址2(官网):http://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/
在这里插入图片描述
解压安装包:右键安装包–>解压到hadoop-2.7.3
在这里插入图片描述
解压源码包:右键源码包–>解压到hadoop-2.7.3-src
在这里插入图片描述
解压后效果如下:
在这里插入图片描述
进入hadoop-2.7.3\share\hadoop文件夹, API访问HDFS需要用到的jar包在common和hdfs文件夹里
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
eclipse导入工程所需jar包
在这里插入图片描述
点击Libraries --> Add External JARs
在这里插入图片描述
在这里插入图片描述
再次点击Add External JARs
在这里插入图片描述
在这里插入图片描述
再次点击Add External JARs
在这里插入图片描述
在这里插入图片描述
再次点击Add External JARs
在这里插入图片描述
在这里插入图片描述
点击Apply and Close
在这里插入图片描述
找到源码包文件压缩成zip格式,待后面步骤使用。
注意:一定要压缩源码(带有src的)文件夹
在这里插入图片描述
在这里插入图片描述

现在开始写代码:

写代码过程中,例如想查看如 Configuration类的源码,鼠标移动到Configuration上,按住 “Ctrl + 鼠标左键”
注意:写好第 7 行代码后,要引入正确的包(org.apache.hadoop.conf),正确引入如 第 3 行代码
在这里插入图片描述
出现以下界面,Source not found说明没有该类的源码,需要我们手动添加,点击Attach Source添加源码
在这里插入图片描述
还记得源码zip文件的位置吗?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继续编写代码(在eclipse的ReadFile.java写):

package com;
 
import java.io.IOException;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
 
public class ReadFile {
 
	public static void main(String[] args) throws IOException {
		//创建Configuration实例
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.1.11:8020");
		//通过配置获取到文件系统
		FileSystem fs = FileSystem.get(conf);
		//定义要读取文件所在的HDFS路径
		Path src=new Path("hdfs://192.168.1.11:8020/file.txt");
		//通过文件系统的open()方法得到一个文件输入流,用于读取
		FSDataInputStream dis = fs.open(src);
		//用IOUtils下的copyBytes将流中的数据打印输出到控制台
		IOUtils.copyBytes(dis, System.out, conf);
        //关闭输入流
        dis.close();
	}
}

注意:
1.第16行和第20行代码要修改成自己的 IP
2.第 20 行 file.txt表示我们要查看的HDFS文件,所以我们的Linux下的HDFS进程必须要打开,如果HDFS中没有 file.txt文件,可以将代码中的 file.txt改成存在的 xxx文件,比如 core-site.xml

写好代码后,截图如下:
在这里插入图片描述

测试:

在这里插入图片描述
注意:测试时要确保Hadoop HDFS进程已经打开,通过jps命令查看。

查看控制台输出:
在这里插入图片描述

log4j只是警告,不影响我们读取HDFS文件,可以先不处理它。做到这达到我们的目的。

以上程序完成了读取HDFS文件内容,接下来可以做的是:新建一个类,通过API完成文件的写入、文件的上传、下载等等!

附录:

参考代码:

(1)文件的创建

/**
*在HDFS上创建/user/ud16/b.txt文件
*/
package com;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class CreateFile {
  public static void main(String[] args) throws Exception{
           Configuration conf=new Configuration();
           //注意修改为自己的IP
		   URI uri=new URI("hdfs://192.168.1.11:8020");
		   //get()的第三个参数"ud16"为Linux的用户名,注意修改
		   FileSystem fs=FileSystem.get(uri,conf,"ud16");
		   //定义一个要创建文件的路径
		   Path dfs=new Path("/user/ud16/file.txt");
		   FSDataOutputStream newFile=fs.create(dfs,true);
		   //写入的内容
		   newFile.writeBytes("hello,hdfs!");
   }
}

注意:文件创建时,可能会报Permission denied错误,其中一个解决办法是
给要写入的文件所在目录增加其他人写的权限, 在Linix下输入命令 $ hdfs dfs -chmod o+w /user/ud16

(2)文件的删除

/**
*删除HDFS上的/user/ud16/b.txt文件
*/
package com;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class DeleteFile {
	public static void main(String[] args) throws Exception {
		 Configuration conf=new Configuration();
		   //注意修改为自己的IP
		   URI uri=new URI("hdfs://192.168.1.11:8020");
		   FileSystem fs=FileSystem.get(uri,conf,"ud16");
		   //HDFS file							
		   Path path=new Path("/user/ud16/file.txt");
		   fs.delete(path,true);
	}
}

(3)文件的上传
注意: Path src=new Path(“D:/file.txt”);要按实际修改

package com;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
import java.net.URISyntaxException;
public class UploadFile {
  public static void main(String[] args) throws Exception{
	   Configuration conf=new Configuration();
	   //注意修改为自己的IP
	   URI uri=new URI("hdfs://192.168.1.11:8020");
	   FileSystem fs=FileSystem.get(uri,conf,"ud16");
	   //local file
      //Path:要上传文件的路径,如果是在windows下的eclipse写程序,本地文件(src)应该写windows系统下的文件路径,如果是在Linux下的eclipse编程,本地文件(src)应该写Linux系统下的文件路径
	   Path src=new Path("D:/file.txt");//这里写的是Windows系统下的文件路径,注意按实际修改。
	   //HDFS file								
	   //上传到目的地路径,可以自定义 
	   Path dst=new Path("/user/ud16");
	   fs.copyFromLocalFile(src,dst);
  }
}

(4)文件的下载

 /**
*将HDFS上的/a.txt文件下载到本地D:/test
*/
package com;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class FileDown {
  public static void main(String[] args) throws Exception{
           Configuration conf=new Configuration();
		   URI uri=new URI("hdfs://192.168.1.11:8020");
		   FileSystem fs=FileSystem.get(uri,conf,"ud16");
		   //HDFS文件:"/a.txt"为hdfs的文件,如果没有该文件请从Linux上传一个文件到HDFS.									
		   Path src=new Path("/a.txt");
		   //local文件:在Windows D盘创建一个文件夹test存放下载的文件
		   Path dst=new Path("D:/test");
		   //从HDFS下载文件到本地
		   fs.copyToLocalFile(false,src,dst,true);
   }
}

(5)文件属性查看

package com;
 /**
* 查看HDFS上的/user/ud16/file.txt文件的属性信息
*/

import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
import java.sql.Date;
import java.text.SimpleDateFormat;
public class FileDetail {
  public static void main(String[] args) throws Exception {
           Configuration conf=new Configuration();
		   URI uri=new URI("hdfs://xdata-m0:8020");
		   FileSystem fs=FileSystem.get(uri,conf,"ud16");
		   //locate file 文件位置
		   Path fpath=new Path("/user/ud16/file.txt");
		   FileStatus filestatus=fs.getFileLinkStatus(fpath);
		   //get block size 获取文件块大小
		   long blocksize=filestatus.getBlockSize();
		   System.out.println("blocksize:"+blocksize);
		   //get file size 获取文件大小
		   long filesize=filestatus.getLen();
		   System.out.println("filesize:"+filesize);
		   //get file owner 获取文件所属者
		   String fileowner=filestatus.getOwner();
		   System.out.println("fileowner:"+fileowner);
		   //get file access time 获取文件存取时间
		   SimpleDateFormat formatter=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
		   long accessTime=filestatus.getAccessTime();
		   System.out.println("access time:"+formatter.format(new Date(accessTime)));
		   //get file modify time 获取文件修改时间
		   long modifyTime=filestatus.getModificationTime();
		   System.out.println("modify time:"+formatter.format(new Date(modifyTime)));
   }

完成!

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值