大数据技术之hadoop(hdfs)概述shell操作api操作读写流程工作机制(代码片段)

@从一到无穷大 @从一到无穷大     2022-12-12     507

关键词:

文章目录


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(入门)概述运行环境搭建运行模式(代码片段)

...1.3.3MapReduce架构概述1.3.4HDFS、YARN、MapReduce三者关系1.3.5大数据技术生态体系1.3.6推荐系统框架图2Hadoop运行环境搭建(开发重点)2. 查看详情

一文带你了解大数据技术之hadoop(代码片段)

...概述5.3MapReduce架构概述5.4HDFS、YARN、MapReduce三者关系6.大数据技术生态体系7.推荐系统框架 查看详情

hadoop技术之hdfs工作流程与机制

 ▼往期内容汇总:大数据导论Linux操作系统概述VMwareWorkstation虚拟机使用Linux常用基础命令、系统命令ApacheHadoop概述ApacheHadoop集群搭建HDFS分布式文件系统基础Hadoop技术之HDFSshell操作一、HDFS集群角色与职责官方架构图 主角色&... 查看详情

一文带你了解大数据技术之hdfs

大数据技术之Hadoop-HDFS概述1.HDFS产出背景及定义2.HDFS优缺点3.HDFS组成架构4.HDFS文件块大小1.HDFS产出背景及定义1)HDFS产生背景随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管... 查看详情

hadoop技术之hdfs工作流程与机制apachehadoop概述

...的核心,架构中的主角色。NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。  基于此, NameNode成为了访问HDFS的唯一入口。 主角色: namenodeName 查看详情

建议收藏大数据技术之hadoop(生产调优手册)(代码片段)

大数据技术之Hadoop(生产调优手册)1.HDFS—核心参数1.1NameNode内存生产配置1.2NameNode心跳并发配置1.3开启回收站配置2.HDFS—集群压测2.1测试HDFS写性能2.2测试HDFS读性能3.HDFS—多目录3.1NameNode多目录配置3.2DataNode多目录配置3.3... 查看详情

大数据技术之hadoop(生产调优手册)(代码片段)

...FS—多目录3.1NameNode多目录配置3.2DataNode多目录配置3.3集群数据均衡之磁盘间数据均衡4HDFS—集群扩容及缩容4.1添加白名单4.2服役新服务器4.3服务器间数据均衡4.4黑名单退役服 查看详情

尚硅谷大数据hadoop教程-笔记02hdfs(代码片段)

视频地址:尚硅谷大数据Hadoop教程(Hadoop3.x安装搭建到集群调优)尚硅谷大数据Hadoop教程-笔记01【入门】尚硅谷大数据Hadoop教程-笔记02【HDFS】尚硅谷大数据Hadoop教程-笔记03【MapReduce】尚硅谷大数据Hadoop教程-笔记04【Ya... 查看详情

hadoop大数据技术-通过shell命令访问hdfs(代码片段)

通过shell命令访问HDFS1操作命令1.1创建文件夹1.2列出指定的文件和目录1.3上传文件1.4下载文件1.5查看文件1.6删除目录或文件1.7文件或文件夹的复制、移动1.8count统计1.9显示占用的磁盘空间大小2管理命令2.1安全模式相关2.2快照3其他... 查看详情

hadoop——hadoop优势组成大数据技术生态体系系统框架图

...述1.5.3MapReduce架构概述1.5.4HDFS、YARN、MapReduce三者关系1.6大数据技术生态体系1.7推荐系统框架图1.4Hadoop优势(4高)1)高可靠性 查看详情

hadoop技术之hdfsshell操作

 ▼往期内容汇总:大数据导论Linux操作系统概述VMwareWorkstation虚拟机使用Linux常用基础命令、系统命令ApacheHadoop概述ApacheHadoop集群搭建HDFS分布式文件系统基础一、HDFSshell命令行解释说明介绍命令行界面 (英语: command-line... 查看详情

大数据技术之hadoop(mapreduce)概述序列化(代码片段)

...1.3MapReduce核心思想1.4MapReduce进程1.5官方WordCount源码1.6常用数据序列化类型1.7MapReduce编程规范1.8WordCount案例实操1.8.1本地测试1.8.2提交到集群测试2Hadoop序列化2.1序列化概述2.2自定义bean对象实现序列化接口( 查看详情

hadoop基础之《—hdfs概述》

...。二、HDFS组成1、NameNode(简称NN)存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个 查看详情

hadoop组件之-hdfs(ha实现细节)

...meNode的单点问题尤为严重。因为NameNode保存了整个HDFS的元数据信息,一旦NameNode挂掉,整个HDFS就无法访问,同时Hadoop生态系统中依赖于HDFS的各个组件,包括MapReduce、Hive、Pig以及HBas 查看详情

hadoop技术之apachehadoop集群搭建

 Spark是大数据体系的明星产品,是一款高性能的分布式内存迭代计算框架,可以处理海量规模的数据。下面就带大家一起来开始学Spark!▼往期内容汇总:大数据导论Linux操作系统概述VMwareWorkstation虚拟机使用Linux... 查看详情

hadoop大数据技术课程总结2021-2022学年第1学期(代码片段)

文章目录Hadoop大数据技术课程总结1.大数据概述1.1大数据时代的4V1.2大数据时代的三次浪潮1.3大数据时代的技术支撑1.4谷歌的3篇论文1.5Hadoop集群规模1.6Hadoop安装过程2.HDFS专题2.1HDFS简介及作用2.2HDFS架构2.3HDFS服务角色2.4HDFS如何读取... 查看详情

大数据入门-五分钟读懂hdfs

目录大数据入门系列文章一、概念二、架构及组件概念三、读写流程四、大白话五、其他大数据入门系列文章最近在收集整理大数据入门文章,各位盆友关注点赞不迷路,每天都要开心鸭!大数据入门系列文章1.大数... 查看详情

尚硅谷大数据技术hadoop教程-笔记06hadoop-生产调优手册(代码片段)

视频地址:尚硅谷大数据Hadoop教程(Hadoop3.x安装搭建到集群调优)尚硅谷大数据技术Hadoop教程-笔记01【大数据概论】尚硅谷大数据技术Hadoop教程-笔记02【Hadoop-入门】尚硅谷大数据技术Hadoop教程-笔记03【Hadoop-HDFS】尚硅... 查看详情