大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制

Posted @从一到无穷大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制相关的知识,希望对你有一定的参考价值。

文章目录


1 HDFS 概述

1.1 HDFS 产生背景及定义

HDFS 产生背景

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS 只是分布式文件管理系统中的一种。

HDFS 定义

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS 的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

1.2 HDFS 优缺点

HDFS优点

(1)高容错性:数据自动保存多个副本。它通过增加副本的形式,提高容错性。某一个副本丢失以后,它可以自动恢复。
(2)适合处理大数据:数据规模上能够处理数据规模达到GB、TB、甚至PB级别的数据;文件规模:能够处理百万规模以上的文件数量,数量相当之大。
(3)可构建在廉价机器上,通过多副本机制,提高可靠性。

HDFS缺点

(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
(2)无法高效的对大量小文件进行存储。 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
(3)不支持并发写入、文件随机修改。一个文件只能有一个写,不允许多个线程同时写;仅支持数据append(追加),不支持文件的随机修改。

1.3 HDFS 组成架构


1)NameNode(nn):就是Master,它是一个主管、管理者。
管理HDFS的名称空间;配置副本策略;
管理数据块(Block)映射信息;处理客户端读写请求。
(2)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
存储实际的数据块;执行数据块的读/写操作。
(3)Client:就是客户端。
文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
与NameNode交互,获取文件的位置信息;与DataNode交互,读取或者写入数据;
Client提供一些命令来管理HDFS,比如NameNode格式化;Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作。
(4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;
在紧急情况下,可辅助恢复NameNode。

1.4 HDFS 文件块大小(面试重点)

(1)HDFS中的文件在物理上是分块存储(Block ), 块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
(2)如果寻址时间约为10ms,即查找到目标block的时间为10ms。
(3)寻址时间为传输时间的1%时,则为最佳状态。(专家)因此,传输时间=10ms/0.01=1000ms=1s
(4)而目前磁盘的传输速率普遍为100MB/s。

思考:为什么块的大小不能设置太小,也不能设置太大?

(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
总结:HDFS块的大小设置主要取决于磁盘传输速率。

2 HDFS 的 Shell操作(开发重点)

2.1 基本语法

hadoop fs 具体命令 或者 hdfs dfs 具体命令,这两个是完全相同的。

2.2 命令大全

[Tom@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
Usage: hadoop fs [generic options]
	[-appendToFile <localsrc> ... <dst>]
	[-cat [-ignoreCrc] <src> ...]
	[-checksum <src> ...]
	[-chgrp [-R] GROUP PATH...]
	[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
	[-chown [-R] [OWNER][:[GROUP]] PATH...]
	[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
	[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
	[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
	[-createSnapshot <snapshotDir> [<snapshotName>]]
	[-deleteSnapshot <snapshotDir> <snapshotName>]
	[-df [-h] [<path> ...]]
	[-du [-s] [-h] [-v] [-x] <path> ...]
	[-expunge]
	[-find <path> ... <expression> ...]
	[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-getfacl [-R] <path>]
	[-getfattr [-R] -n name | -d [-e en] <path>]
	[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
	[-head <file>]
	[-help [cmd ...]]
	[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
	[-mkdir [-p] <path> ...]
	[-moveFromLocal <localsrc> ... <dst>]
	[-moveToLocal <src> <localdst>]
	[-mv <src> ... <dst>]
	[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
	[-renameSnapshot <snapshotDir> <oldName> <newName>]
	[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
	[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
	[-setfacl [-R] [-b|-k -m|-x <acl_spec> <path>]|[--set <acl_spec> <path>]]
	[-setfattr -n name [-v value] | -x name <path>]
	[-setrep [-R] [-w] <rep> <path> ...]
	[-stat [format] <path> ...]
	[-tail [-f] [-s <sleep interval>] <file>]
	[-test -[defsz] <path>]
	[-text [-ignoreCrc] <src> ...]
	[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
	[-touchz <path> ...]
	[-truncate [-w] <length> <path> ...]
	[-usage [cmd ...]]

2.3 常用命令实操

准备工作

(1)启动 Hadoop集群(方便后续的测试)

[Tom@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[Tom@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

(2)-help:输出这个命令参数

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ... :
  Delete all files that match the specified file pattern. Equivalent to the Unix
  command "rm <src>"
                                                                                 
  -f          If the file does not exist, do not display a diagnostic message or 
              modify the exit status to reflect an error.                        
  -[rR]       Recursively deletes directories.                                   
  -skipTrash  option bypasses trash, if enabled, and immediately deletes <src>.  
  -safely     option requires safety confirmation, if enabled, requires          
              confirmation before deleting large directory with more than        
              <hadoop.shell.delete.limit.num.files> files. Delay is expected when
              walking over large directory recursively to count the number of    
              files to be deleted before the confirmation.     

(3)创建 /ThreeKingdoms文件夹

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /ThreeKingdoms

上传

(1)-moveFromLocal:从本地剪切到HDFS

[Tom@hadoop102 hadoop-3.1.3]$ vim shu.txt
Liu Bei
Zhuge Liang
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shu.txt /ThreeKingdoms

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

[Tom@hadoop102 hadoop-3.1.3]$ vim wu.txt
Sun Quan
Zhou Yu
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal wu.txt /ThreeKingdoms

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

[Tom@hadoop102 hadoop-3.1.3]$ vim wei.txt
Cao Cao
Xiahou Dun
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -put wei.txt /ThreeKingdoms

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

[Tom@hadoop102 hadoop-3.1.3]$ vim shu2.txt
Guan Yu
Zhang Fei
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile shu2.txt /ThreeKingdoms/shu.txt

下载

(1)-copyToLocal:从 HDFS拷贝到本地

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /ThreeKingdoms/shu.txt

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

[Tom@hadoop102 hadoop-3.1.3]$ rm -rf shu.txt 
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /ThreeKingdoms/shu.txt

HDFS直接操作

(1)-ls: 显示目录信息

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /ThreeKingdoms
-rw-r--r--   3 Tom supergroup         38 2021-06-15 16:11 /ThreeKingdoms/shu.txt
-rw-r--r--   3 Tom supergroup         19 2021-06-15 16:00 /ThreeKingdoms/wei.txt
-rw-r--r--   3 Tom supergroup         17 2021-06-15 15:54 /ThreeKingdoms/wu.txt

(2)-cat:显示文件内容

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /ThreeKingdoms/shu.txt
2021-06-15 16:31:48,592 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
Liu Bei
Zhuge Liang
Guan Yu
Zhang Fei

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

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /ThreeKingdoms/shu.txt
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -chown Tom:Tom /ThreeKingdoms/shu.txt

(4)-mkdir:创建路径

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo

(5)cp:从 HDFS的一个路径拷贝到 HDFS的另一个路径

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /ThreeKingdoms/wei.txt /jinguo

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

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /ThreeKingdoms/wu.txt /jinguo

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

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/wei.txt

(8)-rm:删除文件或文件夹

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /ThreeKingdoms/wei.txt
Deleted /ThreeKingdoms/wei.txt

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

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /ThreeKingdoms
Deleted /ThreeKingdoms

(10)-du:统计文件夹的大小信息

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo
74  222  /jinguo
[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /jinguo
38  114  /jinguo/shu.txt
19  57   /jinguo/wei.txt
17  51   /jinguo/wu.txt

说明: 74表示文件大小; 222表示 74*3个副本; ;/jinguo表示查看的目录

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

[Tom@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 5 /jinguo/shu.txt
Replication 5 set: /jinguo/shu.txt


这里设置的副本数只是记录在 NameNode的元数据中,是否真的会有这么多副本,还得看 DataNode的数量。因为目前只有 3台设备,最多也就 3个副本,只有节点数的增加到 10台时副本数才能达到 10。

3 HDFS 的 API操作

3.1 客户端环境准备

(1)找到资料包路径下的Windows依赖文件夹,拷贝 hadoop-3.1.0到非中文路径,比如(d:\\)
(2)配置 HADOOP_HOME环境变量(我的电脑->属性->高级系统设置->环境变量)

(3)配置 Path环境变量(如果环境变量不起作用,可以重启电脑试试。)

(4)在 IDEA中创建一个 Maven工程HdfsClientDemo,并导入相应的依赖坐标 +日志添加

<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

(5)创建包名 com.Tom.hdfs

(6)创建 HdfsClient类

(7)执行程序
客户端去操作 HDFS时 ,是有一个用户身份的。默认情况下, HDFS客户端 API会从采用 Windows默认用户访问 HDFS,会报权限异常错误。所以在访问 HDFS时,一定要配置用户。

3.2 HDFS的 API案例实操

package com.Tom.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * 客户端代码常用套路
 * 1. 获取一个客户端对象
 * 2. 执行相关的操作命令
 * 3. 关闭资源
 * HDFS zookeeper
 */
public class HdfsClient 

    private FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException 
        // 连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        // 创建一个配置文件
        Configuration configuration = new Configuration();

        configuration.set("dfs.replication", "2");
        // 创建一个用户
        String user = "Tom";

        // 1. 获取到了一个客户端对象
        fs = FileSystem.get(uri, configuration, user);
    

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

    // 创建目录
    @Test
    public void testmkdir() throws URISyntaxException, IOException, InterruptedException 

        // 2. 创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan"));

    

    // 上传

    /**
     * 参数优先级
     * 代码里的配置 > 在项目资源目录下的配置文件 > hdfs-site.xml > hdfs-default.xml
     *
     * @throws IOException
     */
    @Test
    public void testsPut() throws IOException 
        // 参数解读:参数一:表示删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径
        fs.copyFromLocalFile(false, true, new Path("E:\\\\LayerData.vtk"), new Path("hdfs://hadoop102/xiyou/huaguoshan"));
    

    // 文件下载
    @Test
    public void testGet() throws IOException 
        // 参数的解读:参数一:原文件是否删除;参数二:原文件路径HDFS;参数三:目标地址路径:Win;参数四
        // fs.copyToLocalFile(true, new Path("hdfs://hadoop104/xiyou/huaguoshan"), new Path("E:\\\\test.vtk"), true);
        fs.copyToLocalFile(false, new Path("hdfs://hadoop102/a.txt"),以上是关于大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制的主要内容,如果未能解决你的问题,请参考以下文章

大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和Seconda

大数据技术之Hadoop(HDFS)

Hadoop技术之HDFS shell操作

大数据技术之Hadoop(HDFS)第1章 HDFS概述

大数据技术之Hadoop(入门)概述运行环境搭建运行模式

大数据技术之Hadoop(入门)概述运行环境搭建运行模式