zoukankan      html  css  js  c++  java
  • HDFS文件系统的JAVA-API操作(一)

    HDFS文件系统的JAVA-API操作(一)

    使用java.net.URL访问HDFS文件系统

     HDFS的API使用说明:
      1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件
      也就是hdfs-site.xml,从而读取Namenode的信息。
      2.每个应用程序也必须拥有访问Hadoop程序的jar文件
      3.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem

     
     
    初始化配置参数据需注意的如下init方法红色标注的地方
        public void init() throws Exception {
            // 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI
            // 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址
            // new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml
            // 然后再加载classpath下的hdfs-site.xml
            Configuration conf = new Configuration();
            //conf.set("fs.defaultFS", "hdfs://hdp-node01:9000");
            /**
             * 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置
             */
            //conf.set("dfs.replication", "3");
    
            // 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例
            // fs = FileSystem.get(conf);
    
            // 如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户
            fs = FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf, "hadoop");
        }

     实例1:使用java.net.URL访问HDFS文件系统

    /**

    * 操作:显示HDFS文件夹中的文件内容
    * 1.使用java.net.URL对象打开数据流
    * 2.使用静态代码块使得java程序识别Hadoop的HDFS url
    */

    操作代码如下:

    复制代码
     1 package TestHdfs;
     2 import java.io.InputStream;
     3 import java.net.URL;
     4 import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
     5 import org.apache.hadoop.io.IOUtils;
     6 /**
     7  * @author SimonsZhao
     8  * HDFS的API使用
     9  * 1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件
    10  * 也就是hdfs-site.xml,从而读取Namenode的信息。
    11  * 2.每个应用程序也必须拥有访问Hadoop程序的jar文件
    12  * 3.操作HDFS,也就是HDFS的读和写,最常用的类FileSystem
    13  * 操作:显示HDFS文件夹中的文件内容
    14  * 1.使用java.net.URL对象打开数据流
    15  * 2.使用静态代码块使得java程序识别Hadoop的HDFS url
    16  */
    17 public class MyCat {
    18     static{
    19         URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    20     }
    21     public static void main(String[] args) {
    22         InputStream input=null;
    23         try {
    24             input = new URL(args[0]).openStream();
    25             IOUtils.copyBytes(input,System.out,4096,false);
    26         } catch (Exception e) {
    27             System.err.println("Error");
    28         }finally{
    29             IOUtils.closeStream(input);
    30         }
    31     }
    32 }
    复制代码

    0.打包程序并长传到Linux中

            a.通过export导出文件jar包

            

            

             b.选择jar包存放路径

             

            

            c.指定主类

             

            

            d.通过SecureCRT上传jar包至Linux中的指定文件夹下。

             

       1.在指定文件夹下创建示例文件demo

        [root@neusoft-master filecontent]# vi demo

        

      2.上传文件至HDFS的data目录,data目录需要首先创建。

         [root@neusoft-master filecontent]# hadoop dfs -put demo /data/

        

           3.查看是否上传成功

               [root@neusoft-master filecontent]# hadoop dfs -ls /data/

               

         4.将已经打包好的jar文件上传至linux并切换到相应文件夹运行hadoop命令执行

               从结果可以看出能够显示出来demo文件的内容

              [root@neusoft-master filecontent]# hadoop jar MyCat.jar hdfs://neusoft-master:9000/data/demo

              

     实例2:使用FileSystem访问HDFS文件系统

        /**
        *操作:将本地文件系统的文件通过java-API写入到HDFS文件
        */

        1.本地文件系统和HDFS中应该首先创建指定的目录

        linux中创建文件命令:mkdir test

        HDFS中创建文件夹命令:hadoop dfs -mkdir /data/

    String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据,这里存储了一行英语句子,如welcome to.....
    String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑

         2.程序源代码

    复制代码
     1 package TestHdfs;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.FileInputStream;
     5 import java.io.FileNotFoundException;
     6 import java.io.InputStream;
     7 import java.io.OutputStream;
     8 import java.net.URI;
     9 
    10 import org.apache.hadoop.conf.Configuration;
    11 import org.apache.hadoop.fs.FSDataOutputStream;
    12 import org.apache.hadoop.fs.FileSystem;
    13 import org.apache.hadoop.fs.Path;
    14 import org.apache.hadoop.io.IOUtils;
    15 
    16 /**
    17  * @author SimonsZhao
    18  *将本地文件系统的文件通过java-API写入到HDFS文件
    19  */
    20 public class FileCopyFromLocal {
    21     public static void main(String[] args) throws Exception {
    22         String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据
    23         String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
    24         InputStream in = new BufferedInputStream(new FileInputStream(source));
    25         //HDFS读写的配置文件
    26         Configuration conf = new Configuration();
    27         //调用Filesystem的create方法返回的是FSDataOutputStream对象
    28         //该对象不允许在文件中定位,因为HDFS只允许一个已打开的文件顺序写入或追加
    29         FileSystem fs = FileSystem.get(URI.create(destination),conf);
    30         OutputStream out = fs.create(new Path(destination));
    31         IOUtils.copyBytes(in, out, 4096, true);
    32     }
    33 }
    复制代码

        3.程序打包并传至linux文件系统中

         请参考实例1的打包过程

        4.程序运行及结果分析

         a.查看指定jar包是否成功上传,在linux中使用ls或ll命令

         b.执行jar命令

     [root@neusoft-master filecontent]# hadoop jar FileSystemDemoCat.jar 

        

         c.结果显示welcome to....说明操作正确

     实例3:创建HDFS目录

      * 创建HDFS目录
      * 实例:HDFS创建test2目录   

         1.明确在HDFS文件系统中创建目录的具体地址,在程序中通过args[0]参数提供用户输入,如

    hdfs://neusoft-master:9000/data/test2

         2.程序源代码

    复制代码
     1 package TestHdfs;
     2 import java.net.URI;
     3 import org.apache.hadoop.conf.Configuration;
     4 import org.apache.hadoop.fs.FileSystem;
     5 import org.apache.hadoop.fs.Path;
     6 /**
     7  * @author SimonsZhao
     8  * 创建HDFS目录
     9  * 实例:HDFS创建test2目录
    10  * hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2
    11  */
    12 public class CreateDirction {
    13     public static void main(String[] args) {
    14         //HDFS路径:hdfs://neusoft-master:9000/data/test2
    15         String uri=args[0];//从键盘输入路径参数
    16         Configuration conf = new Configuration();
    17         try {
    18             FileSystem fs = FileSystem.get(new URI(uri),conf);
    19             Path dfs = new Path(uri);
    20             fs.mkdirs(dfs);
    21         } catch (Exception e) {
    22             e.printStackTrace();
    23         }finally{
    24             System.out.println("SUCESS");
    25         }
    26     }
    27 }
    复制代码

        3.将jar包上传到Linux

             请参考第一个程序的导出jar包的过程。 

        4.程序运行及结果分析

    [root@neusoft-master filecontent]# hadoop jar CreateDir.jar hdfs://neusoft-master:9000/data/test2

        

     实例4:删除HDFS目录   

    复制代码
     1 package TestHdfs;
     2 import java.net.URI;
     3 import org.apache.hadoop.conf.Configuration;
     4 import org.apache.hadoop.fs.FileSystem;
     5 import org.apache.hadoop.fs.Path;
     6 /**
     7  * @author SimonsZhao
     8  * 删除HDFS上面的文件
     9  */
    10 public class DeleteFile {
    11     public static void main(String[] args) {
    12         String uri="hdfs://neusoft-master:9000/data/test2";
    13         Configuration conf = new Configuration();
    14         try {
    15             FileSystem fs =FileSystem.get(new URI(uri), conf);
    16             Path f = new Path(uri);
    17             //递归删除文件夹下所有文件
    18             boolean isDelete= fs.delete(f, true);
    19             //递归删除文件夹下所有文件
    20             //boolean isDelete= fs.delete(f, false);
    21             String str=isDelete?"Sucess":"Error";
    22             System.out.println("删除"+str);
    23         } catch (Exception e) {
    24             System.out.println("删除出错~");
    25         }
    26     }
    27 }
    复制代码

        3.将jar包上传到Linux

             请参考第一个程序的导出jar包的过程。 

        4.程序运行及结果分析

           执行程序之后,通过hadoop dfs -ls / 查看是否成功删除HDFS上面的文件

    实例5:查看文件或目录是否存在

    复制代码
     1 package TestHdfs;
     2 import java.net.URI;
     3 import org.apache.hadoop.conf.Configuration;
     4 import org.apache.hadoop.fs.FileSystem;
     5 import org.apache.hadoop.fs.Path;
     6 /**
     7  * @author SimonsZhao
     8  * 查看文件是否存在
     9  */
    10 public class CheckFileIsExists {
    11     public static void main(String[] args) {
    12         //String uri="hdfs://neusoft-master:9000/data/test2/";//指定目录
    13         String uri="hdfs://neusoft-master:9000/data/test2/hello";//指定文件
    14         Configuration conf = new Configuration();
    15         try {
    16             FileSystem fs = FileSystem.get(new URI(uri), conf);
    17             Path path = new Path(uri);
    18             boolean isExists=fs.exists(path);
    19             String str=isExists?"Exists":"Not Exists";
    20             System.out.println("指定文件或目录"+str);
    21         } catch (Exception e) {
    22             e.printStackTrace();
    23         }
    24     }
    25 }
    复制代码

      3.将jar包上传到Linux

             请参考第一个程序的导出jar包的过程。 

        4.程序运行及结果分析

         如果在linux中存在该文件的话,则显示如下:

         “指定文件或目录Exists”

    实例6:列出目录下的文件或目录名称 

    复制代码
     1 package TestHdfs;
     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 /**
     8  * @author SimonsZhao
     9  * 列出目录下的文件或目录名称
    10  */
    11 public class ListFiles {
    12 public static void main(String[] args) {
    13     String uri="hdfs://neusoft-master:9000/data";
    14     Configuration conf = new Configuration();
    15     try {
    16         FileSystem fs=FileSystem.get(new URI(uri), conf);
    17         Path path = new Path(uri);
    18         FileStatus status[] = fs.listStatus(path);
    19         for (int i = 0; i < status.length; i++) {
    20             System.out.println(status[i].getPath().toString());
    21         }
    22     } catch (Exception e) {
    23         e.printStackTrace();
    24     }
    25 }
    26 }
    复制代码

        3.将jar包上传到Linux

             请参考第一个程序的导出jar包的过程。 

        4.程序运行及结果分析

        

    实例7:查看文件存储位置

    复制代码
     1 package TestHdfs;
     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 
     9 /**
    10  * @author SimonsZhao
    11  * 文件存储的位置
    12  */
    13 public class LoactionFile {
    14     public static void main(String[] args) {
    15         String uri="hdfs://neusoft-master:9000/data/demo";//hello为文件
    16         Configuration conf = new Configuration();
    17         try {
    18             FileSystem fs=FileSystem.get(new URI(uri), conf);
    19             Path path = new Path(uri);
    20             FileStatus fileStatus = fs.getFileStatus(path);
    21             BlockLocation blkLocation[]=
    22                     fs.getFileBlockLocations
    23                     (fileStatus, 0, fileStatus.getLen());
    24             for (int i = 0; i < blkLocation.length; i++) {
    25                 String[] hosts=blkLocation[i].getHosts();
    26                 System.out.println("block_"+i+"_Location:"+hosts[0]);
    27             }
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30         }
    31     }
    32 }
    复制代码

        3.将jar包上传到Linux

             请参考第一个程序的导出jar包的过程。 

        4.程序运行及结果分析

         由于采用伪分布的环境block块存储均为1,因此这里仅显示1个block块的host主机名

         显示:block_0_Location:neusoft-master

    实例8:将本地文件写入到HDFS中

    复制代码
     1 package TestHdfs;
     2 import java.io.BufferedInputStream;
     3 import java.io.FileInputStream;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.URI;
     7 import org.apache.hadoop.conf.Configuration;
     8 import org.apache.hadoop.fs.FileSystem;
     9 import org.apache.hadoop.fs.Path;
    10 import org.apache.hadoop.io.IOUtils;
    11 
    12 /**
    13  * @author SimonsZhao
    14  *将本地文件系统的文件通过java-API写入到HDFS文件
    15  */
    16 public class FileCopyFromLocal {
    17     public static void main(String[] args) throws Exception {
    18         String source="/usr/local/filecontent/demo";//linux中的文件路徑,demo存在一定数据
    19         String destination="hdfs://neusoft-master:9000/data/test";//HDFS的路徑
    20         InputStream in = new BufferedInputStream(new FileInputStream(source));
    21         //HDFS读写的配置文件
    22         Configuration conf = new Configuration();
    23         //调用Filesystem的create方法返回的是FSDataOutputStream对象
    24         //该对象不允许在文件中定位,因为HDFS只允许一个已打开的文件顺序写入或追加
    25         FileSystem fs = FileSystem.get(URI.create(destination),conf);
    26         OutputStream out = fs.create(new Path(destination));
    27         IOUtils.copyBytes(in, out, 4096, true);
    28     }
    29 }
    复制代码
  • 相关阅读:
    response输出随机图片、定时刷新网页
    @Transactional注解使用心得
    mybatis缓存(一,二级别)
    数据库四大特性及数据库隔离级别
    mybatis @SelectKey加于不加的区别
    MYSQL索引类型+索引方法
    页面缓存例子
    概率生成模型超越神经网络
    生成学习
    过程量与状态量
  • 原文地址:https://www.cnblogs.com/lianxuan1768/p/8136338.html
Copyright © 2011-2022 走看看