分享

Java操作HDFS错误总结

本帖最后由 pig2 于 2013-12-26 22:28 编辑

1.png


1.HDFS操作-查:   




   1)遍历HDFS文件,基于hadoop-0.20.2:
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileStatus;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. public class Query {
  7.         private static FileSystem hdfs;
  8.         public static void main(String[] args) throws Exception {
  9.                 // 1.创建配置器
  10.                 Configuration conf = new Configuration();
  11.                 // 2.创建文件系统
  12.                 hdfs = FileSystem.get(conf);
  13.                 // 3.遍历HDFS上的文件和目录
  14.                 FileStatus[] fs = hdfs.listStatus(new Path("/home"));
  15.                 if (fs.length > 0) {
  16.                         for (FileStatus f : fs) {
  17.                                 showDir(f);
  18.                         }
  19.                 }
  20.         }
  21.         private static void showDir(FileStatus fs) throws Exception {
  22.                 Path path = fs.getPath();
  23.                 System.out.println(path);
  24.       // 如果是目录
  25.                 if (fs.isDir()) {
  26.                         FileStatus[] f = hdfs.listStatus(path);
  27.                         if (f.length > 0) {
  28.                                 for (FileStatus file : f) {
  29.                                         showDir(file);
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34. }
复制代码

错误1  
              

类包找不到   
               
2.png   





        解决:
              因为这是个Java Project,即使在window -> preferences -> Hadoop Map/Reduce中配置了hadoop解压目录也不能自动导入jar包。
              须要手动引入以下jar包,Build Path ,Add to Build Path:
              hadoop-core-1.1.2.jar   
              commons-lang-2.4.jar   
              jackson-core-asl-1.8.8.jar   
              jackson-mapper-asl-1.8.8.jar   
              commons-logging-1.1.1.jar   
              commons-configuration-1.6.jar  


   3.png   


   2)Run on Hadoop:                

4.png          


错误2  
               

此时实际搜索的是Ubuntu的目录。并且层级目录中可能含有特殊字符导致URI错误。

                x5.png
                     





    解决:
                上面的代码是基于hadoop-0.20.2写的,不再适用于hadoop-1.1.2。改。  
                6.png






3)遍历HDFS文件,基于Hadoop-1.1.2一:

  1. <font color="rgb(51, 51, 51)"><font face="Verdana, sans-serif, 宋体"><font style="font-size: 13px">package cn.cvu.hdfs;
  2. //导包略  
  3. public class Query {
  4.         private static FileSystem hdfs;
  5.         public static void main(String[] args) throws Exception {
  6.                 // 1.创建配置器
  7.                 Configuration conf = new Configuration();
  8.                 // 2.创建文件系统(指定为HDFS文件系统到URI)  
  9.                 hdfs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);  
  10.                 // 3.遍历HDFS上的文件和目录
  11.                 FileStatus[] fs = hdfs.listStatus(new Path("/home"));
  12.                 if(fs.length>0){
  13.                         for (FileStatus f : fs) {
  14.                                 showDir(f);
  15.                         }
  16.                 }
  17.         }
  18.         private static void showDir(FileStatus fs) throws Exception {
  19.                 //递归略   
  20.         }
  21. }</font></font></font>
复制代码
7.1.png    




   4)遍历HDFS文件,基于Hadoop-1.1.2二:
  1. public static void main(String[] args) throws Exception {
  2.         // 1.创建配置器
  3.         Configuration conf = new Configuration();
  4.   // 2.加载指定的配置文件
  5.         conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));  
  6.         // 3.创建文件系统
  7.         hdfs = FileSystem.get(conf);
  8.         // 4.遍历HDFS上的文件和目录
  9.         FileStatus[] fs = hdfs.listStatus(new Path("/home"));
  10.         if (fs.length > 0) {
  11.                 for (FileStatus f : fs) {
  12.                         showDir(f);
  13.                 }
  14.         }
  15. }
复制代码
7.2.png   





   5)判断HDFS中指定名称的目录或文件:
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileStatus;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. public class Query {
  7.         private static FileSystem hdfs;
  8.         public static void main(String[] args) throws Exception {
  9.                 // 1.配置器
  10.                 Configuration conf = new Configuration();
  11.                 conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  12.                 // 2.文件系统
  13.                 hdfs = FileSystem.get(conf);
  14.                 // 3.遍历HDFS上目前拥有的文件和目录
  15.                 FileStatus[] fs = hdfs.listStatus(new Path("/home"));
  16.                 if (fs.length > 0) {
  17.                         for (FileStatus f : fs) {
  18.                                 showDir(f);
  19.                         }
  20.                 }
  21.         }
  22.         private static void showDir(FileStatus fs) throws Exception {
  23.                 Path path = fs.getPath();
  24.                 // 如果是目录
  25.                 if (fs.isDir()) {
  26.                         if (path.getName().equals("system")) {
  27.                                 System.out.println(path + "是目录");
  28.                         }
  29.                         FileStatus[] f = hdfs.listStatus(path);
  30.                         if (f.length > 0) {
  31.                                 for (FileStatus file : f) {
  32.                                         showDir(file);
  33.                                 }
  34.                         }
  35.                 } else {
  36.                         if (path.getName().equals("system")) {
  37.                                 System.out.println(path + "是文件");
  38.                         }
  39.                 }
  40.         }
  41. }
复制代码
7.png




   6)查看HDFS文件的最后修改时间:   
  1. package cn.cvu.hdfs;
  2. import java.net.URI;
  3. import java.util.Date;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.FileStatus;
  6. import org.apache.hadoop.fs.FileSystem;
  7. import org.apache.hadoop.fs.Path;
  8. public class Query2 {
  9.         private static FileSystem hdfs;
  10.         public static void main(String[] args) throws Exception {
  11.                 // 1.创建配置器
  12.                 Configuration conf = new Configuration();
  13.                 // 2.创建文件系统(指定为HDFS文件系统到URI)
  14.                 hdfs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);
  15.                 // 3.列出HDFS上目前拥有的文件和目录
  16.                 FileStatus[] fs = hdfs.listStatus(new Path("/home"));
  17.                 if(fs.length>0){
  18.                         for (FileStatus f : fs) {
  19.                                 showDir(f);
  20.                         }
  21.                 }
  22.         }
  23.         private static void showDir(FileStatus fs) throws Exception {
  24.                 Path path = fs.getPath();
  25.                 //获取最后修改时间
  26.                 long time = fs.getModificationTime();   
  27.                 System.out.println("HDFS文件的最后修改时间:"+new Date(time));   
  28.                 System.out.println(path);
  29.                 if (fs.isDir()) {
  30.                         FileStatus[] f = hdfs.listStatus(path);
  31.                         if(f.length>0){
  32.                                 for (FileStatus file : f) {
  33.                                         showDir(file);
  34.                                 }
  35.                         }
  36.                 }
  37.         }
  38. }
复制代码
8.png


      7)查看HDFS中指定文件的状态:  
  1. package cn.cvu.hdfs;
  2. import java.net.URI;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.BlockLocation;
  5. import org.apache.hadoop.fs.FileStatus;
  6. import org.apache.hadoop.fs.FileSystem;
  7. import org.apache.hadoop.fs.Path;
  8. public class Query {
  9.         public static void main(String[] args) throws Exception {
  10.                 //1.配置器
  11.                 Configuration conf = new Configuration();
  12.                 conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  13.                 //2.文件系统
  14.                 FileSystem fs = FileSystem.get(conf);
  15.                 //3.已存在的文件
  16.                 Path path = new Path("/home/hm/hadoop-hm/mapred/system/jobtracker.info");
  17.                 //4.文件状态
  18.                 FileStatus status = fs.getFileStatus(path);
  19.                 //5.文件块
  20.                 BlockLocation[] blockLocations = fs.getFileBlockLocations(status, 0, status.getLen());
  21.                 int blockLen = blockLocations.length;
  22.                 System.err.println("块数量:"+blockLen);
  23.                 for (int i = 0; i < blockLen; i++) {
  24.                         // 主机名
  25.                         String[] hosts = blockLocations[i].getHosts();
  26.                         for (String host : hosts) {
  27.                                 System.err.println("主机:"+host);
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码
9.png   


  8)读取HDFS中txt文件的内容:   
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataInputStream;
  4. import org.apache.hadoop.fs.FileStatus;
  5. import org.apache.hadoop.fs.FileSystem;
  6. import org.apache.hadoop.fs.Path;
  7. public class Query {
  8.         public static void main(String[] args) throws Exception {
  9.                 Configuration conf = new Configuration();
  10.                 conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  11.                 FileSystem fs = FileSystem.get(conf);
  12.                 Path path = new Path("/test.txt");
  13.                 FSDataInputStream is = fs.open(path);
  14.                 FileStatus stat = fs.getFileStatus(path);
  15.                 byte[] buffer = new byte[Integer.parseInt(String.valueOf(stat.getLen()))];
  16.                 is.readFully(0, buffer);
  17.                 is.close();
  18.                 fs.close();
  19.                 System.out.println(new String(buffer));
  20.         }
  21. }
复制代码
10.png   



2.HDFS操作-增:  

   1)上传文件到HDFS,基于hadoop-0.20.2:  
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileStatus;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. public class TestHdfs {
  7.         public static void main(String[] args) throws Exception {
  8. // 1.创建配置器  
  9.                 Configuration conf = new Configuration();  
  10. // 2.创建文件系统  
  11.                 FileSystem hdfs = FileSystem.get(conf);  
  12. // 3.创建可供hadoop使用的文件系统路径  
  13. Path src = new Path("/home/hm/test.txt"); //本地目录/文件  
  14.                 Path dst = new Path("/home");  //目标目录/文件
  15. // 4.拷贝本地文件上传(本地文件,目标路径)  
  16.                 hdfs.copyFromLocalFile(src, dst);  
  17.                 System.err.println("文件上传成功至:" + conf.get("fs.default.name"));  
  18.                 // 5.列出HDFS上的文件  
  19.                 FileStatus[] fs = hdfs.listStatus(dst);  
  20.                 for (FileStatus f : fs) {   
  21.                         System.err.println(f.getPath());  
  22.                 }  
  23.         }  
  24. }
复制代码
错误:
                目标路径的操作权限不够,因为这实际是Ubuntu的/home目录!

Exception in thread "main" java.io.FileNotFoundException: /home/test.txt (Permission denied 权限不够)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.<init>(RawLocalFileSystem.java:188)
at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.<init>(RawLocalFileSystem.java:184)
at org.apache.hadoop.fs.RawLocalFileSystem.create(RawLocalFileSystem.java:255)
at org.apache.hadoop.fs.RawLocalFileSystem.create(RawLocalFileSystem.java:236)
at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSOutputSummer.<init>(ChecksumFileSystem.java:335)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:381)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:364)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:555)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:536)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:443)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:229)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:163)
at org.apache.hadoop.fs.LocalFileSystem.copyFromLocalFile(LocalFileSystem.java:67)
at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1143)         

        解决:
                上传到有权限的目录(囧)   
11.png

   



     结果:
                实际是上传到了Ubuntu的/home/hm/hadoop-hm目录中!  

x12.png    


   2)上传文件到HDFS,基于hadoop-1.1.2一:
  1. package cn.cvu.hdfs;
  2. import java.net.URI;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.FileStatus;
  5. import org.apache.hadoop.fs.FileSystem;
  6. import org.apache.hadoop.fs.Path;
  7. public class TestHdfs1 {
  8.         private static FileSystem hdfs;
  9.         public static void main(String[] args) throws Exception {
  10.                 //1.创建配置器
  11.                 Configuration conf = new Configuration();
  12.                 //2.初始化文件系统(指定为HDFS文件系统URI,配置)
  13.                 hdfs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);
  14.                 //3.创建本地目录/文件路径
  15.                 Path src = new Path("/home/hm/test.txt");
  16.                 //4.创建HDFS目录(指定为HDFS文件系统)
  17.                 Path dst = new Path("hdfs://localhost:9000//home/hm/hadoop-hm");
  18.                 //5.执行上传
  19.                 hdfs.copyFromLocalFile(src, dst);
  20.                 System.out.println("文件上传成功至:" + conf.get("fs.default.name"));
  21.                 //6.遍历HDFS目录
  22.                 FileStatus[] list = hdfs.listStatus(dst);
  23.                 for (FileStatus f : list) {
  24.                         showDir(f);
  25.                 }
  26.         }
  27.         private static void showDir(FileStatus f) throws Exception {
  28.                 if (f.isDir()) {
  29.                         System.err.println("目录:" + f.getPath());
  30.                         FileStatus[] listStatus = hdfs.listStatus(f.getPath());
  31.                         for (FileStatus fn : listStatus) {
  32.                                 showDir(fn);
  33.                         }
  34.                 } else {
  35.                         System.out.println("文件:" + f.getPath());
  36.                 }
  37.         }
  38. }
复制代码
12.png    


3)上传文件到HDFS,基于hadoop-1.1.2二:
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileStatus;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. public class TestHdfs2 {
  7.         private static FileSystem hdfs;
  8.         public static void main(String[] args) throws Exception {
  9.                 //1. 创建配置器
  10.                 Configuration conf = new Configuration();
  11.                 //2. 手动加载配置
  12.                 conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  13.                 //3. 创建文件系统
  14.                 hdfs = FileSystem.get(conf);
  15.                 //4. 本地文件
  16.                 Path src = new Path("/home/hm/test.txt");
  17.                 //5. 目标路径
  18.                 Path dst = new Path("/home");
  19.                 //6. 上传文件
  20.                 if(!hdfs.exists(new Path("/home/test.txt"))){
  21.                         hdfs.copyFromLocalFile(src, dst);
  22.                         System.err.println("文件上传成功至: " + conf.get("fs.default.name"));
  23.                 }else{
  24.                         System.err.println(conf.get("fs.default.name") + " 中已经存在 test.txt");
  25.                 }
  26.                 //7. 遍历HDFS文件
  27.                 System.out.println("\nHDFS文件系统中存在的目录和文件:");
  28.                 FileStatus[] fs = hdfs.listStatus(dst);
  29.                 for (FileStatus f : fs) {
  30.                         showDir(f);
  31.                 }
  32.         }
  33.         private static void showDir(FileStatus f) throws Exception{
  34.                 if(f.isDir()){
  35.                         System.err.println("目录:" + f.getPath());
  36.                         FileStatus[] listStatus = hdfs.listStatus(f.getPath());
  37.                         for(FileStatus fn : listStatus){
  38.                                 showDir(fn);
  39.                         }
  40.                 }else{
  41.                         System.err.println("文件:" + f.getPath());
  42.                 }
  43.         }
  44. }
复制代码
13.png    

14.png   
15.png   

  4)在HDFS中创建目录和文件:  
  1. package cn.cvu.hdfs;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FSDataOutputStream;
  4. import org.apache.hadoop.fs.FileStatus;
  5. import org.apache.hadoop.fs.FileSystem;
  6. import org.apache.hadoop.fs.Path;
  7. public class TestHdfs2 {
  8.         public static void main(String[] args) throws Exception {
  9.                 Configuration conf = new Configuration();
  10.                 conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  11.                 FileSystem hdfs = FileSystem.get(conf);
  12.                 // 使用HDFS数据输出流(写)对象 在HDSF上根目录创建一个文件夹,其内再创建文件
  13.                 FSDataOutputStream out = hdfs.create(new Path("/eminem/hip-hop.txt"));
  14.                 // 在文件中写入一行数据,必须使用UTF-8
  15.                 //out.writeUTF("Hell使用UTF-8");        //不能用?
  16.                 out.write("痞子阿姆,Hello !".getBytes("UTF-8"));
  17.                 out = hdfs.create(new Path("/alizee.txt"));
  18.                 out.write("艾莉婕,Hello !".getBytes("UTF-8"));
  19.                 out.close();
  20.                 FileStatus[] fs = hdfs.listStatus(new Path("/"));
  21.                 for (FileStatus f : fs) {
  22.                         System.out.println(f.getPath());
  23.                 }
  24.         }
  25. }
复制代码
16.png

3.HDFS操作-改:   

    1)重命名文件:
  1. public static void main(String[] args) throws Exception {
  2.         Configuration conf = new Configuration();
  3.         conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  4.         FileSystem fs = FileSystem.get(conf);
  5.         //重命名:fs.rename(源文件,新文件)
  6.         boolean rename = fs.rename(new Path("/test.txt"), new Path("/new_test.txt"));
  7.         System.out.println(rename);
  8. }  
复制代码
    2)删除文件:
  1. public static void main(String[] args) throws Exception {
  2.         Configuration conf = new Configuration();
  3.         conf.addResource(new Path("/home/hm/hadoop-1.1.2/conf/core-site.xml"));
  4.         FileSystem fs = FileSystem.get(conf);
  5.         //删除
  6.         //fs.delete(new Path("/new_test.txt"));        //已过时
  7.         //程序结束时执行
  8.         boolean exit = fs.deleteOnExit(new Path("/new_test.txt"));
  9.         System.out.println("删除执行:"+exit);
  10.         //判断删除(路径,true。false=非空时不删除,抛RemoteException、IOException异常)
  11.         boolean delete = fs.delete(new Path("/test.txt"), true);
  12.         System.out.println("执行删除:"+delete);
  13. }  
复制代码




本帖被以下淘专辑推荐:

已有(2)人评论

跳转到指定楼层
tang 发表于 2015-4-5 16:15:47
回复

使用道具 举报

ldz001 发表于 2015-11-18 16:37:54
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条