文章目录
一、HDFS操作常用Shell命令(一)查看命令使用方法(二)HDFS目录操作目录操作文件操作目录拷贝
二、利用HDFS的Web管理界面三、HDFS编程实例小结
四、参考资料
使用的工具 平台:阿里云轻量级应用服务器 Hadoop 3.3.0
一、HDFS操作常用Shell命令
(一)查看命令使用方法
启动Hadoop 登录Linux系统,打开一个终端 使用命令cd /usr/local/hadoop
sudo ./sbin/start-dfs.sh
运行结果 查看hdfs dfs总共支持哪些操作 使用命令cd /usr/local/hadoop
sudo ./bin/hdfs dfs
运行结果 查看某个命令的作用 举例说明 查询put命令的具体用法 使用命令./bin/hdfs dfs –help put
运行结果
(二)HDFS目录操作
目录操作
HDFS中创建用户目录 命令内容./bin/hdfs dfs –mkdir –p /user/hadoop
“/user/hadoop”目录就成为hadoop用户对应的用户目录 显示HDFS中与当前用户hadoop对应的用户目录下的内容方法1
./bin/hdfs dfs –ls .
方法2
./bin/hdfs dfs –ls /user/hadoop
运行结果 列出HDFS上的所有目录 命令内容./bin/hdfs dfs –ls
创建目录 创建一个input目录./bin/hdfs dfs –mkdir -p input
HDFS的根目录下创建一个名称为input的目录./bin/hdfs dfs –mkdir -p /input
删除目录 例如: 删除在HDFS中创建的“/input”目录./bin/hdfs dfs –rm –r /input
文件操作
上传文件 本地/home/hadoop创建一个文件myLocalFile.txtsudo nano /home/hadoop/myLocalFile.txt
文件内容Hadoop
Spark
XMU DBLAB
上次文件./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt input
查看文件是否上传成功./bin/hdfs dfs -ls input
查看文件内容./bin/hdfs dfs –cat input/myLocalFile.txt
下载文件 将上面的myLocalFile.txt下载到本地/home目录下./bin/hdfs dfs -get input/myLocalFile.txt /home
查看下载的文件及内容cd ~
cd /home
ls
cat myLocalFile.txt
目录拷贝
把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录 例如: 把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中
./bin/hdfs dfs -cp input/myLocalFile.txt /input
二、利用HDFS的Web管理界面
进入web管理界面的方法 在浏览器中输入 公网ip:9870 , 跳转到dfs页面,其中端口号是根据自己在按照hadoop的时候,文件配置过程中,自己进行配置的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424165814973.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjc5NTc5,size_16,color_FFFFFF,t_70)
三、HDFS编程实例
问题描述 假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,需要从该目录中过滤出所有后缀名不为“.abc”的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件 “hdfs://localhost:9000/user/hadoop/merge.txt”
Eclipse中创建项目 打开Eclipse,选择File->New->other 进行工程的设置 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424200730974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjc5NTc5,size_16,color_FFFFFF,t_70) 添加需要用到的JAR包 首先选中Modulepath,然后点击Add External JARs 选择对应jar包所在的路径 点击Finish,完成工程创建 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424201929606.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjc5NTc5,size_16,color_FFFFFF,t_70) 编写Java应用程序 创建一个class 编写代码 import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
/**
* 过滤掉文件名满足特定条件的文件
*/
class MyPathFilter implements PathFilter {
String reg = null;
MyPathFilter(String reg) {
this.reg = reg;
}
public boolean accept(Path path) {
if (!(path.toString().matches(reg)))
return true;
return false;
}
}
/***
* 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件
*/
public class MergeFile {
Path inputPath = null; //待合并的文件所在的目录的路径
Path outputPath = null; //输出文件的路径
public MergeFile(String input, String output) {
this.inputPath = new Path(input);
this.outputPath = new Path(output);
}
public void doMerge() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
//下面过滤掉输入目录中后缀为.abc的文件
FileStatus[] sourceStatus = fsSource.listStatus(inputPath,
new MyPathFilter(".*\\.abc"));
FSDataOutputStream fsdos = fsDst.create(outputPath);
PrintStream ps = new PrintStream(System.out);
//下面分别读取过滤之后的每个文件的内容,并输出到同一个文件中
for (FileStatus sta : sourceStatus) {
//下面打印后缀不为.abc的文件的路径、文件大小
System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen()
+ " 权限:" + sta.getPermission() + " 内容:");
FSDataInputStream fsdis = fsSource.open(sta.getPath());
byte[] data = new byte[1024];
int read = -1;
while ((read = fsdis.read(data)) > 0) {
ps.write(data, 0, read);
fsdos.write(data, 0, read);
}
fsdis.close();
}
ps.close();
fsdos.close();
}
public static void main(String[] args) throws IOException {
MergeFile merge = new MergeFile(
"hdfs://localhost:9000/user/hadoop/",
"hdfs://localhost:9000/user/hadoop/merge.txt");
merge.doMerge();
}
}
启动运行Hadoop cd /usr/local/hadoop
./sbin/start-dfs.sh
编译运行程序 点击运行后,选择Run As->Java 出现jar包缺少的报错的解决方法
导入相关的jar包,首先进入/usr/local/hadoop/share/hadoop/common/lib,使用ctr+A全选,将其中所有的包,都导入进去。接着,进入/usr/local/hadoop/share/hadoop/hdfs,将hadoop-hdfs-client-3.1.1.jar导入
Permission denied: user=Admin, access=WRITE, inode="/":root:supergroup:drwxr-xr-x 解决方法 sudo ./bin/hdfs dfs -chmod -R 777 /
运行结果 使用命令查看结果 cd /usr/local/hadoop
./bin/hdfs dfs -ls /user/hadoop
./bin/hdfs dfs -cat /user/hadoop/merge.txt
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210425232015281.png) web browser结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210425231617508.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjc5NTc5,size_16,color_FFFFFF,t_70) 应用程序的部署 创建一个目录,用于存放应用程序 cd /usr/local/hadoop
mkdir myapp
在eclipse中,选中工程后,右键选择export 选择Java->Runable JAR file,再点击Next 填写保存路径及jar的文件名,然后点击Finish 选择OK 问题描述: /usr/local/hadoop/myapp/HDFSExample.jar(Permission denined) 解决方法 在终端下,使用该命令chmod -R 777 /usr/local/hadoop/myapp 重新开始应用部署,出现下面弹窗,选择OK即可 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426090749756.png) 部署的使用 查看部署的jar cd /usr/local/hadoop/myapp
ls
部署的应用 删除原来利用eclipse生成的结果 cd /usr/local/hadoop
./bin/hdfs dfs -rm /user/hadoop/merge.txt
使用hadoop jar命令运行程序 cd /usr/local/hadoop
./bin/hadoop jar ./myapp/HDFSExample.jar
查看运行结果 cd /usr/local/hadoop
./bin/hdfs dfs -ls /user/hadoop
./bin/hdfs dfs -cat /user/hadoop/merge.txt
其结果与上面一致,不过要注意class File version的问题,如果版本不一致,就会出现报错
小结
了解到HDFS操作常用的Shell命令,其中主要包括目录操作命令和文件操作命令等。同时,还掌握了如何利用HDFS的Web管理界面,以可视化的方式查看HDFS的相关信息。同时,也初步了解到如何使用Eclipse开发操作HDFS的Java应用程序。
四、参考资料
http://dblab.xmu.edu.cn/blog/2798-2/
|