HDFS API编程 (Eclipse Maven工程)

本文详细介绍了如何使用Maven工程和Hadoop API进行HDFS文件操作,包括读取、上传、下载、创建和删除文件,以及查看文件属性等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写过一篇HDFS API编程 (Windows eclipse Java工程),是用普通的java工程手动导入相关的jar包来完成的。这次博客改用Maven工程,通过Maven来管理相关的jar包,只需要添加相关依赖,便自动完成相关jar包的下载与导入。

 

前提条件:

Linux下安装好Hadoop2.7.3

Windows下安装好Maven3.3.9

Windows系统下安装好eclipse

Eclipse配置好Maven

 

步骤:

 

新建Maven工程

 

Group Id填入com.test

Artifact Id填入HDFS

新建好Maven工程后,目录结构如下:

修改pom.xml添加Hadoop依赖

在</dependencies>前一行添加如下语句:

    <!-- 添加相关依赖 -->
	<dependency>
	    <groupId>org.apache.hadoop</groupId>
	    <artifactId>hadoop-common</artifactId>
	    <version>2.7.3</version>
	</dependency>
	<dependency>
	    <groupId>org.apache.hadoop</groupId>
	    <artifactId>hadoop-hdfs</artifactId>
	    <version>2.7.3</version>
	</dependency>  

修改后按"Ctrl + S"组合键保存pom.xml,观察eclipse右下角依赖包下载进度,等待至下载完成。

下载完成后,发现一个错误:Missing artifact jdk.tools:jdk.tools:jar:1.8问题,点这里解决;如果没有错误,忽略此步骤。

 

开始HDFS API编程

1.读取HDFS文件

新建ReadFile.java

ReadFile.java代码如下:

package com.test.HDFS;


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.134.128:8020");//注意修改成Linux的IP
		//通过配置获取到文件系统
		FileSystem fs = FileSystem.get(conf);
		//定义要读取文件所在的HDFS路径
		Path src=new Path("hdfs://192.168.134.128:8020/file.txt");//注意修改成Linux的IP
		//通过文件系统的open()方法得到一个文件输入流,用于读取
		FSDataInputStream dis = fs.open(src);
		//用IOUtils下的copyBytes将流中的数据打印输出到控制台
		IOUtils.copyBytes(dis, System.out, conf);
        //关闭输入流
        dis.close();
	}
}

注意:192.168.134.128修改成自己Linux的IP

 

运行程序之前,先新建出测试文件:file.txt

$ nano file.txt

内容为:

Hello Hadoop
Hello HDFS

上传file.txt到HDFS /目录下

$ hdfs dfs -put file.txt /

 查看是否上传成功

$ hdfs dfs -ls /
Found 1 items
-rw-r--r--   1 hadoop supergroup         24 2019-09-17 16:43 /file.txt

运行:右键ReadFile.java-->Run As-->Java Application

运行结果如下: 

 

 红色的log4j只是警告,不影响我们读取HDFS文件,可以先不处理它。

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

 

附录:

参考代码:

(1)文件的创建

CreateFile.java

package com.test.HDFS;

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.134.128:8020");
		   //get()的第三个参数"hadoop"为Linux的用户名,注意修改
		   FileSystem fs=FileSystem.get(uri,conf,"hadoop");
		   //定义一个要创建文件的路径
		   Path dfs=new Path("/user/hadoop/1.txt");
		   FSDataOutputStream fos=fs.create(dfs,true);
		   //写入的内容
		   fos.writeBytes("hello hdfs\n");//不支持中文
		   fos.writeUTF("你好啊!\n");// 支持中文
           //关闭流
           fos.close();

   }
}

 

(2)文件的删除

DeleteFile.java

package com.test.HDFS;

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.134.128:8020");
		   FileSystem fs=FileSystem.get(uri,conf,"hadoop");
		   //HDFS file							
		   Path path=new Path("/user/hadoop/1.txt");
		   fs.delete(path,true);
	}
}

 

(3)文件的上传

UploadFile.java

package com.test.HDFS;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class UploadFile {
  public static void main(String[] args) throws Exception{
	   Configuration conf=new Configuration();
	   //注意修改为自己的IP
	   URI uri=new URI("hdfs://192.168.134.128:8020");
	   FileSystem fs=FileSystem.get(uri,conf,"hadoop");
	   //local file
	   Path src=new Path("D:/2.txt");//这里写的是Windows系统下的文件路径,注意按实际修改。
	   //HDFS file								
	   //上传到目的地路径,可以自定义, hdfs的/user/hadoop目录需要先用命令创建出来
	   Path dst=new Path("/user/hadoop");
	   fs.copyFromLocalFile(src,dst);
  }
}

 

(4)文件的下载

DownloadFile.java

package com.test.HDFS;

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

 

(5)查看文件属性

FileAttr.java

package com.test.HDFS;


import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
import java.net.URI;
import java.sql.Date;
import java.text.SimpleDateFormat;
public class FileAttr {
  public static void main(String[] args) throws Exception {
           Configuration conf=new Configuration();
		   URI uri=new URI("hdfs://192.168.134.128:8020");
		   FileSystem fs=FileSystem.get(uri,conf,"hadoop");
		   //locate file 文件位置
		   Path fpath=new Path("/user/hadoop/2.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)));
   }
}

 

完成! enjoy it!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值