hadoop实验2-HDFS Shell操作
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 |
2、在master节点看到NameNode进程,在slave1,slave2进程看到DataNode进程,即集群已经启动,若没有相关进程,需要用以下命令启动。
1 | start-all.sh |
(二)查看HDFS文件
3、递归列出HDFS根目录下多层文件夹的内容
1 | hadoop fs -ls -R / |
(三)对HDFS目录操作
4、在HDFS文件中创建目录/user/hadoop
1 | hadoop fs -mkdir -p /user/hadoop |
5、递归列出HDFS根目录下多层文件夹的内容
1 | hadoop fs -ls -R / |
6、删除HDFS文件中删除data文件夹
1 | hadoop fs -rm -r /data |
(四)对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 | Hadoop |
10、查看text.txt文件内容
1 | cat /export/data/text.txt |
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 |
13、下面演示把HDFS文件上的text.txt文件下载到本地文件系统中的/export/data/download目录下。
1 | mkdir /export/data/download |
14、到本地文件目录中查看text.txt文件内容
1 | cat /export/data/download/text.txt |
(五)改变HDFS文件权限
15、把HDFS文件上的text.txt文件賦予所有权限
1 | hadoop fs -chmod 777 /user/hadoop/text.txt |
16、查看文件的权限
1 | hadoop fs -ls /user/hadoop/ |
六、实验总结
实验完成思考以下问题?
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的副本。
(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并在客户端本地进行数据追加合并从而获得整个文件。
(1)跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器。
(2)挑选一台DN(就近原则,然后随机)服务器,请求建立socket流。
(3)DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验)
(4)客户端以packet为单位接收,现在本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件。
五、实验步骤
新建Java项目
选择Maven,SDK选择本地的java,点击Next
项目配置
配置pom文件
1 | <dependencies> |
效果图
21、加载pom
文件,根据箭头的指示进行
编写HDFS代码
22、新建一个WriteFile
java类,根据箭头的顺序创建
23、在弹出文件中粘贴下列代码:
1 | package com.xunfang; |
效果图
25、根据创建WriteFile
的步骤,新建一个ReadFile
java类,输入下列代码
1 | package com.xunfang; |
(四)打包
27、打包,操作顺序按照箭头的指示进行
28、打包成功
29、拷贝jar包,右键复制
30、将jar包粘贴任意地方,可以是桌面或者文件夹,将鼠标右键粘贴即可
(五)将jar包上传至服务器使用集群运行
32、可以使用XFTP工具上传jar包到master节点
1 | cd /export/data/ |
34、查看集群进程
1 | xcall jps |
35、如果和图中显示的进程数不同,在master窗口运行下述命令
1 | start-all.sh |
36、查看HDFS的/user/hadoop目录下是否有text.txt文件
1 | hadoop fs -ls /user/hadoop |
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、效果图
41、执行读HDFS的代码:
1 | hadoop jar hadoopReadWrite-1.0-SNAPSHOT.jar com.xunfang.ReadFile |
42、效果图
六、实验总结
实验完成思考以下问题?
关于HDFS的其他相关操作(上传文件,删除文件)(使用Maven版本来实现)