天天看點

通過使用API來操作HDFS

整體的流程就是:

public static final String HDFS_PATH = "hdfs://masterIP:9000/";

Configuration config=new Configuration();

FileSystem fs=FileSystem.get(new URI(HDFS_PATH ),config); //FIleSystem類是操作檔案的主要的類

1、建立一個檔案夾,同時并将一個本地的檔案輸入到這個新建立的檔案夾下

//在hdfs下建立/test目錄

fs.mkdir(new Path("/test"));

//将本地的檔案上傳到/test檔案夾下,并且命名為yy.txt

FSDataOutputStream out=fs.create(new Path("/test/yy.txt"));

//介紹create幾個方法的重載

FSDataOutputStream create(Path path)

FSDataOutputStream create(Path path,boolean overwrite)

FSDataOutputStream create(Path path,boolean overwrite ,int buffersize)

//得到本地檔案的輸入流

FileInputStream in = new FileInputStream("C:/Users/Administrator/Desktop/yy.txt");

//使用IOUtils這個工具,直接将輸入流傳給輸出流

IOUtils.copyBytes(in, out, 1024, true); 

2、将hdfs檔案的資料,複制到本地指定的檔案 中

FSDataInputStream in=fs.open(new Path("/test/hello"));

FileoutputStream out=new FIleOutputStream(new File("/usr/local/yy/hello.txt"));

IOUtils.copyBytes(in,out,1024,true);

3、删除指定的檔案或者檔案夾下所有的檔案

boolean delete(Path f,boolean recursive) API

如果f是一個目錄,且recursive=true 則删除該檔案夾下所有的檔案。

如果f就是一個檔案 ,則無論recursive=true  or  false 則隻删除該檔案

boolean result=fs.delete(new Path("/test"),true);

4、擷取指定檔案的資訊

FileStatus getFileStatus(Path path)

FileStatus stat=fs.getFileStatus("/test/hello");

System.out.println(stat.getPath().toUri().getPath());// 相對路徑

System.out.println(stat.getPath());// 絕對路徑

System.out.println(stat.getLen());

System.out.println(stat.isDir());

System.out.println(stat.getModificationTime());

System.out.println(stat.getReplication());

System.out.println(stat.getBlockSize());

System.out.println(stat.getOwner());

System.out.println(stat.getGroup());

System.out.println(stat.getPermission().toString());

5、擷取檔案夾下所有檔案的資訊(使用遞歸)

FileStatus[] listStatus(Path f)

public void showFileStatus(Path p){

FileStatus[] status=fs.listStatus(new Path("/test"));

for(int i=0;i<status.length;i++){

    if(status[i].isDir()){

       showFileStatus(status[i].getPath());

  }else{

    System.out.println(stat.getPath());// 絕對路徑

System.out.println(status[i].getLen());

System.out.println(status[i].isDir());

System.out.println(status[i].getModificationTime());

System.out.println(status[i].getReplication());

System.out.println(status[i].getBlockSize());

System.out.println(status[i].getOwner());

System.out.println(status[i].getGroup());

System.out.println(status[i].getPermission().toString());

 }

}

}

//這個是重載的方法,主要就是通過PathFilter過濾到一些不想要的檔案或者路徑

FileStatus[] listStatus(Path f,PathFilter pathFilter)

package hdfs;

import org.apache.hadoop.fs.Path;

public class MyPathFilter implements PathFilter {

private final String regex;

public MyPathFilter(String regex) {

this.regex = regex;

}

@Override

public boolean accept(Path path) {

return path.toString().matches(regex);

}

}

FileStatus[] fstatus=fs.listStatus(new Path("/test"),new MyPathFilter("f*")); //主要f開頭的檔案

FileStatus[] globalStatus(Path pattern) ;//輸入的路徑可以是正規表達式,将多個路徑的檔案顯示出來

FileStatus[]      fss=fs.globalStatus("/test*");

Path[] paths=FileUtils.stat2Path(fss); //這是一個工具類,将FileStatus轉化為路徑

for(Path p:paths){

System.out.println(p);

}/span>

6、得到所有的DataNode節點的具體資訊

private static void getHDFSNodes() throws IOException, URISyntaxException {

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(new URI(HADOOP_PATH), conf);

DistributedFileSystem dfs = (DistributedFileSystem) fs;

DatanodeInfo[] datanodestats = dfs.getDataNodeStats();

for (int i = 0; i < datanodestats.length; i++) {

System.out.println("datanode_" + i + "--"

+ datanodestats[i].getHost() + "--"

+ datanodestats[i].getHostName() + "--"

+ datanodestats[i].getDatanodeReport() + "--"

+ datanodestats[i].getAdminState());

}

}

7、得到檔案的塊在哪些主機上

private static void getFileLocal() throws IOException, URISyntaxException {

FileSystem fs = FileSystem.get(new URI(HADOOP_PATH),

new Configuration());

Path fpath = new Path("/in/hello");

FileStatus filestatus = fs.getFileStatus(fpath);

System.out.println(filestatus.getReplication() + "--"

+ filestatus.getOwner() + "--" + filestatus.getGroup() + "--"

+ filestatus.getBlockSize() + "--" + filestatus.getLen() + "--"

+ filestatus.getPath());

BlockLocation[] blklocation = fs.getFileBlockLocations(filestatus, 0,

filestatus.getLen());

int blocklen = blklocation.length;

for (int i = 0; i < blocklen; i++) {

String[] hosts = blklocation[i].getHosts();

System.out.println("block_" + i + "--" + "-location:" + hosts[0]);

}

}

繼續閱讀