Hadoop系列007-HDFS客戶端操作
本人微信公眾號,歡迎掃碼關注!

HDFS客戶端操作
1 環境準備
1.1 Jar包準備
1)解壓hadoop-2.7.2.tar.gz到非中文目錄
注意1:如果使用WinRAR解壓報錯的話,就使用超級管理員權限打開DOS窗口,然后cd到解壓包所在位置,執行start winrar x -y xxx.tar.gz命令,即可成功
注意2:使用對應平臺下編譯后的hadoop源碼包,即win7系統使用在win7下編譯后的源碼包,win10同理。

2)進入share文件夾,查找所有jar包,并把jar包拷貝到_lib文件夾下
3)在全部jar包中查找.source.jar,并剪切到_source文件夾。
4)在全部jar包中查找tests.jar,并剪切到_test文件夾。

1.2 IDEA準備
1)配置HADOOP_HOME環境變量

2)建立工程并且添加依賴

注意:Eclipse全選Jar包右鍵Add Build Path
3)編寫代碼測試
4)執行程序
客戶端去操作hdfs時,是有一個用戶身份的。默認情況下,hdfs客戶端api會從jvm中獲取一個參數來作為自己的用戶身份:-DHADOOP_USER_NAME=atguigu,atguigu為用戶名稱。


5)驗證

2 通過API操作HDFS
2.1 HDFS獲取文件系統
@Test
public void getFileSystem() {
// 1 創建配置對象
Configuration conf = new Configuration();
// 2 獲取文件系統
FileSystem fs = null;
try {
fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), conf, "intflag");
// 3 打印文件系統
System.out.println(fs);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} finally {
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

2.2 HDFS文件上傳
@Test
public void putFileToHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 上傳文件
try {
fs.copyFromLocalFile(true,new Path("D:/test/x3.000"), new Path("/user/intflag/input/x3.000"));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
2.3 HDFS文件下載
@Test
public void getFileFromHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 下載文件
try {
fs.copyToLocalFile(new Path("/user/intflag/input/x3.000"),new Path("D:/test/x3.000"));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
2.4 HDFS目錄創建
/**
* 在HDFS上創建文件夾
*/
@Test
public void mkdirAtHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 創建文件夾
try {
fs.mkdirs(new Path("/user/intflag/test"));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
2.5 HDFS文件夾刪除
/**
* 刪除HDFS上的文件夾
*/
@Test
public void deleteDirAtHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 刪除文件夾
try {
//fs.delete(new Path("/user/intflag/test"));
fs.delete(new Path("/user/intflag/test"),true);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
2.6 HDFS文件名更改
/**
* 重命名HDFS上的文件夾
*/
@Test
public void renameDirAtHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 重命名文件夾
try {
fs.rename(new Path("/user/intflag/test"), new Path("/user/intflag/test22"));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
2.7 HDFS文件詳情查看
/**
* 讀取HDFS上的文件信息
*/
@Test
public void readFileAtHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 讀取文件信息
try {
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus status = listFiles.next();
System.out.println("-----------------------------------");
System.out.println("文件名稱:"+status.getPath().getName());
System.out.println("塊的大小:"+status.getBlockSize());
System.out.println("內容長度:"+status.getLen());
System.out.println("文件權限:"+status.getPermission());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
-----------------------------------
文件名稱:asd.txt
塊的大小:134217728
內容長度:34
文件權限:rw-r--r--
-----------------------------------
文件名稱:hadoop-2.7.2.tar.gz
塊的大小:134217728
內容長度:197657687
文件權限:rw-r--r--
-----------------------------------
文件名稱:liugx.txt
塊的大小:134217728
內容長度:64
文件權限:rw-r--r--
-----------------------------------
文件名稱:x3.000
塊的大小:134217728
內容長度:592
文件權限:rw-r--r--
Process finished with exit code 0
2.8 HDFS文件夾查看
/**
* 讀取文件夾信息
*/
@Test
public void readFfolderAtHDFS() {
// 1 獲取文件系統
FileSystem fs = getFileSystem();
// 2 讀取文件夾信息
try {
FileStatus[] listStatus = fs.listStatus(new Path("/user/intflag/"));
for (FileStatus status : listStatus) {
if (status.isFile()) {
System.out.println("f----"+status.getPath().getName());
} else {
System.out.println("d----"+status.getPath().getName());
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3 關閉資源
closeFileSystem(fs);
}
}
3 通過IO流操作HDFS
3.1 HDFS文件上傳
/**
* 文件上傳到HDFS
*/
@Test
public void putFileToHDFS() {
// 1 獲取HDFS
FileSystem fs = getFileSystem();
try {
// 2 獲取輸出流
FSDataOutputStream fos = fs.create(new Path("/user/intflag/input/x3.000"));
// 3 獲取輸入流
FileInputStream fis = new FileInputStream(new File("D:/test/x3.000"));
// 4 流對接
IOUtils.copyBytes(fis, fos, new Configuration());
// 5 關閉流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5 關閉資源
closeFileSystem(fs);
}
}
3.2 HDFS文件下載
/**
* 下載文件
*/
@Test
public void getFileFromHDFS() {
// 1 獲取HDFS
FileSystem fs = getFileSystem();
try {
// 2 獲取輸入流
FSDataInputStream fis = fs.open(new Path("/user/intflag/input/liugx.txt"));
// 3 獲取輸出流
FileOutputStream fos = new FileOutputStream(new File("D:/test/liugx.txt"));
// 4 流對接
IOUtils.copyBytes(fis, fos, new Configuration());
// 5 關閉流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5 關閉資源
closeFileSystem(fs);
}
}
3.3 定位文件讀取
下載第一塊
/**
* 下載大文件-下載第一塊
*/
@Test
public void getFileFromHDFSSeek1() {
// 1 獲取HDFS
FileSystem fs = getFileSystem();
try {
// 2 獲取輸入流
FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
// 3 獲取輸出流
FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part1"));
// 4 流對接(只讀取128m)
byte[] buff = new byte[1024];
//1024 * 1024 * 128
int len = 1024 * 128;
for (int i = 0; i < len; i++) {
fis.read(buff);
fos.write(buff);
}
// 5 關閉流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5 關閉資源
closeFileSystem(fs);
}
}
下載第二塊
/**
* 下載大文件-下載第二塊
*/
@Test
public void getFileFromHDFSSeek2() {
// 1 獲取HDFS
FileSystem fs = getFileSystem();
try {
// 2 獲取輸入流
FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
// 3 獲取輸出流
FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part2"));
// 4 流對接(只讀取128m)
// 定位到128m
int len = 1024 * 1024 * 128;
fis.seek(len);
IOUtils.copyBytes(fis,fos,new Configuration());
// 5 關閉流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5 關閉資源
closeFileSystem(fs);
}
}
合并文件
打開DOS窗口,定位到下載后的位置,輸入以下命令合并文件
type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1
然后重命名文件hadoop-2.7.2.tar.gz.part1,將文件.part1去掉
打開文件驗證

浙公網安備 33010602011771號