HDFS开发实例

时间:2022-02-25 12:36:18

1、列出HDFS中的文件

 package com.hdfs.test;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path; public class AccessHdfs {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{ //以下两句仅用于在windows下访问服务器中的HDFS时,解决特定的错误问题
System.setProperty("hadoop.home.dir", "C:/Users/learn/Desktop/hadoopfiles");
System.setProperty("HADOOP_USER_NAME","hadoop"); Configuration conf = new Configuration(); //conf.set("fs.defaultFS", "hdfs://192.168.1.215:9000");
//FileSystem fS = FileSystem.get(conf);
//如果不在conf中设置,可以这样写:
FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); //列出目录
String dir = "/";
FileStatus[] fileStatus = fS.listStatus(new Path(dir));
Path[] list = FileUtil.stat2Paths(fileStatus);
for(Path path : list){
System.out.println(path.toString());
}
fS.close();
} }

注:

1> 如果出现了java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries 这种错误,可以通过设置设置HADOOP_HOME 环境变量来解决,在本例中,即使用System.setProperty("hadoop.home.dir", "C:/Users/learn/Desktop/hadoopfiles");这句代码,除此之外,还需要在设置的路径C:/Users/learn/Desktop/hadoopfiles中建立一个bin文件夹,并从网络上下载winutils.exe文件,放到这个bin文件夹中。至于所设置的路径,不必包含真正的hadoop文件。

2> System.setProperty("HADOOP_USER_NAME","hadoop");这句用于设置用户名,这是因为在linux中Hadoop系统的所有者被设置为hadoop用户,在windows下访问时可以这样显式的指定,如果没有指定,系统会将windows系统的当前用户作为访问Hadoop系统的用户,出现类似Permission denied的错误。

3> 当打包成jar文件时,以上两句是不需要的。

4> FileSystem用来获取文件系统的一个实例,FileStatus包含了文件中的元数据

2、创建目录与删除目录

 Configuration conf = new Configuration();
FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); //创建目录
fS.mkdirs(new Path("TestData"));
fS.mkdirs(new Path("/DataWorld")); //删除目录,如果是空的路径,可以忽略第二个参数
fS.delete(new Path("TestData"),true); fS.close();

 注意上传的路径,如果没有指定根目录,则是/user/用户名/目录名

HDFS开发实例

3、上传文件与读取文件

 Configuration conf = new Configuration();
FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); //上传文件
Path src = new Path("C:/Users/learn/Desktop/hadoopfiles/Test.txt");
Path dst = new Path("TestData");
fS.copyFromLocalFile(src, dst); //读取文件
String filedir = "TestData/Test.txt";
FSDataInputStream file = fS.open(new Path(filedir));
BufferedReader in = null;
String line;
in =new BufferedReader(new InputStreamReader(file, "UTF-8"));
while ((line = in.readLine()) != null) {
System.out.println(line);
}
if(in !=null){
in.close();
}

也可以打包成jar文件运行

HDFS开发实例