我是靠谱客的博主 灵巧哈密瓜,最近开发中收集的这篇文章主要介绍hadoop利用FileSystem API 执行hadoop文件读写操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


    Hadoop文件系统较普通的文件系统差异性主要在于其容错性,普通文件系统不能直接查看hadoop的hdfs对应的文件信息。文件存储起来之后,我们是需要可以访问才能够体现它的价值,hadoop提供了FileSystem API来进行hadoop的文件读写。

    本节我是对照hadoop的API中的FileSystem类写的demo,包含了一些主要的方法,更多的需要从相关api中进行查询编写。

[java]  view plain  copy
 print ?
  1. package org.apache.hadoop.wyg;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URI;  
  5.   
  6. import org.apache.hadoop.conf.Configuration;  
  7. import org.apache.hadoop.fs.FSDataOutputStream;  
  8. import org.apache.hadoop.fs.FileStatus;  
  9. import org.apache.hadoop.fs.FileSystem;  
  10. import org.apache.hadoop.fs.Path;  
  11. import org.junit.Test;  
  12.   
  13. public class FileSystemAPI {  
  14.     private static final String BASE_URL = "hdfs://192.168.88.128:9000";  
  15.     /** 
  16.      * 追加到文件 
  17.      * @throws IOException  
  18.      */  
  19.     @Test  
  20.     public void testAppend() throws IOException{  
  21.         Configuration conf= new Configuration();  
  22.         FileSystem fs = FileSystem.get(URI.create(BASE_URL+"/1.txt"),conf);  
  23.         fs.append(new Path(BASE_URL+"/user/root/input/2.txt"));  
  24.         System.out.println();  
  25.     }  
  26.     /**本地文件上传测试 
  27.      * @throws IOException 
  28.      */  
  29.     @Test  
  30.     public void testCopyFromLocalFile() throws IOException{  
  31.         Configuration conf = new Configuration();  
  32.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  33.         fs.copyFromLocalFile(new Path("C:\Users\lenovo\Desktop\3.txt"), new Path(BASE_URL+"/user/root/input"));  
  34.     }  
  35.     /**从hdfs下载文件到本地 
  36.      * @throws IOException 
  37.      */  
  38.     @Test  
  39.     public void testCopyToLocalFile() throws IOException{  
  40.         Configuration conf = new Configuration();  
  41.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  42.         fs.copyToLocalFile(new Path(BASE_URL+"/user/root/input/3.txt"), new Path("C:\Users\lenovo\Desktop\4.txt"));  
  43.     }  
  44.     /**测试文件创建 
  45.      * @throws IOException 
  46.      */  
  47.     @Test  
  48.     public void testCreate() throws IOException{  
  49.         Configuration conf = new Configuration();  
  50.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  51.         Path path = new Path("/user/root/input/4.txt");  
  52.         FSDataOutputStream out = fs.create(path,true);  
  53.         out.write("hello hadoop".getBytes());  
  54.     }  
  55.     /**创建空文件 
  56.      * @throws IOException 
  57.      */  
  58.     @Test  
  59.     public void testCreateNewFile() throws IOException{  
  60.         Configuration conf = new Configuration();  
  61.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  62.         Path path = new Path("/user/root/input/5.txt");  
  63.         fs.createNewFile(path);  
  64.     }  
  65.     /**删除文件 
  66.      * @throws IOException 
  67.      */  
  68.     @Test  
  69.     public void testDelete() throws IOException{  
  70.         Configuration conf = new Configuration();  
  71.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  72.         Path path = new Path("/user/root/input/5.txt");  
  73.         fs.delete(path);  
  74.     }  
  75.     /**文件是否存在 
  76.      * @throws IOException 
  77.      */  
  78.     @Test  
  79.     public void testExists() throws IOException{  
  80.         Configuration conf = new Configuration();  
  81.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  82.         Path path = new Path("/user/root/input/5.txt");  
  83.         System.out.println(fs.exists(path));  
  84.     }  
  85.     /**文件状态 
  86.      * @throws IOException 
  87.      */  
  88.     @Test  
  89.     public void testGetFileStatus() throws IOException{  
  90.         Configuration conf = new Configuration();  
  91.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  92.         Path path = new Path("/user/root/input/1.txt");  
  93.         FileStatus status = fs.getFileStatus(path);  
  94.         System.out.println(status.getModificationTime());  
  95.     }  
  96.     /**文件状态,可以获得文件夹信息 
  97.      * @throws IOException 
  98.      */  
  99.     @Test  
  100.     public void testListFile() throws IOException{  
  101.         Configuration conf = new Configuration();  
  102.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  103.         Path path = new Path("/user/root/input");  
  104.         FileStatus[] status = fs.listStatus(path);  
  105.         for (FileStatus fileStatus : status) {  
  106.             System.out.println(fileStatus.getPath());  
  107.         }  
  108.     }  
  109.       
  110.     /**创建文件夹 
  111.      * @throws IOException 
  112.      */  
  113.     @Test  
  114.     public void testMkdirs() throws IOException{  
  115.         Configuration conf = new Configuration();  
  116.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  117.         Path path = new Path("/user/root/input/sub");  
  118.         fs.mkdirs(path);  
  119.     }  
  120.     /**移动本地文件到hdfs 
  121.      * @throws IOException 
  122.      */  
  123.     @Test  
  124.     public void testMoveFromLocalFile() throws IOException{  
  125.         Configuration conf = new Configuration();  
  126.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  127.         Path path = new Path("/user/root/input/sub");  
  128.         fs.moveFromLocalFile(new Path("C:\Users\lenovo\Desktop\4.txt"), path);  
  129.     }  
  130.     /**重命名 
  131.      * @throws IOException 
  132.      */  
  133.     @Test  
  134.     public void testRename() throws IOException{  
  135.         Configuration conf = new Configuration();  
  136.         FileSystem fs = FileSystem.get(URI.create(BASE_URL), conf);  
  137.         Path path = new Path("/user/root/input/sub/4.txt");  
  138.         Path dest = new Path("/user/root/input/sub/4_1.txt");  
  139.         fs.rename(path, dest);  
  140.     }  
  141. }  

    源代码下载地址:http://download.csdn.net/detail/wuyinggui10000/8954567

创建Java项目,File->New->Java Project,命名为TestHDFS

采用单元测试做实验,加入单元测试依赖包,项目导航栏里右键Build Path->Add Libraries->JUnit,以上操作完成如下:
Hadoop <wbr>API编程——FileSystem操作


引入hadoop相关外部jar包,Build Path->Add External Archives,jar包包括:
hadoop/lib/*.jar,hadoop/hadoop-core-1.2.1.jar

创建一个java类,TestHDFS.java,继承junit.framework.TestCase,代码开始写:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;

import junit.framework.TestCase;


public class TestHDFS extends TestCase {
    
     public static String hdfsUrl = "hdfs://192.168.1.106:8020";

      @Test
      public void testHDFSMkdir() throws Exception{   //create HDFS folder 创建一个文件夹
           Configuration conf= new Configuration();
           FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
           Path path = new Path("/test");
           fs.mkdirs(path);
      }

      @Test 
      public void testCreateFile() throws Exception{   //create a file  创建一个文件
         Configuration conf= new Configuration();
         FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
         Path path = new Path("/test/a.txt");
         FSDataOutputStream out = fs.create(path);
         out.write("hello hadoop".getBytes());
      }

        @Test
        public void testRenameFile() throws Exception{   //rename a file 重命名
           Configuration conf= new Configuration();
           FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
           Path path = new Path("/test/a.txt");
           Path newPath = new Path("/test/b.txt");
           System.out.println(fs.rename(path, newPath));
        }

        @Test
        public void testUploadLocalFile1() throws Exception{   //upload a local file 上传文件
           Configuration conf= new Configuration();
           FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
           Path src = new Path("/home/hadoop/hadoop-1.2.1/bin/rcc");
           Path dst = new Path("/test");
           fs.copyFromLocalFile(src, dst);
        }

         @Test
         public void testUploadLocalFile2() throws Exception{   //upload a local file 上传文件
            Configuration conf= new Configuration();
            FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
            Path src = new Path("/home/hadoop/hadoop-1.2.1/bin/rcc");
            Path dst = new Path("/test");
            InputStream in = new BufferedInputStream(new FileInputStream(new File("/home/hadoop/hadoop-1.2.1/bin/rcc")));
            FSDataOutputStream out = fs.create(new Path("/test/rcc1"));
            IOUtils.copyBytes(in, out, 4096);
         }

@Test
           public void testListFIles() throws Exception{  //list files under folder 列出文件
                       Configuration conf= new Configuration();
                       FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
                       Path dst = new Path("/test");
                       FileStatus[] files = fs.listStatus(dst);
                       for(FileStatus file: files){
                       System.out.println(file.getPath().toString());
           }
}

@Test
           public void testGetBlockInfo() throws Exception{   //list block info of file  查找文件所在的数据块
              Configuration conf= new Configuration();
              FileSystem fs = FileSystem.get(URI.create(hdfsUrl),conf);
              Path dst = new Path("/test/rcc");
              FileStatus fileStatus = fs.getFileStatus(dst);                                                                              BlockLocation[] blkloc=fs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());  //查找文件所在数据块
              for(BlockLocation loc: blkloc){
                    for(int i=0;i < loc.getHosts().length;i++)
                          System.out.println(loc.getHosts()[i]);
                     }
               }
}


还有很多函数,慢慢使用体会吧。。。

单元测试过程:
Hadoop <wbr>API编程——FileSystem操作

Eclipse左侧窗口,展开java类的方法,对某个需要进行单元测试的类右键,选择JUnit Test,如图所示。

先到这里吧。。。

API说明:
http://hadoop.apache.org/docs/current/api/

最后

以上就是灵巧哈密瓜为你收集整理的hadoop利用FileSystem API 执行hadoop文件读写操作的全部内容,希望文章能够帮你解决hadoop利用FileSystem API 执行hadoop文件读写操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部