Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (一)
创始人
2025-05-31 09:23:55

Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (一)

  • 前要:Hadoop3.3.1完全分布式部署请参考此文章:Hadoop3.3.1完全分布式部署

一、Hadoop_HDFS

1、概述、背景、优缺点

1.1、概述

​ Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。HDFS 有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS 放宽了(relax)POSIX 的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。HDFS 开始是为开源的 apache 项目 nutch 的基础结构而创建,HDFS 是 hadoop 项目的一部分,而 hadoop 又是 lucene 的一部分。

1.2、架构

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

在这里插入图片描述

​ 运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被调节以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。

1.3、优缺点

优点:

在这里插入图片描述

缺点:
在这里插入图片描述

1.4、块大小

在这里插入图片描述

为什么块不能蛇者太小或是过大?

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

配置所在位置

vim $HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
dfs.blocksize134217728The default block size for new files, in bytes.You can use the following suffix (case insensitive):k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),Or provide complete size in bytes (such as 134217728 for 128 MB).

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

hadoop fs 和hdfs dfs命令时一样的

2.1、DFSShell

动作命令
查看所有命令bin/hadoop fs
-cat 查看名为 /foodir/myfile.txt 的文件内容bin/hadoop dfs -cat /foodir/myfile.txt
-mkdir 创建文件夹hadoop fs -mkdir /leotest
-moveFromLocal 从本地剪切到HDFShadoop fs -moveFromLocal ./test1.txt /leotest
-copyFromLocal 从本地文件系统中拷贝到HDFShadoop fs -copyFromLocal ./test2.txt /leotest
-put从本地文件系统中拷贝到HDFS他,生产环境更习惯用-put(等同于copyFromLocal)hadoop fs -put./test3.txt /leotest
-appendToFile 追加一个文件到已经存在的文件末尾hadoop fs -appendToFile ./test4.txt /leotest/test3.txt
-copyToLocal 从HDFS拷贝文件到本地hadoop fs -copyToLocal /leotest/test1.txt ./test1-1.txt
-get从HDFS拷贝文件到本地,生产环境更习惯用 -get(等同于copyToLocal)hadoop fs -get /leotest/test1.txt ./test1-1.txt
-ls 显示目录信息hadoop fs -ls /leotest
-cat 显示文件内容hadoop fs -cat /leotest/test1.txt
-cp 从HDFS的一个路径拷贝到HDFS的另一个路径hadoop fs -cp /leotest/test1.txt /leotest2
-mv 在HDFS目录中移动文件hadoop fs -mv /leotest/test2.txt /leotest2
-chgrp/-chmod/-chown/ 修改文件所属权限hadoop fs -chmod +x /leotest2/test2.txt
-tail 显示一个文件的末尾1kb的数据hadoop fs -tail /leotest2/test2.txt
-rm 删除文件或文件夹hadoop fs -rm /leotest2/test2.txt
-rm -r 递归删除目录及目录里的内容hadoop fs -rm -r /leotest2
-du 统计文件夹的大小信息hadoop fs -du -s -h /leotest
hadoop fs -du -h /leotest
-setrep 设置HDFS中文件的副本数量
这里设置的副本数只记录在NameNode的元数据中,
是否真的会生成这么多副本依赖于DataNode的数量。
目前只有三个DataNode(那最多就只有三个副本),
只有节点数增加到5个,副本数才会增加到5。
hadoop fs -setrep 5 /leotest/test1.txt

2.2、DFSAdmin

DFSAdmin 命令用来管理HDFS集群。这些命令只有HDSF的管理员才能使用。下面是一些动作/命令的示例:

动作命令
将集群置于安全模式bin/hadoop dfsadmin -safemode enter
显示Datanode列表bin/hadoop dfsadmin -report
使Datanode节点 datanodename退役bin/hadoop dfsadmin -decommission datanodename

3、HDFS的客户端API

前要:对HDFS进行增删改查操作

3.1、如果想在windwo上配置hadoop运行条件(不是安装Hadoop)

1)下载 hadoop3.3.1包

​ 把bin目录复制到没有中文的路径下,并配置环境变量

2)windows下使用hadoop需要的工具winutils.exe和hadoop.dll:可以选择这两个下载(windwow版本最新只有3.2.2)

​ 把这两个文件放到放入hadoop bin 目录下,双击winutils即可:

在这里插入图片描述

然后把bin目录加入环境变量即可

3.2、配置remote server

idea配置remote服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FXxcwlzJ-1679278385789)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230227141315197.png)]

设置idea字体大小快捷键, 右键设置Add Mouse Shortcut即可:

在这里插入图片描述

3.3、创建一个maven porject

在这里插入图片描述

整体结构

在这里插入图片描述

1)配置阿里云镜像settings.xml

C:\Users\leojiang\.m2\repositoryalimavenaliyun mavenhttp://maven.aliyun.com/nexus/content/groups/public/centralukcentralHuman Readable Name for this Mirror.http://uk.maven.org/maven2/CNOSChina Centralhttp://maven.oschina.net/content/groups/public/centralnexusinternal nexus repositoryhttp://repo.maven.apache.org/maven2central

2)配置依赖

pom.xml


4.0.0com.leohdfsHDFSClient1.0-SNAPSHOT88junitjunit4.13

compileorg.slf4jslf4j-log4j121.7.30org.apache.hadoophadoop-client3.3.4

配置日志格式

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%nlog4j.appender.logfile=org.apache.log4j.RollingFileAppender
#log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log
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

src/main/resources/hdfs-site.xml



dfs.replication3
3)创建HdfsClient类进行测试

创建包名com.leo.hdfs

创建类:HdfsClient

package com.leo.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;@Beforepublic void init() throws URISyntaxException, IOException, InterruptedException {// 连接的集群地址URI uri = new URI("hdfs://hadoop1:8020");// 创建一个配置文件Configuration configuration = new Configuration();// 配置副本数configuration.set("dfs.replication", "2");// 用户String user = "root";// 1 获取客户端对象fs = FileSystem.get(uri, configuration, user);}@Afterpublic void close() throws IOException {// 3 关闭资源fs.close();}// 创建一个目录@Testpublic void testMkdir() throws URISyntaxException, IOException, InterruptedException {// 2 创建一个文件夹fs.mkdirs(new Path("/xiyou/huaguoshan"));}// 上传/*** 参数优先级* hdfs-default.xml => hdfs-site.xml => resources下的配置文件 =》代码里的配置** @throws IOException*/@Testpublic void testPut() throws IOException {// 参数:参数一:表示删除元数据; 参数二:是否运行覆盖;参数惨:元数据路径;参数四:目的地路径fs.copyFromLocalFile(false, false, new Path("C:\\Leojiang\\leojiangDocument\\Hadoop\\tmp-testFile\\sunwukong.txt"), new Path("/xiyou/huaguoshan/"));}// 文件下载@Testpublic void testGet() throws IOException {// 参数:参数一:源文件是否删除;参数二:源文件的路径;参数三:目标地址路径win;参数四:是否进行本地校验fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("C:\\Leojiang\\leojiangDocument\\Hadoop\\tmp-testFile\\"), true);}// 文件删除@Testpublic void tesRm() throws IOException {// 参数:参数一:要删除的路径:参数2:是否递归删除// 删除文件
//        fs.delete(new Path("/xiyou/huaguoshan/sunwukong.txt"),false);// 删除空目录
//        fs.delete(new Path("/xiyou/huaguoshan/"),false);// 删除非空目录fs.delete(new Path("/xiyou/huaguoshan/"), true);}// 文件更名和移动@Testpublic void testMv() throws IOException {// 1、源路径;2、目标路径
//        fs.rename(new Path("/leotest/test1.txt"), new Path("/leotest/test2.txt"));// 移动文件并更名
//        fs.rename(new Path("/leotest/test2.txt"),new Path("/tests.txt"));// 目录的更名fs.rename(new Path("/leotest"), new Path("/leoteste"));}// 获取文件详情@Testpublic void fileDetails() throws IOException {// 获取所有文件信息RemoteIterator 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));}}// 判断是文件夹还是文件@Testpublic 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());}}}}

4、HDFS的读写流程

在这里插入图片描述

5、NN && 2NNN内部的工作原理

5.1、NN && 2NNN工作机制

  • 默认一小时触发CheckPoint

  • Edits操作次数达到100万条,也会触发CheckPoit

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oe6Mn4tC-1679278385790)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230309155111995.png)]

NameNode 格式化之后将会在目录$HADOOP_HOME/data/dfs/name/current中生成如下文件

fsimage_000000000000000
fsimage_000000000000000.md5
seen_txid
VERSION

1、Fsimage文件:HDFS文件系统元数据的一个永久性检查点,其中包括HDFS文件系统所有的目录和文件inode的序列化信息。

2、Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。

3、seen_txid文件保存的是一个数字,就是最后一个edits_的数字。

4、每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。

5.2、Fsimage和Edits的解析

1)oiv查看Fsimage文件
# 查看对应的命令
$ hdfs
oev                   apply the offline edits viewer to an edits file
oiv                   apply the offline fsimage viewer to an fsimage

用法:

# 用法
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件的输出路径# eg:
$ hdfs oiv -p XML -i fsimage_…… -o /……/fsimage.xml
2)oev查看Edits文件

基本用法:

# 用法
hdfs oev -p 文件类型 -i 镜像文件 -o 转换后文件的输出路径# eg:
$ hdfs oev -p XML -i edits_000000000000000_…… -o /……/edits.xml

5.3、CheckPoint的时间设置(企业中基本上不会作此修改,一般都会搭建NameNode高可用)

1)默认检查时间一个小时,在hdfs-default.xml文件中默认设置
vim $HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xmldfs.namenode.checkpoint.period3600sThe number of seconds between two periodic checkpoints.Support multiple time unit suffix(case insensitive), as describedin dfs.heartbeat.interval.If no time unit is specified then secondsis assumed.

2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次
dfs.namenode.checkpoint.txns1000000The Secondary NameNode or CheckpointNode will create a checkpointof the namespace every 'dfs.namenode.checkpoint.txns' transactions, regardlessof whether 'dfs.namenode.checkpoint.period' has expired.
dfs.namenode.checkpoint.check.period60sThe SecondaryNameNode and CheckpointNode will poll the NameNodeevery 'dfs.namenode.checkpoint.check.period' seconds to query the numberof uncheckpointed transactions. Support multiple time unit suffix(case insensitive),as described in dfs.heartbeat.interval.If no time unit is specified thenseconds is assumed.

6、DataNode工作机制

6.1、工作机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUSZDOmn-1679278385790)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230309171411715.png)]

# 数据存储位置
cd $HADOOP_HOME/data/dfs/data/current/BP-……/current/finalized/subdir0/subdir0

DataNode启动后向NameNode注册通过后,默认6个小时向NameNode上报块的信息

vim $HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml# DN扫描自己节点块信息列表的时间,默认6小时
dfs.datanode.directoryscan.interval21600sInterval in seconds for Datanode to scan data directories andreconcile the difference between blocks in memory and on the disk.Support multiple time unit suffix(case insensitive), as describedin dfs.heartbeat.interval.If no time unit is specified then secondsis assumed.
# DN向NN汇报道歉解读信息的时间间隔,默认6小时
dfs.blockreport.intervalMsec21600000Determines block reporting interval in milliseconds.

6.2、数据完整性采用crc32校验

在这里插入图片描述

1)我们可以运行测试,进行下载数据,校验位选择false,即可以生成.crc校验文件。
    // 文件下载@Testpublic void testGet() throws IOException {// 参数:参数一:源文件是否删除;参数二:源文件的路径;参数三:目标地址路径win;参数四:是否进行本地校验fs.copyToLocalFile(false, new Path("/tests.txt"), new Path("C:\\Leojiang\\leojiangDocument\\Hadoop\\tmp-testFile\\"), false);}
2).crc文件可以使用notepad++打开

安装HEX-Editor重启软件。打开.crc文件使用插件–>HEX-Editor–>勾选View in HEX,就可以显示16进制数据了。

在这里插入图片描述

3)校验数据完整性

CRC(循环冗余校验在线计算工具)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6NpOooP-1679278385791)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230310150353618.png)]

6.3、DataNode掉线时限参数设置

生产环境可以根据自身的情况进行调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQoFGLDc-1679278385791)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230310151822919.png)]

1)TimeOut = 2*5min + 10*3s=10min.30s
vim $HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
# 5min
dfs.namenode.heartbeat.recheck-interval300000This time decides the interval to check for expired datanodes.With this value and dfs.heartbeat.interval, the interval ofdeciding the datanode is stale or not is also calculated.The unit of this configuration is millisecond.

# 3s          
dfs.heartbeat.interval3sDetermines datanode heartbeat interval in seconds.Can use the following suffix (case insensitive):ms(millis), s(sec), m(min), h(hour), d(day)to specify the time (such as 2s, 2m, 1h, etc.).Or provide complete number in seconds (such as 30 for 30 seconds).If no time unit is specified then seconds is assumed.
       
2)恢复掉线的DataNode

在此页面可以查看所有的Datanode的详细信息(DataNode连接状态)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLNVH8qw-1679278385792)(C:\Leojiang\leojiangDocument\Typora-image-store\image-20230310153045727.png)]

重启down掉的DataNode服务

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

二、Hadoop_MapReduce

三、Hadoop_Yarn



参考

Hadoop中文参考资料

Hadoop官网

Spring Initializr

MVN Repository

视频参考地址

相关内容

热门资讯

游戏服务器是什么怎么租用 游戏服务器是什么怎么租用 我是艾西,作为一个常年与游戏行业保持着高频率的服务器供应商&...
Flink-转换算子  基本转换算子         map(映射)         filter(过滤&#...
2023年金三银四大厂高频Ja... Java 面试 谈到 Java 面试,相信大家第一时间脑子里想到的词肯定是金三银四&#...
C语言手撕一个Hash表(Ha... 什么是Hash Table 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表...
springMVC01- 文章目录今日目标一、SpringMVC简介1 SpringMVC概述问题导入1.1 SpringMV...
Electron开发的应用利用... 技术选型: 1、electron:21.3.3 2、electron-v...
【Elastic (ELK) ... 目录 一、ES 基本概念介绍 1.1 ES 是什么 1.2 ES 主要功能 1.3 ES 相关术语 ...
指定wb用户在指定日期范围内的... 一、操作步骤 只记录过程,不讲述原理 1.获取用户ID和cookie 用户ID在进入个...
sheng的学习笔记-IO多路... 基础概念IO分为几种:同步阻塞的BIO,同步非阻塞的NIO,...
接口自动化测试(Python+...  目录:导读 (1)接口自动化测试的优缺点 (2)Pyth...
重构条件-Consolidat... 重构条件-Consolidate Conditional Expression合并条件式二 1.合并...
【论文阅读】BiSeNet V... 前言BiSeNet V2延续了v1版本的双边结构,分别处理空间细节信息、高层语义信息。...
二、马尔可夫决策过程与贝尔曼方... 这里写目录标题1 马尔可夫性质2 马尔可夫过程3 马尔可夫奖励过程(Markov re...
golang端口重用 文章目录前言SO_REUSEADDR简介Python中的用法golang用法其他学习总结 前言 服...
Zabbix“专家坐诊”第18... 问题一 Q:Zabbix5.0版本,如图,请问这里怎么修改...
深度学习技巧应用5-神经网络中... 大家好,我是微学AI,今天给大家带来深度学习技巧应用5-神经网络中的模型...
Mongodb 常用基本语法与... 常用操作 1、 Help查看命令提示 db.help(); 2、 切换/创建数据库 use t...
java中Long型数据大小比... 起因 今天在做项目的时候,想构建一个树形结构,从数据库中查询出了所有数据...
【Linux】-- 进程概念 基本概念进程(Process):是操作系统进行资源分配的最小单位。一个进程是一个程序的一次执行过程。...
2023-03-22干活小计: transformer: position-embedding: 残差:我也会了 ad...
verilog(基础知识) 摘要:主要写自己的学习内容,可能不完整 概述 对硬件描述,主要是对芯片设计进行验证人员对其进行验证...
MySQL函数 - 字符串函数... 文章目录1 字符串函数2 数值函数3 日期函数4 流程函数 函数是指一段可以直接被另一段程序调用的程...
Word2010(详细布局解释... 目录一、界面介绍二、选项卡1、文件选项卡(保存、打开、新建、打印、保存并发送、选项&#...
ProTradex是链上衍生品... 目前,链上衍生品市场的总市值已经超过100亿美元,链上衍生品市场的产品类...
spring boot 集成 ... 要将 PostGIS 集成到 Spring Boot 应用程序中,需要按照以下步骤进行操作:1. 将...
【DDIM精读】公式推导加代码... 【DDIM精读】公式推导加代码分析。1.前言:ddim总览2.均值(μ\...
系统开发-McCabe复杂度(... 系统开发(上)-软件设计(三十二)https...
每日学术速递3.22 CV - 计算机视觉 |  ML - 机器学习 |  RL - 强化学习 | NLP 自然语言处理 ...
CCF-CSP题解 第二题(J... 目录 201312-2:ISBN号码 201403-2:窗口 20140...
在服务器上搭建nacos集群-... 搭建集群需要具备JDK环境,1个Nginx+3个nacos注册中心+1...