HADOOP HDFS Client API
阿新 • • 發佈:2018-12-15
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();
}
}