HDFS操作方法和基础编程——文件和目录的操作
文章目录一、HDFS操作常用Shell命令(一)查看命令使用方法(二)HDFS目录操作二、利用HDFS的Web管理界面三、HDFS编程实例一、HDFS操作常用Shell命令(一)查看命令使用方法启动Hadoop登录Linux系统,打开一个终端使用命令cd /usr/local/hadoopsudo ./sbin/start-dfs.sh运行结果查看hdfs dfs总共支持哪些操作使用命令cd /u
使用的工具
平台:阿里云轻量级应用服务器
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中创建用户目录
命令内容
“/user/hadoop”目录就成为hadoop用户对应的用户目录./bin/hdfs dfs –mkdir –p /user/hadoop
显示HDFS中与当前用户hadoop对应的用户目录下的内容
运行结果方法1 ./bin/hdfs dfs –ls . 方法2 ./bin/hdfs dfs –ls /user/hadoop
- 列出HDFS上的所有目录
命令内容./bin/hdfs dfs –ls
- 创建目录
创建一个input目录
HDFS的根目录下创建一个名称为input的目录./bin/hdfs dfs –mkdir -p input
./bin/hdfs dfs –mkdir -p /input
- 删除目录
例如:
删除在HDFS中创建的“/input”目录./bin/hdfs dfs –rm –r /input
文件操作
- 上传文件
本地/home/hadoop创建一个文件myLocalFile.txt
文件内容sudo 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的时候,文件配置过程中,自己进行配置的
三、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
进行工程的设置
-
添加需要用到的JAR包
首先选中Modulepath,然后点击Add External JARs
选择对应jar包所在的路径
点击Finish,完成工程创建
-
编写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
web browser结果
-
应用程序的部署
创建一个目录,用于存放应用程序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即可
-
部署的使用
查看部署的jarcd /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应用程序。
四、参考资料
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)