大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制
Posted @从一到无穷大
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据技术之Hadoop(HDFS)概述Shell操作API操作读写流程工作机制相关的知识,希望对你有一定的参考价值。
文章目录
- 1 HDFS 概述
- 2 HDFS 的 Shell操作(开发重点)
- 3 HDFS 的 API操作
- 4 HDFS 的读写流程(面试重点)
- 5 NameNode 和SecondaryNameNode
- 6 DataNode
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