整體的流程就是:
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]);
}
}