hadoop实验2-HDFS Shell操作

一、实验目的

1、区分hadoop fs、hadoop dfs和hdfs dfs之间的区别

2、掌握HDFS Shell命令对文件的基本操作(比如文件的创建、修改、删除、修改权限等)

二、实验内容

1、查看HDFS文件

2、对HDFS目录操作

3、对HDFS文件操作

4、改变HDFS文件权限

三、实验要求

学生的服务器配置及版本使用

服务器 系统 CPU 内存 JDK HADOOP
master centos7 2核 4G jdk1.8 hadoop-3.2.1
slave1 centos7 2核 4G jdk1.8 hadoop-3.2.1
slave2 centos7 2核 4G jdk1.8 hadoop-3.2.1

学生的常用电脑安装环境及版本使用

电脑操作系统 浏览器
windows64位系统 谷歌或者火狐

四、准备知识

(一)HDFS Shell命令中的hadoop fs、hadoop dfs和hdfs dfs之间的区别?

hadoop fs:适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统。

hadoop dfs:只适用于HDFS文件系统。

hdfs dfs:跟hadoop dfs命令作用是一样的,也只适用于HDFS文件系统。

(二)常用的HDFS-shell命令表

选项名称 使用格式 含义
-ls -ls<路径> 查看指定目录的当前目录结构
-ls -R -ls -R<路径> 递归查看指定路径的目录结构
-du -du<路径> 统计目录下文件大小
-dus -dus<路径> 汇总统计目录下文件(夹)大小
-count -count[-q]<路径> 统计文件夹数量
-mv -mv<源路径><目的路径> 移动
-cp -cp<源路径><目的路径> 复制
-rm -rm[-skipTrash]<路径> 删除文件或者空白文件夹
-rmr -rmr[-skipTrash]<路径> 递归删除
-put -put[多个linux上的文件><hdfs路径> 上传文件
-copyFromLocal -copyFromLocal<多个linux上的文件><hdfs路径> 从本地复制
-moveFromLocal -moveFromLocal<多个linux上的文件><hdfs路径> 从本地移动
-getmerge -getmerge<源路径><linux路径> 合并到文件
-cat -cat<hdfs文件内容> 查看文件内容
-text -text<hdfs文件内容> 查看文件内容
-mkdir -mkdir<hdfs路径> 创建空白文件夹
-setrep -setrep[-r][-w]<副本数><路径> 修改副本文件
-touchz -touchz<文件路径> 创建空白文件
-stat -stat[format]<路径> 显示文件统计信息
-tail -tail[-f]<文件> 查看文件尾部信息
-chmod -chmod[-R]<权限模式>[路径] 修改权限
-chown -chown[-R][属主][:[属组]]路径 修改属主
-chgrp -chgrp[-R] 属组名称 路径 修改属组
-help -help [命令选项] 帮助

五、实验步骤

(一)验证集群是否启动

1、查看集群进程

1
xcall jps

image-20230925164741105

2、在master节点看到NameNode进程,在slave1,slave2进程看到DataNode进程,即集群已经启动,若没有相关进程,需要用以下命令启动。

1
start-all.sh

(二)查看HDFS文件

3、递归列出HDFS根目录下多层文件夹的内容

1
hadoop fs -ls -R /

image-20230925165351700

(三)对HDFS目录操作

4、在HDFS文件中创建目录/user/hadoop

1
hadoop fs -mkdir -p /user/hadoop

5、递归列出HDFS根目录下多层文件夹的内容

1
hadoop fs -ls -R /

image-20230925165422580

6、删除HDFS文件中删除data文件夹

1
hadoop fs -rm -r /data

image-20230925165456616

(四)对HDFS文件操作

在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。

首先,使用vi编辑器,在本地Linux文件系统的“/export/data”目录下创建一个文件text.txt,里面可以随意输入一些单词.

7、在master节点创建文件夹/export/data

1
mkdir -p /export/data

8、在master节点创建文件text.txt,并加入一些内容在里面。

1
vi /export/data/text.txt

9、添加下列内容

1
2
3
Hadoop
Spark
XMU DBLAB

10、查看text.txt文件内容

1
cat /export/data/text.txt

image-20230925165743717

11、上传本地text.txt文件到HDFS文件的/user/hadoop目录中

1
hadoop fs -put /export/data/text.txt /user/hadoop

12、查看HDFS文件中text.txt的文件内容

1
hadoop fs -cat /user/hadoop/text.txt  

image-20230925165851919

13、下面演示把HDFS文件上的text.txt文件下载到本地文件系统中的/export/data/download目录下。

1
2
3
4
mkdir /export/data/download


hadoop fs -get /user/hadoop/text.txt /export/data/download/

14、到本地文件目录中查看text.txt文件内容

1
cat /export/data/download/text.txt 

image-20230925165946132

(五)改变HDFS文件权限

15、把HDFS文件上的text.txt文件賦予所有权限

1
hadoop fs -chmod 777 /user/hadoop/text.txt

16、查看文件的权限

1
hadoop fs -ls /user/hadoop/

image-20230925170014812

六、实验总结

实验完成思考以下问题?

1、HDFS文件系统与本地文件系统有什么区别?

2、如何在HDFS文件系统上递归创建文件夹?请至少写出两种不同的命令。

实验三:Java代码实现读写HDFS文件

一、实验目的

1、掌握使用IDEA工具创建项目

2、理解HDFS读写原理

3、熟悉使用java编写Api操作HDFS文件系统

4、熟悉IDEA工具的打包方法

5、掌握jar包在集群上的运行方法

二、实验内容

1、在IDEA编程工具下创建新的Java项目

2、在IDEA编程工具下导入常用的Jar包

3、在IDEA环境下编写读写HDFS文件的代码

4、使用IDEA打包代码

5、导入jar包在集群运行

三、实验要求

学生的服务器配置及版本使用

服务器 系统 CPU 内存 JDK HADOOP
master centos7 2核 4G jdk1.8 hadoop-3.2.1
slave1 centos7 2核 4G jdk1.8 hadoop-3.2.1
slave2 centos7 2核 4G jdk1.8 hadoop-3.2.1

学生的常用电脑安装环境及版本使用

电脑操作系统 浏览器
windows64位系统 谷歌或者火狐

四、准备知识

(一)HDFS写流程

  客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本。

IMG_256

(1)跟NN通信请求上传文件,NN检查目标文件是否存在,父目录是否存在

(2)NN返回是否可以上传

(3)client会先对文件进行切分,比如一个block块128M,文件300M就会被切分成3个块,两个128M,一个44M。请求第一个block该传输到哪些DN服务器上。

(4)NN返回DN的服务器。

(5)client请求一个台DN上传数据(RPC调用,建立pipeline),第一个DN收到请求会继续调用第二个DN,然后第二个调用第三个DN,将整个pipeline建立完成,逐级返回客户端。

(6)client开始传输block(先从磁盘读取数据存储到一个本地内存缓存),以packet为单位(一个packet为64kb),写入数据的时候datanode会进行数据校验,并不是通过packet为单位校验,而是以chunk为单位校验(512byte),第一个DN收到第一个packet就会传给第二台,第二台传给第三台;第一台每传一个packet就会放入一个应答队列等待应答。

(7)当一个block传输完成时,client再次请求NN上传第二个block的服务器。

(二)HDFS读流程

  客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件。

IMG_257

(1)跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器。

(2)挑选一台DN(就近原则,然后随机)服务器,请求建立socket流。

(3)DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验)

(4)客户端以packet为单位接收,现在本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件。

五、实验步骤

新建Java项目

选择Maven,SDK选择本地的java,点击Next

image-20230925170843758

项目配置

配置pom文件

1
2
3
4
5
6
7
8
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>

效果图

image-20230925171112595

21、加载pom文件,根据箭头的指示进行

image-20230925171157992

编写HDFS代码

22、新建一个WriteFilejava类,根据箭头的顺序创建

image-20230925171431525

23、在弹出文件中粘贴下列代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.xunfang;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.IOException;

import java.net.URI;


public class WriteFile {


public static void main(String[] args) throws IOException {

String content = "Hello,xunfang!\n";

String dest = "hdfs://master:8020/user/hadoop/text1.txt";


Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);

FSDataOutputStream out = fileSystem.create(new Path(dest));

out.write(content.getBytes("UTF-8"));

out.close();


}

}

效果图

image-20230925171731437

25、根据创建WriteFile的步骤,新建一个ReadFilejava类,输入下列代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.xunfang;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.*;

import java.net.URI;


public class ReadFile {

public static void main(String[] args) throws IOException {

String dest = "hdfs://master:8020/user/hadoop/text1.txt";

Configuration configuration = new Configuration();

FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);

FSDataInputStream in = fileSystem.open(new Path(dest));

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

String line = null;

while ((line = bufferedReader.readLine()) != null) {

System.out.println(line);

}

in.close();

}

}

(四)打包

27、打包,操作顺序按照箭头的指示进行

image-20230925172242328

28、打包成功

image-20230925172355343

29、拷贝jar包,右键复制

image-20230925172445808

30、将jar包粘贴任意地方,可以是桌面或者文件夹,将鼠标右键粘贴即可

image-20230925172552137

(五)将jar包上传至服务器使用集群运行

32、可以使用XFTP工具上传jar包到master节点

1
cd /export/data/

image-20230925172832292

34、查看集群进程

1
xcall jps

image-20230925172906049

35、如果和图中显示的进程数不同,在master窗口运行下述命令

1
start-all.sh

36、查看HDFS的/user/hadoop目录下是否有text.txt文件

1
hadoop fs -ls /user/hadoop

image-20230925172935919

37、如果存在文件可以用下述命令删除

1
hadoop fs -rm -r -f /user/hadoop/text.txt

38、在jar包当前路径下运行jar包,先执行写HDFS的代码(com.xunfang.WriteFile为类名路径)

1
hadoop jar hadoopReadWrite-1.0-SNAPSHOT.jar com.xunfang.WriteFile

39、查看内容是否写进去了:

1
hadoop fs -cat /user/hadoop/text1.txt

40、效果图

image-20230925173313054

41、执行读HDFS的代码:

1
hadoop jar hadoopReadWrite-1.0-SNAPSHOT.jar com.xunfang.ReadFile

42、效果图

image-20230925173449040

六、实验总结

实验完成思考以下问题?

关于HDFS的其他相关操作(上传文件,删除文件)(使用Maven版本来实现)