使用的工具
平台:阿里云轻量级应用服务器
Hadoop 3.3.0

一、HDFS操作常用Shell命令

(一)查看命令使用方法

  1. 启动Hadoop
    登录Linux系统,打开一个终端
    使用命令
    cd /usr/local/hadoop
    sudo ./sbin/start-dfs.sh
    
    运行结果在这里插入图片描述
  2. 查看hdfs dfs总共支持哪些操作
    使用命令
    cd /usr/local/hadoop
    sudo ./bin/hdfs dfs
    
    运行结果
    在这里插入图片描述
  3. 查看某个命令的作用
    举例说明
    查询put命令的具体用法
    使用命令
    ./bin/hdfs dfs –help put
    
    运行结果
    在这里插入图片描述

(二)HDFS目录操作

目录操作

  1. 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
    
    运行结果
    在这里插入图片描述
  2. 列出HDFS上的所有目录
    命令内容
    ./bin/hdfs dfs –ls
    
  3. 创建目录
    创建一个input目录
    ./bin/hdfs dfs –mkdir -p input
    
    HDFS的根目录下创建一个名称为input的目录
    ./bin/hdfs dfs –mkdir -p /input
    
    在这里插入图片描述
  4. 删除目录
    例如:
    删除在HDFS中创建的“/input”目录
    ./bin/hdfs dfs –rm –r /input
    
    在这里插入图片描述

文件操作

  1. 上传文件
    本地/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
    
    在这里插入图片描述
  2. 下载文件
    将上面的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”

  1. Eclipse中创建项目
    打开Eclipse,选择File->New->other
    在这里插入图片描述
    进行工程的设置
    在这里插入图片描述

  2. 添加需要用到的JAR包
    首先选中Modulepath,然后点击Add External JARs
    在这里插入图片描述
    选择对应jar包所在的路径
    在这里插入图片描述
    点击Finish,完成工程创建
    在这里插入图片描述

  3. 编写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
    
  4. 编译运行程序
    点击运行后,选择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结果
    在这里插入图片描述

  5. 应用程序的部署
    创建一个目录,用于存放应用程序

    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即可
    在这里插入图片描述

  6. 部署的使用
    查看部署的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/

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐