分布式文件系统HDFS Shell命令和API编程1

分布式文件系统HDFS Shell命令和API编程1

、实验实现过程
重要知识点:

  1. Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop核心组件之一,如果已经安装了Hadoop,其中就已经包含了HDFS组件,不需要另外安装。
  2. 利用Shell命令与HDFS进行交互
    Hadoop支持很多Shell命令,其中fs是HDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。
    注意:
    命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
1)	hadoop fs
2)	hadoop dfs(已过期)
3)	hdfs dfs(常用)

hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
3.常用Shell命令解析

hdfs dfs -appendToFile <localsrc> ... <dst> 

可同时上传多个文件到HDFS里面

hdfs dfs -cat URI [URI ...] 

查看文件内容

hdfs dfs -chgrp [-R] GROUP URI [URI ...] 

修改文件所属组

hdfs dfs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...] 

修改文件权限

hdfs dfs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

修改文件所有者,文件所属组,其他用户的读、写、执行权限

hdfs dfs -copyFromLocal <localsrc> URI

复制文件到hdfs

hdfs dfs -copyToLocal [-ignorecrc] [-crc] URI <localdst> 

复制文件到本地

hdfs dfs -count [-q] <paths>

统计文件及文件夹数目

hdfs dfs -cp [-f] URI [URI ...] <dest>

Hadoop HDFS 文件系统间的文件复制

hdfs dfs -du [-s] [-h] URI [URI ...]

统计目录下的文件及大小

hdfs dfs -dus <args> 

汇总目录下的文件总大小

hdfs dfs -get [-ignorecrc] [-crc] <src> <localdst>

下载文件到本地

hdfs dfs -getmerge <src> <localdst> [addnl]

合并下载文件到本地

hdfs dfs -ls <args> 

查看目录

hdfs dfs -ls -R <args>

循环列出目录、子目录及文件信息

hdfs dfs -mkdir [-p] <paths> 

创建空白文件夹

dfs -moveFromLocal <localsrc> <dst> 

剪切文件到hdfs

hdfs dfs -moveToLocal [-crc] <src> <dst>

剪切文件到本地

hdfs dfs -mv URI [URI ...] <dest>

剪切hdfs文件

hdfs dfs -put <localsrc> ... <dst>

上传文件

hdfs dfs -rm [-skipTrash] URI [URI ...] 

删除文件/空白文件夹

hdfs dfs -rm -r [-skipTrash] URI [URI ...]

递归删除 删除文件及文件夹下的所有文件

hdfs dfs -setrep [-R] [-w] <numReplicas> <path>

修改副本数

hdfs dfs -stat URI [URI ...]

显示文件统计信息

hdfs dfs -tail [-f] URI

查看文件尾部信息

hdfs dfs -test -[ezd] URI

对PATH进行如下类型的检查:
-e PATH是否存在,如果PATH存在,返回0,否则返回1
-z 文件是否为空,如果长度为0,返回0,否则返回1
-d 是否为目录,如果PATH为目录,返回0,否则返回1

hdfs dfs -text <src> 

查看文件内容

hdfs dfs -touchz URI [URI ...]
创建长度为0的空文件
实验内容与步骤:

  1. 配置hadoop的环境变量:
    首先,hadoop shell命令在/bigdata/hadoop-3.1.1/bin目录下,编辑/etc/profile配置文件,增加如下内容:
sudo  vi  /etc/profile
export JAVA_HOME=/opt/java/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_HOME=/bigdata/hadoop-3.1.1 

重新读取:
source /etc/profile

  1. 命令查看方式:
    我们可以在终端输入如下命令,查看dfs总共支持了哪些命令:
    hdfs dfs

在终端输入如下命令,可以查看具体某个命令的作用
例如:我们查看put命令如何使用,可以输入如下命令:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3. 目录操作
需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本实验全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

在这里插入图片描述
该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
“/user/hadoop”目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:
在这里插入图片描述
在这里插入图片描述

下面,可以使用如下命令创建一个input目录:
在这里插入图片描述
在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:
在这里插入图片描述
可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):
在这里插入图片描述
上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。

  1. 文件操作
    在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
    首先,使用vim编辑器,在本地”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下:

Hadoop

然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下

在这里插入图片描述

可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:

下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/Downloads/”这个目录下,命令如下:
在这里插入图片描述在这里插入图片描述

可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:

最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:

  1. 利用Web界面管理HDFS
    打开Linux自带的Firefox浏览器,点击此链接HDFS的Web界面,即可看到HDFS的web管理界面,访问地址:localhost:50070

  2. 利用Java API与HDFS进行交互

Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。
http://hadoop.apache.org/docs/stable/api/

利用Java API进行交互,需要利用软件Eclipse编写Java程序。

  1. 在Ubuntu中安装Eclipse,大数据实验准备已经安装,请参考第一次试验内容。
  2. 在Eclipse创建项目
  3. 第一次打开Eclipse,需要填写workspace(工作空间),用来保存程序所在的位置,这里按照默认,不需要改动,如下图。点击“OK”按钮,进入Eclipse软件。

可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。
4) Eclipse启动以后

  1. 选择“File->New->Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。

在这里插入图片描述

在“Project name”后面输入工程名称“HDFSTest”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/HDFSTest”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_181。然后,点击界面底部的“Next>”按钮,进入下一步的设置。
在这里插入图片描述
6) 为项目添加需要用到的JAR包,进入下一步的设置以后,会弹出如下图所示界面。
!](https://img-blog.csdnimg.cn/20191115102451742.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTcyNTk0Ng==,size_16,color_FFFFFF,t_70)
7) 需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFS的Java API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本实验而言,就是在“/bigdata/hadoop-3.1.1/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。
在这里插入图片描述

  1. 在该界面中,上面左侧的一排目录按钮(即“yarn”、“tools”、“mapreduce”、“hdfs”、“common”和“client”),当点击某个目录按钮时,就会在下面列出该目录的内容。
    为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
    (1)”/bigdata/hadoop-3.1.1/share/hadoop/common”目录下的hadoop-common-3.1.1.jar和haoop-nfs-3.1.1.jar;
    (2)/bigdata/hadoop-3.1.1/share/hadoop/common/lib”目录下的所有JAR包;
    (3)“/bigdata/hadoop-3.1.1/share/hadoop/hdfs”目录下的haoop-hdfs-3.1.1.jar、haoop-hdfs-client-3.1.1.jar和haoop-hdfs-nfs-3.1.1.jar;
    (4)“/bigdata/hadoop-3.1.1/share/hadoop/hdfs/lib”目录下的所有JAR包。
    比如,如果要把“/bigdata/hadoop-3.1.1/share/hadoop/common”目录下的hadoop-common-3.1.1.jar和haoop-nfs-3.1.1.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容(如下图所示)。

  2. 请在界面中用鼠标点击选中hadoop-common-3.1.1.jar和haoop-nfs-3.1.1.jar,然后点击界面右下角的“确定”按钮,就可以把这两个JAR包增加到当前Java工程中,出现的界面如图所示。

  3. 从这个界面中可以看出,hadoop-common-3.1.1.jar和haoop-nfs-3.1.1.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSTest的创建。

  4. 编写Java应用程序代码

下面编写一个Java应用程序,用来检测HDFS中是否存在一个文件。
请在Eclipse工作界面左侧的“Package Explorer”面板中(如图所示),找到刚才创建好的工程名称“HDFSTest”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New->Class”菜单。

选择“New->Class”菜单以后会出现如图所示界面。

在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“HDFSFileIfExist”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮,出现如图所示界面。

在这里插入图片描述
可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
    public static void main(String[] args){
        try{
            String fileName = "test";
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://localhost:9000");
            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            if(fs.exists(new Path(fileName))){
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
 
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

该程序用来测试HDFS中是否存在一个文件,其中有一行代码:

String fileName = “test”
这行代码给出了需要被检测的文件名称是“test”,没有给出路径全称,表示是采用了相对路径,实际上就是测试当前登录Linux系统的用户hadoop,在HDFS中对应的用户目录下是否存在test文件,也就是测试HDFS中的“/user/hadoop/”目录下是否存在test文件。

  1. 编译运行程序
    在这里插入图片描述
    在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop:start-dfs.sh
    不启动会报错:
    在这里插入图片描述
    在这里插入图片描述
    现在就可以编译运行上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”。
    程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如图所示)。由于目前HDFS的“/user/hadoop”目录下还没有test文件,因此,程序运行结果是“文件不存在”。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值