HDFS使用JavaAPI操作

环境:

开发环境是Windows下的Eclipse,
其中host已经设置了对集群的IP和主机名
在环境变量中,设置了JAVA_HOME ,设置好JAVA的默认路径
有C:\My_Files\Config\hadoop-common-2.2.0-bin-master\bin

生产环境:一个集群

开发步骤:

1.通过Maven工程中的pom.xml引入依赖关系
2.配置与连接
3.对HDFS进行编程操作

HDFS的操作包含:对HDFS进行操作,文件夹和目录,权限,文件等

对分HDFS中的文件操作主要涉及一下几个类:
Configuration类:该类的对象封转了客户端或者服务器的配置。
FileSystem类:该类的对象是一个文件系统对象,可以用该对象的一些方法来对文件进行操作。
        FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入输出流。
分别通过FileSystem的open方法和create方法获得

配置文件设置

方式一:从配置文件中读取
//initialization
static Configuration conf = new Configuration();
static FileSystem hdfs;
static {
    String path = "/usr/java/hadoop-1.0.3/conf/";
    conf.addResource(new Path(path + "core-site.xml"));
    conf.addResource(new Path(path + "hdfs-site.xml"));
    conf.addResource(new Path(path + "mapred-site.xml"));
    path = "/usr/java/hbase-0.90.3/conf/";
    conf.addResource(new Path(path + "hbase-site.xml"));
    try {
        hdfs = FileSystem.get(conf);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
##方式二
public static final String toolConfigPath = "C:/Users/unix/workspace/JavaHDFS/src/main/resources/HDFSConfig.properties";    
   /**
    * 取得通用配置文件属性
    * @param CongfigfilePath  配置文件的文件路径和配置文件明后才能
    * @param key               调取的参数
    * @return
    */
    private static  String getProptFile(String CongfigfilePath,String key){
        Properties prop = new Properties(); 
        InputStream propInStream = null;
                      //读取属性文件CongfigFilenName
         try {
                 //从文件获取InputStream
              propInStream  = new  FileInputStream(new File(CongfigfilePath));
              } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
              try {
                prop.load(propInStream);
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }     ///加载对应属性
            // String configParam = (String) prop.getProperty(key); 
              String configParam =  prop.getProperty(key);

             //关闭资源
             try {
                propInStream .close();
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }

             return  configParam;
        }

        /**
         * 初始化配置 静态初始化块
         * @return
         */
        private static Configuration getConf(){  
            ////Configuration 对象封装了客户端或者服务端的配置
            Configuration HDFS_CONFIG = new Configuration();  
            // 这句话很关键,这些信息就是hadoop配置文件中的信息 // 文件系统连接到 hdfs的配置信息  
          //  HDFSConfig.properties文件在系统下,如果不在的话
            String  HDFS_fs_default_name= getProptFile(HdfsUtil.toolConfigPath,"fs.default.name");
            HDFS_CONFIG.set("fs.default.name", HDFS_fs_default_name);  
            return HDFS_CONFIG;  
        }

        /**
         * 创建目录
         * @param path
         * @throws IOException
         */
        public static void mkdir(String path) throws IOException{
            Configuration conf = getConf();  
            FileSystem fs = FileSystem.get(conf); 
            Path srcPath = new Path(path);
            //FileSystem 实例提供创建目录的方法mkdirs,如果创建成功则会返回true
            boolean isok = fs.mkdirs(srcPath);
            if(isok){
                System.out.println("create dir ok!");
            }else{
                System.out.println("create dir failure");
            }
            fs.close();
        }

方式二--使用加载当前类读取
public static final String toolConfigPath = "C:/Users/unix/workspace/JavaHDFS/src/main/resources/HDFSConfig.properties";

   /**
    * 取得通用配置文件属性
    * @param CongfigfilePath  配置文件的文件路径和配置文件名称
    * @param key               调取的参数
    * @return
    */
public static String getConfigProperty(String path,String name) {
    Properties prop = new Properties();
    InputStream in = null;
    String value = null;
    try {
        File f = new File(path);
        if (!SystemUtils.IS_OS_WINDOWS) {
            in = new FileInputStream(f);
        } else {
            //通过当前类加载器的getResourceAsStream方法获取InputStream
            //注意:在使用getResourceAsStream()读取配置文件时,要特别注意配置文件的路径的写法。
            //this.getClass.getResourceAsStream(fileName)..使用类和资源文件在同一目录下;
            //this.getclass.getLoader.getResourceAsStream(fileName)..资源文件和classes同级。
            in = SingleHDFS.class.getClassLoader().getResourceAsStream("HDFSConfig.properties");
        }
        prop.load(in);
        value = prop.getProperty(name);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if(in != null){
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return value;
}

        /**
         * 初始化配置 静态初始化块
         * @return
         */
        private static Configuration getConf(){  
            ////Configuration 对象封装了客户端或者服务端的配置
            Configuration HDFS_CONFIG = new Configuration();  
            // 这句话很关键,这些信息就是hadoop配置文件中的信息 // 文件系统连接到 hdfs的配置信息  
          //  HDFSConfig.properties文件在系统下,如果不在的话
            String  HDFS_fs_default_name= SingleHDFS.getConfigProperty(SingleHDFS.toolConfigPath,"fs.default.name");
            HDFS_CONFIG.set("fs.default.name", HDFS_fs_default_name);  
            return HDFS_CONFIG;  
        }

出现的错误

出错:java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSums
原因:
    hadoop2.6版本的dll,网上比较多的是2.2的dll,
    如果2.6版本用2.2的dll,会报hadoop 2.6 UnsatisfiedLinkError: org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArra 错误,
    因为2.2的dll中NativeCrc32只nativeVerifyChunkedSums,没有nativeComputeChunkedSums和nativeComputeChunkedSumsByteArray,所以会报错,
    至于网上说的建同名包,拷贝NativeCrc32.java是没有用的,至少对于2.6.0来说是没有用的
解决方法:下载2.7版本的,然后将其中2.2的替换为2.7的

参考

HDFS的API  http://blog.csdn.net/silentwolfyh/article/details/51485288
HDFS中JAVA API的使用 http://blog.csdn.net/flood_dragon/article/details/17957505
java读取.properties配置文件的几种方法 http://blog.csdn.net/mhmyqn/article/details/7683909
HDFS中JAVA API的使用 http://www.cnblogs.com/liuling/p/2013-6-17-01.html

blogroll

social