目录

  • HDFS 的常用SHELL命令实操
  • 基本语法
  • 上传
  • 下载
  • HDFS直接操作
  • HDFS 的 API 操作
  • 下载依赖工具包
  • 配置HADOOP_HOME环境变量
  • 搭建工程
  • HDFS抽取常用代码段
  • HDFS创建目录
  • HDFS 文件上传
  • HDFS 文件下载
  • HDFS 文件更名和移动
  • HDFS 删除文件和目录
  • HDFS 文件详情查看
  • HDFS 文件和文件夹判断


HDFS 的常用SHELL命令实操

基本语法

  • hadoop fs 具体命令
  • hdfs dfs 具体命令

上传

-moveFromLocal:从本地剪切粘贴到 HDFS

  • hadoop fs -moveFromLocal 本地资源 目标资源
  • 例子:hadoop fs -moveFromLocal ./text.txt /text

-copyFromLocal:从本地文件系统中拷贝文件到 HDFS 路径去

  • hadoop fs -copyFromLocal 本地资源 目标资源
  • 例子:hadoop fs -copyFromLocal ./text.txt /text

-put:等同于 copyFromLocal,生产环境更习惯用 put

  • hadoop fs -put 本地资源 目标资源
  • 例子:hadoop fs -put ./text.txt /text

-appendToFile:追加一个文件到已经存在的文件末尾

  • hadoop fs -appendToFile 本地资源 目标资源
  • 例子:hadoop fs -appendToFile ./text.txt /text

下载

-copyToLocal:从 HDFS 拷贝到本地

  • hadoop fs -copyToLocal 目标资源 本地资源
  • hadoop fs -copyToLocal /text/text.txt ./

-get:等同于 copyToLocal,生产环境更习惯用 get

  • hadoop fs -get 目标资源 本地资源
  • hadoop fs -get /text/text.txt ./

HDFS直接操作

-ls: 显示目录信息

  • hadoop fs -ls /

-cat:显示文件内容

  • hadoop fs -cat /text/text.txt

-chgrp、-chmod、-chown:Linux 文件系统中的用法一样,修改文件所属权限

  • hadoop fs -chown root:root /text/text.txt

-mkdir:创建路径

  • hadoop fs -mkdir /text

-cp:从 HDFS 的一个路径拷贝到 HDFS 的另一个路径

  • hadoop fs -cp /text/text.txt /test

-mv:在 HDFS 目录中移动文件

  • hadoop fs -mv /text/text.txt /test

-tail:显示一个文件的末尾 1kb 的数据

  • hadoop fs -tail /text/text.txt

-rm:删除文件或文件夹

  • hadoop fs -rm /text/text.txt

-rm -r:递归删除目录及目录里面内容

  • hadoop fs -rm -r /text

-du 统计文件夹的大小信息

  • hadoop fs -du -s /test:看整个文件夹大小
  • hadoop fs -du -h /test:看文件夹内部文件大小

-setrep:设置 HDFS 中文件的副本数量

  • hadoop fs -setrep 10 /test/test.txt
  • 这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode 的数量。如果只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

HDFS 的 API 操作

下载依赖工具包

下载hadoop依赖工具包:

配置HADOOP_HOME环境变量

hdfs数据迁移后怎么通过hive查询 hdfs迁移命令_System

hdfs数据迁移后怎么通过hive查询 hdfs迁移命令_hadoop_02

验证Hadoop环境变量是否正常,双击winutils.exe,没弹出报错,说明成功

hdfs数据迁移后怎么通过hive查询 hdfs迁移命令_hadoop_03

搭建工程

创建maven工程,引入依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.3</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
</dependencies>

配置日志级别,在项目的src/main/resources 目录下,新建一个文件,命名为“log4j.properties”,在文件中填入

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

HDFS抽取常用代码段

private FileSystem fs;

@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
    // 连接的集群地址
    URI uri = new URI("hdfs://hadoop102:8020");
    // 创建一个配置文件
    Configuration configuration = new Configuration();
    configuration.set("dfs.replication", "2");
    // 用户
    String user = "root";
    // 获取客户端对象
    this.fs = FileSystem.get(uri, configuration, user);

}

@After
public void close() throws IOException {
    // 关闭资源
    this.fs.close();
}

HDFS创建目录

// 创建目录
@Test
public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
    fs.mkdirs(new Path("/xiyou/huaguoshan"));
}

HDFS 文件上传

参数优先级从低到高:hdfs-default.xml=>hdfs-site.xml=>项目资源目录下的配置文件=>代码里的配置文件

hdfs数据迁移后怎么通过hive查询 hdfs迁移命令_System_04

// 上传文件
@Test
public void testPut() throws IOException {
    /*
        boolean delSrc:是否删除源数据
        boolean overwrite:是否允许覆盖
        Path src:源数据路径
        Path dst:目的地路径
        参数优先级从低到高:hdfs-default.xml=>hdfs-site.xml=>项目资源目录下的配置文件=>代码里的配置文件
     */
    fs.copyFromLocalFile(false, true, new Path("E:\\sunwukong.txt"), new Path("hdfs://hadoop102/xiyou/huaguoshan"));
}

HDFS 文件下载

// 文件下载
@Test
public void testGet() throws IOException {
    /*
        boolean delSrc:是否删除源数据
        Path src:源数据地址
        Path dst:目标数据地址
        boolean useRawLocalFileSystem:是否开启本地文件校验
     */
    fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou/huaguoshan"), new Path("E:\\"), true);
}

HDFS 文件更名和移动

// 文件的更名和移动
@Test
public void testMv() throws IOException {
    /*
        Path src:源文件路径
        Path dst:目标文件路径
     */
    // 对文件名称的修改
    fs.rename(new Path("/input/word1.txt"), new Path("/input/word.txt"));
    // 对文件移动并修改
    fs.rename(new Path("/input/word1.txt"), new Path("/word.txt"));
    // 对目录更名
    fs.rename(new Path("/input"), new Path("/input"));
}

HDFS 删除文件和目录

// 删除
@Test
public void testRm() throws IOException {
    /*
        Path f:要删除的路径
        boolean recursive:是否递归删除,删除非空目录需要递归
     */
    fs.delete(new Path("hdfs://hadoop102/xiyou"), true);
}

HDFS 文件详情查看

// 获取文件详细信息
@Test
public void fileDetail() throws IOException {
    /*
        final Path f:文件目录
        final boolean recursive:递归目录下文件信息
     */

    // 获取所有文件信息
    RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

    // 遍历文件
    while (listFiles.hasNext()) {
        LocatedFileStatus fileStatus = listFiles.next();
        System.out.println("==========" + fileStatus.getPath() + "==========");
        System.out.println(fileStatus.getPermission());
        System.out.println(fileStatus.getOwner());
        System.out.println(fileStatus.getGroup());
        System.out.println(fileStatus.getLen());
        System.out.println(fileStatus.getModificationTime());
        System.out.println(fileStatus.getReplication());
        System.out.println(fileStatus.getBlockSize());
        System.out.println(fileStatus.getPath().getName());
        // 获取存储块信息
        BlockLocation[] blockLocations = fileStatus.getBlockLocations();
        System.out.println(Arrays.toString(blockLocations));
    }
}

HDFS 文件和文件夹判断

// 判断是文件夹还是文件
@Test
public void testFile() throws IOException {
    FileStatus[] listStatus = fs.listStatus(new Path("/"));
    for (FileStatus status : listStatus) {
        if (status.isFile()) {
            System.out.println("文件:" + status.getPath().getName());
        } else {
            System.out.println("目录:" + status.getPath().getName());
        }
    }
}