之前写过一篇HDFS API编程 (Windows eclipse Java工程),是用普通的java工程手动导入相关的jar包来完成的。这次博客改用Maven工程,通过Maven来管理相关的jar包,只需要添加相关依赖,便自动完成相关jar包的下载与导入。
前提条件:
Windows系统下安装好eclipse
步骤:
新建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!