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

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

 实例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

    [[email protected] filecontent]# vi demo

    

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

     [[email protected] filecontent]# hadoop dfs -put demo /data/

    

       3.查看是否上传成功

           [[email protected] filecontent]# hadoop dfs -ls /data/

           

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

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

          [[email protected] 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命令

 [[email protected] 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.程序运行及结果分析

[[email protected] 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 }

    3.将jar包上传到Linux

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

    4.程序运行及结果分析

       将本地的demo文件写入HDFS的data目录下的test文件

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Hadoop伪分布安装详解(一)
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。