public class NDFSQuery {
private static FileSystem hdfs;
private final static String hdfsURI = "hdfs://192.168.0.160:9000/";
private static Configuration conf = new Configuration();
public static void main(String[] args) throws Exception {
// 連線 hdfs, 注意 因 FileSystem.get()取回得的FileSystem是屬於全域變數
// 故有任何地方進行 close後, 要使用時就須再 get()一次
//conf.addResource(new Path("c:/core-site.xml"));//加入配置參數
hdfs = FileSystem.get(conf);//使用預載參數檔內URI
//hdfs = FileSystem.get(URI.create(hdfsURI), conf);//自行指定URI
System.out.println("遠端使用者工作目錄:" + hdfs.getWorkingDirectory());
//
//viewData("/lc/hadoop");// 瀏覽
uploadData();//上傳
createData();//建立遠端檔案
//更改檔名
boolean result = false;
result = hdfs.rename(new Path("/lc/test.txt"), new Path("/lc/new_test.txt"));
System.out.println("更改檔名:"+result);
//若指定為目錄時 參數(true 不論目錄內是否有檔案一律刪除, false=若目錄內有檔案則拋出異常)
result = hdfs.delete(new Path("/sample.txt"), false);//刪除檔案或目錄
System.out.println("刪除檔案:"+result);
result = hdfs.deleteOnExit(new Path("/lc/samplt.txt"));
System.out.println("程序結束後刪除檔案:"+result);
//
hdfs.close();
System.out.println("end");
}
// 顯示 Configuration 參數資料
private static void listConfiguration() {
for(Entry<String, String> entry:conf) {
System.out.printf("%s=%s\n",entry.getKey(),entry.getValue());
}
}
// 直接建立遠端資料
private static void createData() throws Exception {
String root = "/lc";
// 使用HDFS stream 寫入資料,建立目錄,檔案
FSDataOutputStream out = hdfs.create(new Path(root+"/in/myfirst.txt"));
out.writeUTF("哈囉\n");//UTF-8
out.write(((new Date()).toString()+" 哈囉, 我的 Hadoop!").getBytes("UTF-8"));
out.flush();
out.close();
//
viewData(root);
}
// 上傳資料
private static void uploadData() throws Exception {
// 取得本地檔案
Path src = new Path("j:/test.txt");
// 指定檔案 hdfs儲存位置
String root = "/lc";
Path dst = new Path(hdfsURI + root);
// 上傳
hdfs.copyFromLocalFile(src, dst);
System.out.println("檔案上傳成功至:" + conf.get("fs.default.name"));
// 6.取得指定路徑下的檔案/目錄清單
FileStatus[] fs = hdfs.listStatus(dst);
//
if (fs == null) {
System.out.println("root error");
} else if (fs.length > 0) {
for (FileStatus f : fs) {
showDir(f, root);
}
}
}
// 瀏覽資料
private static void viewData(String root) throws Exception {
// 取得指定路徑下的檔案/目錄清單
FileStatus[] fs = hdfs.listStatus(new Path(root));
//
if (fs == null) {
System.out.println("[viewData] root error");
} else if (fs.length > 0) {
for (FileStatus f : fs) {
showDir(f, root);
}
}
}
//列出 指定路徑下資料
private static void showDir(FileStatus fs, String root) throws Exception {
Path path = fs.getPath();
// 資料修改時間
long time = fs.getModificationTime();
String dTime = (new Date(time)).toString();
if (fs.isDir()) {// 目錄
root += "/" + path.getName();
System.out.println(String.format("目錄[%s] %s", dTime, root));
System.out.println(">> "+path);
FileStatus[] f = hdfs.listStatus(path);
if (f.length > 0) {
for (FileStatus file : f) {
showDir(file, root);
}
}
} else {// 檔案
System.out.println(String.format("檔案[%s] %s/%s", dTime, root, path.getName()));
showData(root + "/" + path.getName());
}
}
//顯示檔案資訊
private static void showData(String tarFile) {
try {
Path path = new Path(tarFile);
FSDataInputStream is = hdfs.open(path);
FileStatus stat = hdfs.getFileStatus(path);
byte[] buffer = new byte[Integer.parseInt(String.valueOf(stat.getLen()))];
is.readFully(0, buffer);
is.close();
System.out.println(new String(buffer));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import
import java.io.IOException;
import java.net.URI;
import java.util.Date;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;