设为首页 收藏本站
查看: 1738|回复: 0

[经验分享] JAVA操作HDFS API(hadoop)

[复制链接]

尚未签到

发表于 2015-7-11 09:29:59 | 显示全部楼层 |阅读模式
HDFS API详解
  Hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,这些API能够支持的操作包含:打开文件,读写文件,删除文件等。
  Hadoop类库中最终面向用户提供的接口类FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。get方法存在几个重载版本,常用的是这个:
  
  static FileSystem get(Configuration conf);
  
  该类封装了几乎所有的文件操作,例如mkdir,delete等。综上基本上可以得出操作文件的程序库框架:
  
  operator()
  {
  得到Configuration对象
  得到FileSystem对象
  进行文件操作
  }
  
6.1 上传本地文件
  通过"FileSystem.copyFromLocalFile(Path src,Patch dst)"可将本地文件上传HDFS的制定位置上,其中src和dst均为文件的完整路径。具体事例如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileStatus;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class CopyFile {
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
        
          //本地文件
          Path src =new Path("D:\\HebutWinOS");
          //HDFS为止
          Path dst =new Path("/");
        
          hdfs.copyFromLocalFile(src, dst);
          System.out.println("Upload to"+conf.get("fs.default.name"));
        
          FileStatus files[]=hdfs.listStatus(dst);
          for(FileStatus file:files){
              System.out.println(file.getPath());
          }
      }
  }
  
  运行结果可以通过控制台、项目浏览器和SecureCRT查看,如图6-1-1、图6-1-2、图6-1-3所示。
    1)控制台结果
  
DSC0000.png
  图6-1-1 运行结果(1)
    2)项目浏览器
  
DSC0001.png
  图6-1-2 运行结果(2)
    3)SecureCRT结果
  
DSC0002.png
  图6-1-3 运行结果(3)
6.2 创建HDFS文件
  通过"FileSystem.create(Path f)"可在HDFS上创建文件,其中f为文件的完整路径。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FSDataOutputStream;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class CreateFile {
  
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
        
          byte[] buff="hello hadoop world!\n".getBytes();
        
          Path dfs=new Path("/test");
        
          FSDataOutputStream outputStream=hdfs.create(dfs);
          outputStream.write(buff,0,buff.length);
        
      }
  }
  
  运行结果如图6-2-1和图6-2-2所示。
    1)项目浏览器
  
DSC0003.png
  图6-2-1 运行结果(1)
    2)SecureCRT结果
  
DSC0004.png
  图6-2-2 运行结果(2)
6.3 创建HDFS目录
  通过"FileSystem.mkdirs(Path f)"可在HDFS上创建文件夹,其中f为文件夹的完整路径。具体实现如下:
  
  package com.hebut.dir;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class CreateDir {
  
      public static void main(String[] args) throws Exception{
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
        
          Path dfs=new Path("/TestDir");
        
          hdfs.mkdirs(dfs);
  
      }
  }
  
  运行结果如图6-3-1和图6-3-2所示。
    1)项目浏览器
  
DSC0005.png
  图6-3-1 运行结果(1)
    2)SecureCRT结果
  
DSC0006.png
  图6-3-2 运行结果(2)
6.4 重命名HDFS文件
  通过"FileSystem.rename(Path src,Path dst)"可为指定的HDFS文件重命名,其中src和dst均为文件的完整路径。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class Rename{
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
  
          Path frpaht=new Path("/test");    //旧的文件名
          Path topath=new Path("/test1");    //新的文件名
        
          boolean isRename=hdfs.rename(frpaht, topath);
        
          String result=isRename?"成功":"失败";
          System.out.println("文件重命名结果为:"+result);
        
      }
  }
  
  运行结果如图6-4-1和图6-4-2所示。
    1)项目浏览器
  
DSC0007.png
  图6-4-1 运行结果(1)
  2)SecureCRT结果
  
DSC0008.png
  图6-4-2 运行结果(2)
6.5 删除HDFS上的文件
  通过"FileSystem.delete(Path f,Boolean recursive)"可删除指定的HDFS文件,其中f为需要删除文件的完整路径,recuresive用来确定是否进行递归删除。具体实现如下:
  
  package com.hebut.file;
  
  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();
          FileSystem hdfs=FileSystem.get(conf);
        
          Path delef=new Path("/test1");
        
          boolean isDeleted=hdfs.delete(delef,false);
          //递归删除
          //boolean isDeleted=hdfs.delete(delef,true);
          System.out.println("Delete?"+isDeleted);
      }
  }
  
  运行结果如图6-5-1和图6-5-2所示。
    1)控制台结果
  
DSC0009.png
  图6-5-1 运行结果(1)
  2)项目浏览器
DSC00010.png
  图6-5-2 运行结果(2)
6.6 删除HDFS上的目录
  同删除文件代码一样,只是换成删除目录路径即可,如果目录下有文件,要进行递归删除。
6.7 查看某个HDFS文件是否存在
  通过"FileSystem.exists(Path f)"可查看指定HDFS文件是否存在,其中f为文件的完整路径。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class CheckFile {
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
          Path findf=new Path("/test1");
          boolean isExists=hdfs.exists(findf);
          System.out.println("Exist?"+isExists);
      }
  }
  
  运行结果如图6-7-1和图6-7-2所示。
    1)控制台结果
  
DSC00011.png
  图6-7-1 运行结果(1)
    2)项目浏览器
  
DSC00012.png
  图6-7-2 运行结果(2)
6.8 查看HDFS文件的最后修改时间
  通过"FileSystem.getModificationTime()"可查看指定HDFS文件的修改时间。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileStatus;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class GetLTime {
  
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
        
          Path fpath =new Path("/user/hadoop/test/file1.txt");
        
          FileStatus fileStatus=hdfs.getFileStatus(fpath);
          long modiTime=fileStatus.getModificationTime();
        
          System.out.println("file1.txt的修改时间是"+modiTime);
      }
  }
  
  运行结果如图6-8-1所示。
  
DSC00013.png
  图6-8-1 控制台结果
6.9 读取HDFS某个目录下的所有文件
  通过"FileStatus.getPath()"可查看指定HDFS中某个目录下所有文件。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.FileStatus;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class ListAllFile {
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
        
          Path listf =new Path("/user/hadoop/test");
        
          FileStatus stats[]=hdfs.listStatus(listf);
          for(int i = 0; i < stats.length; ++i)
       {
         System.out.println(stats.getPath().toString());
       }
          hdfs.close();
      }
  }
  
  运行结果如图6-9-1和图6-9-2所示。
    1)控制台结果
  
DSC00014.png
  图6-9-1 运行结果(1)
  
    2)项目浏览器
  
DSC00015.png
  图6-9-2 运行结果(2)
6.10 查找某个文件在HDFS集群的位置
  通过"FileSystem.getFileBlockLocation(FileStatus file,long start,long len)"可查找指定文件在HDFS集群上的位置,其中file为文件的完整路径,start和len来标识查找文件的路径。具体实现如下:
  
  package com.hebut.file;
  
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.BlockLocation;
  import org.apache.hadoop.fs.FileStatus;
  import org.apache.hadoop.fs.FileSystem;
  import org.apache.hadoop.fs.Path;
  
  public class FileLoc {
      public static void main(String[] args) throws Exception {
          Configuration conf=new Configuration();
          FileSystem hdfs=FileSystem.get(conf);
          Path fpath=new Path("/user/hadoop/cygwin");
        
          FileStatus filestatus = hdfs.getFileStatus(fpath);
          BlockLocation[] blkLocations = hdfs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
  
          int blockLen = blkLocations.length;
          for(int i=0;i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85403-1-1.html 上篇帖子: Hadoop学习笔记(2) ——解读Hello World 下篇帖子: [大牛翻译系列]Hadoop(2)MapReduce 连接:复制连接(Replication join)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表