HDFS开发实例
1、列出HDFS中的文件
1 package com.hdfs.test; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.net.URI; 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.fs.FSDataInputStream; 10 import org.apache.hadoop.fs.FileStatus; 11 import org.apache.hadoop.fs.FileSystem; 12 import org.apache.hadoop.fs.FileUtil; 13 import org.apache.hadoop.fs.Path; 14 15 public class AccessHdfs { 16 public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{ 17 18 //以下两句仅用于在windows下访问服务器中的HDFS时,解决特定的错误问题 19 System.setProperty("hadoop.home.dir", "C:/Users/learn/Desktop/hadoopfiles"); 20 System.setProperty("HADOOP_USER_NAME","hadoop"); 21 22 Configuration conf = new Configuration(); 23 24 //conf.set("fs.defaultFS", "hdfs://192.168.1.215:9000"); 25 //FileSystem fS = FileSystem.get(conf); 26 //如果不在conf中设置,可以这样写: 27 FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); 28 29 //列出目录 30 String dir = "/"; 31 FileStatus[] fileStatus = fS.listStatus(new Path(dir)); 32 Path[] list = FileUtil.stat2Paths(fileStatus); 33 for(Path path : list){ 34 System.out.println(path.toString()); 35 } 36 fS.close(); 37 } 38 39 }
注:
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、创建目录与删除目录
1 Configuration conf = new Configuration(); 2 FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); 3 4 //创建目录 5 fS.mkdirs(new Path("TestData")); 6 fS.mkdirs(new Path("/DataWorld")); 7 8 //删除目录,如果是空的路径,可以忽略第二个参数 9 fS.delete(new Path("TestData"),true); 10 11 fS.close();
注意上传的路径,如果没有指定根目录,则是/user/用户名/目录名
3、上传文件与读取文件
1 Configuration conf = new Configuration(); 2 FileSystem fS = FileSystem.get(URI.create("hdfs://192.168.1.215:9000"), conf); 3 4 //上传文件 5 Path src = new Path("C:/Users/learn/Desktop/hadoopfiles/Test.txt"); 6 Path dst = new Path("TestData"); 7 fS.copyFromLocalFile(src, dst); 8 9 //读取文件 10 String filedir = "TestData/Test.txt"; 11 FSDataInputStream file = fS.open(new Path(filedir)); 12 BufferedReader in = null; 13 String line; 14 in =new BufferedReader(new InputStreamReader(file, "UTF-8")); 15 while ((line = in.readLine()) != null) { 16 System.out.println(line); 17 } 18 if(in !=null){ 19 in.close(); 20 }
也可以打包成jar文件运行