1. 程式人生 > >HADOOP HDFS Client API

HADOOP HDFS Client API

package com.itstar.demo03;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

import org.apache.hadoop.conf.
Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils; import org.junit.Before; import org.junit.Test; /** * HDFS客戶端API演示 * * @author CDMloong * @version 1.0 */ public class HdfsClientTest01 { FileSystem fs = null; @Before public void init() throws IOException, InterruptedException, URISyntaxException { // 1、客戶端載入配置檔案
Configuration conf = new Configuration(); // 2、設定副本數,預設3 conf.set("dfs.replication", "2"); // 3、指定塊大小,預設128M conf.set("dfs.blocksize", "64m"); // 4、構造客戶端物件 fs = FileSystem.get(new URI("hdfs://192.168.244.129:9000"), conf, "root"); } /** * HDFS中建立資料夾->命令 hdfs dfs -mkdir /檔名 * * @throws IOException * @throws IllegalArgumentException */ // @Test public void hdfsMkdir() throws IllegalArgumentException, IOException { fs.mkdirs(new Path("/alongapi")); fs.close(); } /** * HDFS中移動/修改檔案 * * @throws IOException * @throws IllegalArgumentException */ // @Test public void hdfsRename() throws IllegalArgumentException, IOException { // 1、呼叫方法修改並移動 fs.rename(new Path("/words.txt"), new Path("/alongapi/words01.txt")); fs.close(); } /** * HDFS中刪除資料夾 * * @throws IOException * @throws IllegalArgumentException */ // @Test public void hdfsRm() throws IllegalArgumentException, IOException { // 有-表示已經過時了,但是可以使用 // fs.delete(new Path("/weiyulong/weiyulong.txt")); // 1、引數1為刪除的檔案路徑,引數2是否遞迴刪除 fs.delete(new Path("/alongapi"), true); fs.close(); } /** * 查詢HDFS指定目錄的資訊 * * @param listFiles * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ // @Test public void hdfsLs() throws FileNotFoundException, IllegalArgumentException, IOException { // 1、返回的是一個遠端迭代器,第二個引數為是否遞迴查詢檔案 RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/"), false); // 2、取迭代器的資料 while (iter.hasNext()) { LocatedFileStatus status = iter.next(); System.out.println("檔案的路徑為:" + status.getPath()); System.out.println("塊大小:" + status.getBlockSize()); System.out.println("檔案長度:" + status.getLen()); System.out.println("副本數量:" + status.getReplication()); // Arrays是陣列的意思 System.out.println("塊資訊:" + Arrays.toString(status.getBlockLocations())); System.out.println("========================================"); } fs.close(); } /** * 判斷是檔案還是資料夾 * * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ // @Test public void hdfsFind() throws FileNotFoundException, IllegalArgumentException, IOException { // 1、展示狀態資訊 FileStatus[] listStatus = fs.listStatus(new Path("/")); // 2、遍歷所有檔案 for (FileStatus ls : listStatus) { if (ls.isFile()) { // 檔案 System.out.println("檔案-------f-------" + ls.getPath().getName()); } else { System.out.println("資料夾--------d------" + ls.getPath().getName()); } } } // 讀資料方式1:直接讀取指定位元組資料 // @Test public void hdfsFileReadData01() throws IllegalArgumentException, IOException { // 1、拿到檔案流 FSDataInputStream openFile = fs.open(new Path("/hdfs-site.xml")); // 2、定義一個位元組陣列 byte[] buf = new byte[1024]; // 3、讀取檔案 openFile.read(buf); // 4、因返回的是位元組數,轉換為String System.out.println(new String(buf)); // 5、進行關閉 openFile.close(); fs.close(); } // 讀取資料方式2:緩衝流方式讀取 // @Test public void hdfsFileReadData02() throws IllegalArgumentException, IOException { // 1、拿到檔案流 FSDataInputStream openFile = fs.open(new Path("/hdfs-site.xml")); // 2、緩衝流,效率高 BufferedReader br = new BufferedReader(new InputStreamReader(openFile)); // 3、按行讀取 String line = null; // 4、讀資料 while ((line = br.readLine()) != null) { System.out.println(line); } // 5、關閉檔案 br.close(); openFile.close(); fs.close(); } // 讀取資料方式3:讀取hdfs中指定的偏移量 // @Test public void hdfsFileReadData03() throws IllegalArgumentException, IOException { // 1、拿到檔案流 FSDataInputStream openFile = fs.open(new Path("/hdfs-site.xml")); // 2、偏移量 openFile.seek(200); // 3、指定讀取位元組數 byte[] b = new byte[1024]; // 4、讀取 openFile.read(b); // 5、輸出 System.out.println(new String(b)); // 6、關閉 openFile.close(); fs.close(); } // 寫資料方式1 // @Test public void hdfsFileWriteData01() throws IllegalArgumentException, IOException { // 1、定義輸出流 FSDataOutputStream out = fs.create(new Path("/weiyulong1.txt"), false); // 2、定義輸入流 FileInputStream in = new FileInputStream("E:\\testData.txt"); // 3、位元組陣列 byte[] buf = new byte[1024]; int read = 0; // 4、讀取出來進行寫入 while ((read = in.read(buf)) != -1) { out.write(buf, 0, read); } in.close(); out.close(); fs.close(); } // 寫資料方式 @Test public void hdfsFileWriteData02() throws IllegalArgumentException, IOException { //1、建立輸出流 FSDataOutputStream out = fs.create(new Path("/along2")); //2、建立輸入流 // FileInputStream in = new FileInputStream(new File("E:\\testData.txt")); // 3、寫資料 out.write("alonglaile".getBytes()); // 4、關閉流 IOUtils.closeStream(out); fs.close(); } }