java管理hdfs文件的常用类小结

最近在写一些hadoop的运维工具,考虑到hadoop本身是java编写的,api比较方便,可以直接拿来就用
准备用java来写。
今天测试了几个fs相关的类。
主要有FileStatus,FileSystem,DistributedFileSystem,DatanodeInfo,BlockLocation
FileStatus是和文件的属性相关的类,比如文件的名称,大小,属主等
主要的取值方法有:
getPath,getLen,getModificationTime,getAccessTime,getReplication,getOwner,getGroup,getPermission等,通过字面意思就可以很容易的理解其功能
FileSystem是一个抽象类,常见的具体实现类是LocalFileSystem和DistributedFileSystem
常见的方法:
listStatus 查看目录下的文件属性,返回FileStatus数组,getFileStatus 查看一个文件的属性,返回FileStatus
copyToLocalFile hdfs到本地复制,copyFromLocalFile 本地到hdfs复制,exists  判断文件是否存在,参数为Path,getLocal 返回本地文件系统,LocalFileSystem
getFileBlockLocations ,返回BlockLocation的数组,参数是FileStatus 等
DatanodeInfo是和datanode有关的类,主要是包含了datanode的相关信息,主要有容量,打开文件数,主机名,ip等信息,比如查看整个hdfs集群的存储状态(dfsadmin report)就是调用了
getDatanodeReport方法。
BlockLocation包含了block所在的datanode的信息,可以用来查看一个文件的block的具体信息,比如大小,所在主机,是否为坏块等

综上,可以用FileStatus来获取文件的属性,FileSystem的具体实现类来对文件做操作,用DatanodeInfo来获取datanode的信息,BlockLocation来看文件到block的对应关系

下面列举两个例子:
例1:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.fs.BlockLocation;
import static java.lang.System.out;
public class FileStatusTest {
  private static Configuration config = new Configuration();
  private static FileSystem hdfs = null ;
  private static FileStatus[] status = null ;
  public static void main(String[] args) throws IOException{
  List<String>  namelist = new ArrayList<String>();
  config.addResource("hdfs-site.xml" );
  config.addResource("core-site.xml" );
  out.println(config.get("dfs.namenode.name.dir"));
  out.println(config.get("fs.defaultFS"));
  FileSystem hdfs = FileSystem.get( config);
  out.println(hdfs.getClass().getName());
  String file = args[0];
  try {
          if(!hdfs.exists(new Path (file))){
                  return;
          }
          status = hdfs.listStatus(new Path (file));
          out.println("file num is " + status.length);
          for(FileStatus f: status) {
                  namelist.add(f.getPath().toString());
                  out.println("file name is " + f.getPath());
          }
  } catch(Exception e){
          e.printStackTrace();
  }
   }
}

例2:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.fs.BlockLocation;
import static java.lang.System.out;
public class FileStatusTest {
  private static Configuration config = new Configuration();
  private static FileSystem hdfs = null ;
  private static FileStatus[] status = null ;
  public static void main(String[] args) throws IOException{
        List<String>  namelist = new ArrayList<String>();
        List<String>  hostlist = new ArrayList<String>();
        config.addResource("hdfs-site.xml" );
        config.addResource("core-site.xml" );
        out.println(config.get("dfs.namenode.name.dir"));
        out.println(config.get("fs.defaultFS"));
        FileSystem hdfs = FileSystem.get( config);
        try{
                DistributedFileSystem dishdfs = (DistributedFileSystem) hdfs;
                DatanodeInfo[] nodeStats = dishdfs.getDataNodeStats();
                String[] names = new String[nodeStats.length];
                for (int i = 0; i < nodeStats.length; i++) {
                        out.println("hostname is " + nodeStats[i].getName());
                        out.println("dfs used is " + nodeStats[i].getDfsUsed());
                        out.println(nodeStats[i].getDatanodeReport());
                }
        } catch(Exception e){
                e.printStackTrace();
        }
        out.println(hdfs.getClass().getName());
        String file = args[0];
        try {
                if(!hdfs.exists(new Path (file))){
                        return;
                }
                status = hdfs.listStatus(new Path (file));
                out.println("file num is " + status.length);
                for(FileStatus f: status) {
                        namelist.add(f.getPath().toString());
                        out.println("file name is " + f.getPath());
                        BlockLocation[] blks = hdfs.getFileBlockLocations(f, 0, f.getLen());
                        for (BlockLocation blk:blks){
                                out.println("blk name is " + blk.toString());
                                out.println("length is " + blk.getLength());
                        }
                }
        } catch(Exception e){
                e.printStackTrace();
        }
   }
}
时间: 2024-10-19 18:38:36

java管理hdfs文件的常用类小结的相关文章

C#文件读写常用类介绍

首先要熟悉.NET中处理文件和文件夹的操作.File类和Directory类是其中最主要的两个类.了解它们将对后面功能的实现提供很大的便利.      本节先对和文件系统相关的两个.NET类进行简要介绍.  System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法.  (1) 文件打开方法:File.Open () 该方法的声明如下: public static FileS

死磕 Java 系列(一)&mdash;&mdash; 常用类(1) String 源码解析

写在前面 这是博主新开的一个 java 学习系列,听名字就可以看出来,在这一些系列中,我们学习的知识点不再是蜻蜓点水,而是深入底层,深入源码.由此,学习过程中我们要带着一股钻劲儿,对我们不懂的知识充满质疑,力求把我们学过的知识点都搞清楚,想明白. 一.引言 在 java 的世界里,存在一种特殊的类,它们的创建方式极为特别,不需要用到 new XXX(当然也可以用这种方式创建), 但是却大量出现在我们的代码中,那就是 String 类.作为日常中使用频率最高的类,它是那么普通,普通到我们从来都不会

java总结第四次//常用类

六.常用类 主要内容:Object类.String类.Date类.封装类 (一)Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person { ... } 等价于: public class Person extends Object { ... } (二)==操作符与equals方法 ==操作符: 引用类型比较引用(是否指向同一个对象): Person p1=new P

java第七章:常用类

包装类型:讲8种基本数据类型包装成类,进而使用类中的属性和方法. byte --Byte,short--Short,long--Long,    float--Float,double--Double  ,boolean--Boolean int--Integer,char--Charactor,除了Boolean和Charactor,其他包装类型的父类是java.lang.Number; String 类,不可变的字符序列,每次追加新内容,就会摒弃当前字符串,而创建一个新的字符串,所以说效率很

C#_文件读写常用类介绍

首先要熟悉.NET中处理文件和文件夹的操作.File类和Directory类是其中最主要的两个类.了解它们将对后面功能的实现提供很大的便利.      本节先对和文件系统相关的两个.NET类进行简要介绍.  System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法.  (1) 文件打开方法:File.Open () 该方法的声明如下: public static FileS

java中必须知道的常用类

1.Java的包装类 基本数据类型我们都很熟悉,例如:int.float.double.boolean.char等,基本数据类型不具备对象的特征,不能调用方法,一般能实现的功能比较简单,为了让基本数据类型也具备对象的特性,Java为每个数据类型都提供了一个包装类,这样我们就可以像操作对象一样,操作这些基本数据类型了 常见的包装类和基本类型对应关系如下: 包装类主要提供了两类方法: 1.进行多个类型之间的转换 2.将字符串和本类型及包装类相互转换 比如下面代码: 1 int i = 2; 2 In

Java中的集合和常用类

Java中的常用类: ? Object类 ? Math类 ? String类和StringBuffer类(字符串) ? 8种基本类型所对应的包装类 ? java.util包中的类——Date类 Object类: Object类是Java语言程序中所有类的父类,即承自Object类.Object类中包含了Java语言类中的所有的公共属性. ? toString()方法 ? equals()方法 ? getClass()方法 ? clone()方法 ? finalize()方法 枚举类: 用于储存变

java中必须了解的常用类

java中的包装类 为何有包装类的出现? 基本数据类型不具备对象的特性的,比如基本类型不能调用方法.功能简单. 为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型. 每个基本类型都有相对应的包装类: 包装类主要提供了两大类方法: 将本类型和其他基本类型进行转换的方法. 将字符串和本类型及包装类互相转换的方法 下面看一个例子: public class HelloWorld { public static void ma

java的eclipse操作和常用类Object的使用

1.eclipse的快捷键: (1)alt + /   内容辅助. 如:main+alt + / 会出现完整的main方法. syso+alt+ / 会输出. 如编写某个方法时,只需写入方法名 + alt+/ 就会自动生成相应的方法. (2)ctrl+shift+f  代码格式化 (3)ctrl+shift+o  导入包 (4)注释 ctrl+/  单行注释或者取消单行注释 ctrl+shift+/  多行注释 ctrl+shift+\  取消多行注释 (5)代码上下移动 选中代码alt+上/下