实战Hadoop
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 HDFS API之旅

本节将提供几个简单的实例,指导读者如何使用Hadoop的Java APIHadoop 0.20.2 API[OL].http://hadoop.apache.org/common/docs/ r0.20.2/api/ Hadoop Distributed File System (HDFS) Java tutorial[OL].http://myjavanotebook.blogspot.com/ 2008/05/hadoop-file-system-tutorial.html针对HDFS进行文件上传、创建、重命名、删除等操作。

1.上传本地文件到HDFS

通过FileSystem.copyFromLocalFile(Path src, Path dst)可将本地文件上传到HDFS的指定位置上,其中src和dst均为文件的完整路径。具体实例如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyFile {
    public static void main(String[] args)throws Exception{
    Configuration conf=new Configuration();
    //conf.addResource(new Path("conf/hadoop-default.xml"));
    //conf.addResource(new Path("conf/hadoop-site.xml"));
    FileSystem hdfs=FileSystem.get(conf);
    Path src=new Path("C:\\Users\\Administrator\\Desktop\\JDK_API_1_6_zh_CN.CHM.1");
    Path dst=new Path("/");
    hdfs.copyFromLocalFile(src, dst);
    System.out.println("Upload to"+conf.get("fs.default.name"));
    FileStatus files[]=hdfs.listStatus(dst);
    for(FileStatus file:files){
       System.out.println(file.getPath());
    }
 }
}

运行结果可以通过控制台和项目浏览器查看,如图2-16和图2-17所示(之后的运行结果将不再展示,读者自行查看)。

图2-16 运行结果(1)

图2-17 运行结果(2)

2.创建HDFS文件

通过FileSystem.create(Path f)可在HDFS上创建文件,其中f为文件的完整路径。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CreateFile {
    public static void main(String[] args)throws Exception{
    Configuration conf=new Configuration();
    byte[] buff ="hello word!".getBytes();
    FileSystem hdfs = FileSystem.get(conf);
    Path dfs = new Path("/test");
    FSDataOutputStream outputStream = hdfs.create(dfs);
    outputStream.write(buff, 0, buff.length);
    }
}

3.重命名HDFS文件

通过FileSystem.rename(Path src, Path dst)可为指定的HDFS文件重命名,其中src和dst均为文件的完整路径。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class Rename {
    public static void main(String[] args)throws Exception{
    Configuration conf=new Configuration();
    FileSystem hdfs=FileSystem.get(conf);
    Path frpath=new Path("/test");
    Path topath=new Path("/test1");
    boolean isRename=hdfs.rename(frpath, topath);
  }
}

4.删除HDFS上的文件

通过FileSystem.delete (Path f, Boolean recursive)可删除指定的HDFS文件,其中f为需要删除文件的完整路径,recursive用来确定是否进行递归删除。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class DeleteFile {
public static void main(String[] arg)throws Exception{
      Configuration conf=new Configuration();
      FileSystem hdfs=FileSystem.get(conf);
      Path delef=new Path("/test1");
      boolean isDeleted=hdfs.delete(delef,false);
      //递归删除
      //boolean isDelete=hdfs.delete(delef,true)
      System.out.println("delete?"+isDeleted);
}

}

5.查看HDFS文件的最后修改时间

通过FileStatus.getModificationTime()可查看指定HDFS文件的修改时间。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class GetLTime {
    public void main(String[] args)throws Exception{
    Configuration conf=new Configuration();
    FileSystem hdfs=FileSystem.get(conf);
    Path fpath=new Path("/test1");
    FileStatus fileStatus=hdfs.getFileStatus(fpath);
    long modificationTime=fileStatus.getModificationTime();
    System.out.println("Modification time is:"+ modificationTime);
}

}

6.查看某个HDFS文件是否存在

通过FileSystem.exists (Path f)可查看指定HDFS文件是否存在,其中f为文件的完整路径。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CheckFile {
public void main(String[] args)throws Exception{
    Configuration conf=new Configuration();
    FileSystem hdfs=FileSystem.get(conf);
    Path findf=new Path("/test1");
    boolean isExists=hdfs.exists(findf);
    System.out.println("Exist?"+isExists);
}

}

7.查找某个文件在HDFS集群的位置

通过FileSystem.getFileBlockLocations(FileStatus file, long start, long len)可查找指定文件在HDFS集群上的位置,其中file为文件的完整路径,start和len来标识查找文件的路径。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class FileLoc {
public void main(String[] args)throws Exception{
      Configuration conf=new Configuration();
      FileSystem hdfs=FileSystem.get(conf);
      Path fpath=new Path("/test1");
      FileStatus filestatus=hdfs.getFileStatus(fpath);
      BlockLocation[] blkLocations = hdfs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
      int blockLen=blkLocations.length;
      for(int i=0;i<blockLen;i++){
      String[]hosts=blkLocations[i].getHosts();
      System.out.println("block"+i+"location:"+hosts[i]);
   }

}

}

8.获取HDFS集群上所有节点名称

通过DatanodeInfo.getHostName()可获取HDFS集群上的所有节点名称。具体实现如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
public class GetList {
public void mian(String[] args)throws Exception{
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(conf);
    DistributedFileSystem hdfs = (DistributedFileSystem) fs;
    DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
    String[] names = new String[dataNodeStats.length];
    for (int i = 0; i < dataNodeStats.length; i++)
    { names[i] = dataNodeStats[i].getHostName();
      System.out.println("node"+i+"name"+ names[i]);
    }
}

}