Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)

这篇具有很好参考价值的文章主要介绍了Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、服务概述

Hadoop是一个开源的分布式计算和存储框架,由Apache基金会开发和维护。Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集,并且支持在单台计算机到几千台计算机之间进行扩展。

Hadoop使用Java开发,所以可以在多种不同硬件平台的计算机上部署和使用。其核心部件包括分布式文件系统 (Hadoop DFS,HDFS) 和MapReduce。

1.1 HDFS

Hadoop Distributed File System,Hadoop分布式文件系统,简称HDFS
Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

1.1.1 架构解析

1.1.1.1 Block 数据块
  • 基本存储单元,1.x版本默认64M,2.x版本之后默认128M
  • 单个文件会被拆分成为一个个大小相同的块数据,存储在不同的机器上,当一个文件小于Block设置的大小,那么实际占用的空间为其文件的大小
  • 基本读写单位,类似于磁盘的页,每次都是读写一个块;
  • 每个块都会被复制到多个机器上,默认副本数量为3。

Hadoop 1.x版本默认为64M,Hadoop 2.x版本之后默认为128M。

  • 减少搜索时间,一般情况下硬盘传输速率比寻道时间更快,较大的块可以减少寻道时间;
  • 减少管理块的数据开销,每个块都需要在NameNode上有对应记录,数量少可以减少这些记录;
  • 对较大的数据块进行读写,可以降低网络通信的次数和成本。
1.1.1.2 NameNode 名称节点
  • 存储文件的metadata,运行时所有数据都保存到内存(因此推荐部署节点性能内存偏大),整个HDFS可存储的文件数受限于NameNode的内存大小;
  • NameNode主要存放文件系统树及所有文件、目录的元数据。元数据持久化为2种形式:namespcae image 镜像文件 + edit log 日志文件,持久化数据中不包括Block所在的节点列表,及文件的Block分布在集群中的哪些节点上,这些信息是在系统重启的时候重新构建(通过Datanode汇报的Block信息)。
  • 一个Block在NameNode中对应一条记录(一般一个Block占用150字节),如果是大量的小文件,会消耗大量内存;同时map task的数量是由splits来决定的,所以用MapReduce处理大量的小文件时,就会产生过多的map task,线程管理开销将会增加作业时间;处理大量小文件的速度远远小于处理同等大小的大文件的速度。因此Hadoop建议存储大文件;
  • 数据会定时保存到本地磁盘,但不保存Block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode中与DataNode相关的信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建);
  • NameNode失效则整个HDFS都会失效,因此优先保证NameNode的可用性,HDFS针对单点故障提供了2种解决机制: 备份持久化元数据 / 使用Secondary NameNode。
1.1.1.3 Secondary NameNode 第二名称节点

SecondaryNameNode有两个作用:一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint。

镜像备份:定期备份fsimage文件;

Checkpoint:将日志与镜像的定期合并操作,避免edit log过大,通过创建检查点checkpoint来合并(合并周期与镜像大小可以通过core-site.xml设置)。它会维护一个合并后的namespace image副本, 可用于在Namenode完全崩溃时恢复数据,因此SNN并非是NN的备用节点,并不会再NN异常时主动切换。具体流程如下:

  • SecondaryNameNode通知NameNode准备提交edits文件,此时主节点产生edits.new;
  • SecondaryNameNode通过http get方式获取NameNode的fsimage与edits文件(在SecondaryNameNode的current同级目录下可见到 temp.check-point或者previous-checkpoint目录,这些目录中存储着从namenode拷贝来的镜像文件);
  • SecondaryNameNode开始合并获取的上述两个文件,产生一个新的fsimage文件fsimage.ckpt;
  • SecondaryNameNode用http post方式发送fsimage.ckpt至NameNode;
  • NameNode将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fstime,整个checkpoint过程到此结束。 在新版本的hadoop中(hadoop0.21.0),SecondaryNameNode两个作用被两个节点替换, checkpoint node与backup node. SecondaryNameNode备份由三个参数控制fs.checkpoint.period控制周期,fs.checkpoint.size控制日志文件超过多少大小时合并, dfs.http.address表示http地址,这个参数在SecondaryNameNode为单独节点时需要设置。

Secondary Namenode通常运行在另一台机器,因为合并操作需要耗费大量的CPU和内存。其数据落后于Namenode,因此当Namenode完全崩溃时,会出现数据丢失问题。 通常做法是拷贝NFS中的备份元数据到Secondary NameNode,将其作为新的Namenode。

1.1.1.4 DataNode 数据节点
  • 存储具体的Block数据;
  • 负责数据的读写操作和复制操作;
  • DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息;
  • DataNode之间会进行通信,复制数据块,保证数据的冗余性;
1.1.1.5 Block Caching 块缓存

DataNode通常直接从磁盘读取数据,但是频繁使用的Block可以在内存中缓存。

默认情况下,一个Block只有一个数据节点会缓存。但是可以针对每个文件设置个性化配置,作业调度器可以利用缓存提升性能,例如MapReduce可以把任务运行在有Block缓存的节点上,用户或者应用可以向NameNode发送缓存指令(缓存哪个文件,缓存多久), 缓存池的概念用于管理一组缓存的权限和资源。

1.1.1.6 HDFS Federation 联邦

我们知道NameNode的内存会制约文件数量,HDFS Federation提供了一种横向扩展NameNode的方式。在Federation模式中,每个NameNode管理命名空间的一部分,例如一个NameNode管理/user目录下的文件, 另一个NameNode管理/share目录下的文件。
每个NameNode管理一个namespace volumn,所有volumn构成文件系统的元数据。每个NameNode同时维护一个Block Pool,保存Block的节点映射等信息。各NameNode之间是独立的,一个节点的失败不会导致其他节点管理的文件不可用。
客户端使用mount table将文件路径映射到NameNode。mount table是在Namenode群组之上封装了一层,这一层也是一个Hadoop文件系统的实现,通过viewfs:协议访问。

1.1.1.7 Rack Awareness 机架感知

参考官网文章

在读取和写入的过程中,namenode在分配Datanode的时候,会考虑节点之间的距离。HDFS中距离没有
采用带宽来衡量,因为实际中很难准确度量两台机器之间的带宽。
Hadoop把机器之间的拓扑结构组织成树结构,并且用到达公共父节点所需跳转数之和作为距离。事实上这是一个距离矩阵的例子。下面的例子简明地说明了距离的计算:

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • 同一数据中心,同一机架,同一节点距离为0;
  • 同一数据中心,同一机架,不同节点距离为2;
  • 同一数据中心,不同机架,不同节点距离为4;
  • 不同数据中心,不同机架,不同节点距离为6。

注意:Hadoop集群的拓扑结构需要手动配置,如果没配置,Hadoop默认所有节点位于同一个数据中心的同一机架上!

1.1.2 读写操作与可靠性

1.1.2.1 写操作

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • 客户端将文件写入本地磁盘的HDFS Client文件中;
  • 当临时文件大小达到一个Block大小时,HDFS Client通知NameNode申请写入文件;
  • NameNode在HDFS的文件系统中创建一个文件,并把该Block ID和要写入的DataNode列表返回给HDFS Client;
  • HDFS Client收到这个信息后,将文件内容写入第一个DataNode(一般以4Kb单位进行传输,集群读写操作时缓冲区大小可在core-site.xml配置io.file.buffer.size);
  • 当第一个DataNode接收后,将数据写入本地磁盘,同时传输给第二个DataNode,以此类推当第三个DataNode写入本地磁盘(默认副本数量为3),数据在DataNode之间是通过pipeline的方式进行复制的;
  • 当写入操作完成后,DataNode会发现一个确认给前一个DataNode,最后由第一个DataNode返回确认写入完成给HDFS Client;
  • 当HDFS Client接收到这个确认写入数据后,会向NameNode发送一个最终的确认;
  • 当某个DataNode写入失败时,数据会继续写入其他的DataNode,然后NameNode会寻找另一个正常的DataNode继续复制,以保证数据副本数;
  • 每个Block都会有一个校验码,并存储在独立的文件中,以便读操作时校验其完整性;
  • 文件写完后(HDFS Client关闭),NameNode提交文件(这时文件才可见,如果提交前,NameNode垮掉,那文件也就丢失了。fsync:只保证数据的信息写到NameNode上,但并不保证数据已经被写到DataNode中)。
1.1.2.2 读操作

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • HDFS Client向NameNode发送读请求;
  • NameNode返回文件的所有Block和这些Block所在的DataNodes(包括复制节点);
  • 客户端直接从DataNode中读取数据,如果该DataNode读取失败(DataNode失效或校验码不对),则从复制节点中读取(如果读取的数据就在本机,则直接读取,否则通过网络读取)。
1.1.2.3 可靠性
  • 多副本机制:DataNode中存储的Block均拥有多个副本数,默认为3,支持在hdfs-site.xml中设置。
  • 机架感知:通过节点之间发送一个数据包,来感应它们是否在同一个机架,不同副本存放在不同机架上节点。
  • 心跳机制:NameNode周期性从DataNode接受心跳信息和块报告,NameNode根据块报告验证元数据,没有按时发送心跳的DataNode会被标记为宕机,NameNode不会发送任何I/O请求到异常节点,若是DataNode失效造成副本数不足设定值,NameNode会在合适的时机重新下发复制操作到正常的DataNode。
  • 安全模式:NameNode启动时会先经过一个"安全模式"阶段,安全模式阶段不会产生数据写操作,在此阶段NameNode收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是"安全"的,在一定比例(支持自定义设置)的数据块被确定为"安全" 后,在过若干时间后安全模式结束;当检测到副本数不足的数据块时,该数据块会被复制,直到满足最小副本数要求。
  • 校验机制:在文件创立时,每个数据块都产生效验和,效验和会作为单独一个隐藏文件保存在命名空间下,客户端获取数据时可以检查效验和是否相同,从而发现数据块是否损坏,如果正在读取的数据块损坏,则可以继续读取其他副本。
  • 回收站:删除文件时,其实是放入回收站 /trash路径,回收站里的文件支持快速恢复,支持设置一个时间阈值,当回收站里文件的存放时间超过了这个阈值,就被彻底删除,并且释放占用的数据块;
  • 元数据保护:映像文件和事物日志是NameNode的核心数据,可配置为多副本,副本会降低NameNode的处理速度,但是会增加安全性,NameNode依然是单点,弱发生故障需要手工进行切换。

1.1.3 NameNode元数据解析

元数据持久化为2种形式:namespcae image 镜像文件 + edit log 日志文件,存储路径通过在core-site.xml配置文件里设置参数hadoop.tmp.dir的值。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

可以看到在dfs文件下的name目录存放edits与fsimage文件,其内容均为二进制,无法直接查看(由于数据量较大,因此HDFS取消了编码效果,可以通过工具查看)

$ hdfs oev -i <edits/fsimage_file> -o <tmp_file.xml>
# 将二进制文件输出为xml格式文件查看,文件路径和名称支持自定义

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

1.2 YARN

1.2.1 架构演变

Hadoop 1.x 架构

  • JobTracker: 负责资源管理,跟踪资源消耗和可用性,作业生命周期管理(调度作业任务,跟踪进度,为任务提供容错);
  • TaskTracker: 加载或关闭任务,定时报告任务状态。

此架构会有以下问题:

  • JobTracker是MapReduce的集中处理点,存在单点故障风险;
  • JobTracker完成了太多的任务,造成了过多的资源消耗,当MapReduce job非常多的时候,会造成很大的内存开销。这也是业界普遍总结出老Hadoop的 MapReduce只能支持4000节点主机的上限;
  • 在TaskTracker端,以Map/Reduce Task的数目作为资源的表示过于简单,没有考虑到CPU/Mem的占用情况,如果两个大内存消耗的Task被调度到了一块,很容易出现OOM风险;
  • 在TaskTracker端,把资源强制划分为Map Task Slot 和Reduce Task Slot , 如果当系统中只有Map Task 或者只有Reduce Task的时候,会造成资源的浪费,也就集群资源利用的问题。

Hadoop 2.x 架构

YARN就是将JobTracker的职责进行拆分,将资源管理和任务调度监控拆分成独立的进程:一个全局的资源管理和一个每个作业的管理(ApplicationMaster)ResourceManager和NodeManager提供了计算资源的分配和管理,而ApplicationMaster则完成应用程序的运行。

  • ResourceManager: 全局资源管理和任务调度;
  • NodeManager: 单个节点的资源管理和监控;
  • ApplicationMaster: 单个作业的资源管理和任务监控;
  • Container: 资源申请的单位和任务运行的容器。

两种版本架构对比

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

YARN架构下形成了一个通用的资源管理平台和一个通用的应用计算平台,避免了旧架构的单点问题和资源利用率问题,同时也让运行的应用不再局限于MapReduce形式。

1.2.2 基本流程

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • Job submission 提交Job:从ResourceManager中获取一个Application ID检查作业输出配置,计算输入分片copy job资源(job jar、配置文件、分片信息)到HDFS,以便后面任务的执行;
  • Job initialization 初始化job:ResourceManager将作业递交给Scheduler(有很多调度算法,一般是根据优先级)Scheduler为作业分配一个Container,ResourceManager就加载一个Application master process并交给NodeManager;管理ApplicationMaster主要是创建一系列的监控进程来跟踪作业的进度,同时获取输入分片,为每一个分片创建一个Map task和相应的reduce task,Application Master还决定如何运行作业,如果作业很小(可配置),则直接在同一个JVM下运行;
  • Task assignment 任务分配:ApplicationMaster向Resource Manager申请资源(一个个的Container,指定任务分配的资源要求)一般是根据data locality来分配资源;
  • Task execution 任务执行:ApplicationMaster根据ResourceManager的分配情况,在对应的NodeManager中启动Container从HDFS中读取任务所需资源(job jar,配置文件等),然后执行该任务
  • Progress and status update 进度与状态更新:定时将任务的进度和状态报告给ApplicationMaster Client定时向ApplicationMaster获取整个任务的进度和状态
  • Job completion 任务完成:Client定时检查整个作业是否完成,作业完成后会自动清空临时文件、目录等。

1.2.3 进程组件

YARN将JobTracker拆分为四个组件 + 一个故障组件。

1.2.3.1 ResourceManager 资源管理

负责全局的资源管理和任务调度,把整个集群当成计算资源池,只关注分配,不负责应用与容错。

资源管理

  • 以前资源是每个节点分成一个个的Map slot和Reduce slot,现在是一个个Container,每个Container可以根据需要运行ApplicationMaster、Map、Reduce或者任意的程序;
  • 以前的资源分配是静态的,目前是动态的,资源利用率更高;
  • Container是资源申请的单位,一个资源申请格式:<resource-name, priority, resource-requirement, number-of-containers>,resource-name:主机名、机架名或*(代表任意机器), resource-requirement:目前只支持CPU和内存;
  • 用户提交作业到ResourceManager,然后在某个NodeManager上分配一个Container来运行ApplicationMaster,ApplicationMaster再根据自身程序需要向ResourceManager申请资源;
  • YARN有一套Container的生命周期管理机制,而ApplicationMaster和其Container之间的管理是应用程序自己定义的。

任务调度

  • 只关注资源的使用情况,根据需求合理分配资源;
  • Scheluer可以根据申请的需要,在特定的机器上申请特定的资源(ApplicationMaster负责申请资源时的数据本地化的考虑,ResourceManager将尽量满足其申请需求,在指定的机器上分配Container,从而减少数据移动)。

内部结构

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • Client Service: 应用提交、终止、输出信息(应用、队列、集群等的状态信息);
  • Adaminstration Service: 队列、节点、Client权限管理;
  • ApplicationMasterService: 注册、终止ApplicationMaster, 获取ApplicationMaster的资源申请或取消的请求,并将其异步地传给Scheduler, 单线程处理;
  • ApplicationMaster Liveliness Monitor: 接收ApplicationMaster的心跳消息,如果某个ApplicationMaster在一定时间内没有发送心跳,则被任务失效,其资源将会被回收,然后ResourceManager会重新分配一个ApplicationMaster运行该应用(默认尝试2次);
  • Resource Tracker Service: 注册节点, 接收各注册节点的心跳消息;
  • NodeManagers Liveliness Monitor: 监控每个节点的心跳消息,如果长时间没有收到心跳消息,则认为该节点无效, 同时所有在该节点上的Container都标记成无效,也不会调度任务到该节点运行;
  • ApplicationManager: 管理应用程序,记录和管理已完成的应用;
  • ApplicationMaster Launcher: 一个应用提交后,负责与NodeManager交互,分配Container并加载ApplicationMaster,也负责终止或销毁;
  • YarnScheduler: 资源调度分配, 有FIFO(with Priority),Fair,Capacity方式;
  • ContainerAllocationExpirer: 管理已分配但没有启用的Container,超过一定时间则将其回收。
1.2.3.2 NodeManager 节点管理

Node节点下的Container管理。

  • 启动时向ResourceManager注册并定时发送心跳消息,等待ResourceManager的指令;
  • 监控Container的运行,维护Container的生命周期,监控Container的资源使用情况;
  • 启动或停止Container,管理任务运行时的依赖包(根据ApplicationMaster的需要,启动Container之前将需要的程序及其依赖包、配置文件等拷贝到本地)

内部结构

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • NodeStatusUpdater: 启动向ResourceManager注册,报告该节点的可用资源情况,通信的端口和后续状态的维护;

  • ContainerManager: 接收RPC请求(启动、停止),资源本地化(下载应用需要的资源到本地,根据需要共享这些资源)

    PUBLIC: /filecache

    PRIVATE: /usercache//filecache

    APPLICATION: /usercache//appcache//(在程序完成后会被删除)

  • ContainersLauncher: 加载或终止Container;

  • ContainerMonitor: 监控Container的运行和资源使用情况;

  • ContainerExecutor: 和底层操作系统交互,加载要运行的程序。

1.2.3.3 ApplicationMaster 应用管理

单个作业的资源管理和任务监控。

功能描述

  • 计算应用的资源需求,资源可以是静态或动态计算的,静态的一般是Client申请时就指定了,动态则需要ApplicationMaster根据应用的运行状态来决定;
  • 根据数据来申请对应位置的资源(Data Locality);
  • 向ResourceManager申请资源,与NodeManager交互进行程序的运行和监控,监控申请的资源的使用情况,监控作业进度;
  • 跟踪任务状态和进度,定时向ResourceManager发送心跳消息,报告资源的使用情况和应用的进度信息;
  • 负责本作业内的任务的容错。

ApplicationMaster可以是用任何语言编写的程序,它和ResourceManager和NodeManager之间是通过ProtocolBuf交互,以前是一个全局的JobTracker负责的,现在每个作业都一个,可伸缩性更强,至少不会因为作业太多,造成JobTracker瓶颈。同时将作业的逻辑放到一个独立的ApplicationMaster中,使得灵活性更加高,每个作业都可以有自己的处理方式,不用绑定到MapReduce的处理模式上。

一般的MapReduce是根据Block数量来定Map和Reduce的计算数量,然后一般的Map或Reduce就占用一个Container;数据本地化是通过HDFS的Block分片信息获取的。

1.2.3.4 Container 容器
  • 基本的资源单位(CPU、内存等);
  • Container可以加载任意程序,而且不限于Java;
  • 一个Node可以包含多个Container,也可以是一个大的Container;
  • ApplicationMaster可以根据需要,动态申请和释放Container。
1.2.3.5 Failover 故障处理

Job任务失败

  • 运行时异常或者JVM退出都会报告给ApplicationMaster;

  • 通过心跳来检查挂住的任务(timeout),会检查多次(可配置)才判断该任务是否失效;

  • 一个作业的任务失败率超过配置,则认为该作业失败;

  • 失败的任务或作业都会有ApplicationMaster重新运行。

ApplicationMaster失败

  • ApplicationMaster定时发送心跳信号到ResourceManager,通常一旦ApplicationMaster失败,则认为失败,但也可以通过配置多次后才失败;
  • 一旦ApplicationMaster失败,ResourceManager会启动一个新的ApplicationMaster;
  • 新的ApplicationMaster负责恢复之前错误的ApplicationMaster的状态(yarn.app.mapreduce.am.job.recovery.enable=true),这一步是通过将应用运行状态保存到共享的存储上来实现的,ResourceManager不会负责任务状态的保存和恢复;
  • Client也会定时向ApplicationMaster查询进度和状态,一旦发现其失败,则向ResouceManager询问新的ApplicationMaster。

NodeManager失败

  • NodeManager定时发送心跳到ResourceManager,如果超过一段时间没有收到心跳消息,ResourceManager就会将其移除;
  • 任何运行在该NodeManager上的任务和ApplicationMaster都会在其他NodeManager上进行恢复;
  • 如果某个NodeManager失败的次数太多,ApplicationMaster会将其加入黑名单(ResourceManager没有),任务调度时不在其上运行任务。

ResourceManager失败

  • 通过checkpoint机制,定时将其状态保存到磁盘,然后失败的时候,重新运行;
  • 通过zookeeper同步状态和实现透明的HA。

1.3 MapReduce

MapReduce的思想就是“分而治之”,Map负责 分,Reduce负责 治。

一种分布式的计算方式指定一个Map函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

map: (K1, V1) → list(K2, V2) combine: (K2, list(V2)) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3)

MapReduce主要是先读取文件数据,然后进行Map处理,接着Reduce处理,最后把处理结果写到文件中,因此Map输出格式和Reduce输入格式一定是相同的。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce
Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

1.3.1 Map

Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:

  • 数据或计算的规模相对原任务要大大缩小
  • 就近计算,即任务会分配到存放着所需数据的节点上进行计算;
  • 并行计算,彼此间几乎没有依赖关系。

1.3.2 Reduce

Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,默认为1。

1.3.3 读取数据

通过InputFormat决定读取的数据的类型,然后拆分成一个个InputSplit,每个InputSplit对应一个Map处理,RecordReader读取InputSplit的内容给Map。

1.3.3.1 InputFormat 输入格式化

决定读取数据的格式,可以是文件或数据库等。

  • 验证作业输入的正确性,如格式等;
  • 将输入文件切割成逻辑分片(InputSplit),一个InputSplit将会被分配给一个独立的Map任务;
  • 提供RecordReader实现,读取InputSplit中的"K-V对"供Mapper使用。
1.3.3.2 InputSplit 输入分割

代表一个个逻辑分片,并没有真正存储数据,只是提供了一个如何将数据分片的方法,Split内有Location信息,利于数据局部化,一个InputSplit给一个单独的Map处理。

1.3.3.3 RecordReader 记录读者

将InputSplit拆分成一个个<key,value>对给Map处理,也是实际的文件读取分隔对象</key,value>。

1.3.3.4 Mapper 映射器

主要是读取InputSplit的每一个Key,Value对并进行处理

1.3.3.5 Shuffle 清洗器

对Map的结果进行排序并传输到Reduce进行处理 Map的结果并不是直接存放到硬盘,而是利用缓存做一些预排序处理 Map会调用Combiner,压缩,按key进行分区、排序等,尽量减少结果的大小 每个Map完成后都会通知Task,然后Reduce就可以进行处理。

2、配置文件常用参数

[root@master hadoop]# ll
total 116
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 bin
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 etc
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 include
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 lib
drwxr-xr-x 4 1024 1024  4096 Jul 29  2022 libexec
-rw-rw-r-- 1 1024 1024 24707 Jul 29  2022 LICENSE-binary
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 licenses-binary
-rw-rw-r-- 1 1024 1024 15217 Jul 17  2022 LICENSE.txt
-rw-rw-r-- 1 1024 1024 29473 Jul 17  2022 NOTICE-binary
-rw-rw-r-- 1 1024 1024  1541 Apr 22  2022 NOTICE.txt
-rw-rw-r-- 1 1024 1024   175 Apr 22  2022 README.txt
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 sbin
drwxr-xr-x 4 1024 1024  4096 Jul 29  2022 share

[root@master hadoop]# ll etc/hadoop/
total 180
-rw-r--r-- 1 1024 1024  9213 Jul 29  2022 capacity-scheduler.xml
-rw-r--r-- 1 1024 1024  1335 Jul 29  2022 configuration.xsl
-rw-r--r-- 1 1024 1024  2567 Jul 29  2022 container-executor.cfg
-rw-r--r-- 1 1024 1024   970 Jul 11 14:08 core-site.xml												# 核心站点配置
-rw-r--r-- 1 1024 1024  3999 Jul 29  2022 hadoop-env.cmd
-rw-r--r-- 1 1024 1024 16721 Jul 11 14:15 hadoop-env.sh												# Hadoop环境变量
-rw-r--r-- 1 1024 1024  3321 Jul 29  2022 hadoop-metrics2.properties
-rw-r--r-- 1 1024 1024 11765 Jul 29  2022 hadoop-policy.xml
-rw-r--r-- 1 1024 1024  3414 Jul 29  2022 hadoop-user-functions.sh.example
-rw-r--r-- 1 1024 1024   683 Jul 29  2022 hdfs-rbf-site.xml
-rw-r--r-- 1 1024 1024  1040 Jul 11 14:02 hdfs-site.xml												# HDFS配置
-rw-r--r-- 1 1024 1024  1484 Jul 29  2022 httpfs-env.sh
-rw-r--r-- 1 1024 1024  1657 Jul 29  2022 httpfs-log4j.properties
-rw-r--r-- 1 1024 1024   620 Jul 29  2022 httpfs-site.xml
-rw-r--r-- 1 1024 1024  3518 Jul 29  2022 kms-acls.xml
-rw-r--r-- 1 1024 1024  1351 Jul 29  2022 kms-env.sh
-rw-r--r-- 1 1024 1024  1860 Jul 29  2022 kms-log4j.properties
-rw-r--r-- 1 1024 1024   682 Jul 29  2022 kms-site.xml
-rw-r--r-- 1 1024 1024 13700 Jul 29  2022 log4j.properties
-rw-r--r-- 1 1024 1024   951 Jul 29  2022 mapred-env.cmd
-rw-r--r-- 1 1024 1024  1764 Jul 29  2022 mapred-env.sh												# MapReduce环境变量
-rw-r--r-- 1 1024 1024  4113 Jul 29  2022 mapred-queues.xml.template
-rw-r--r-- 1 1024 1024   758 Jul 29  2022 mapred-site.xml											# MapReduce配置
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 shellprofile.d
-rw-r--r-- 1 1024 1024  2316 Jul 29  2022 ssl-client.xml.example
-rw-r--r-- 1 1024 1024  2697 Jul 29  2022 ssl-server.xml.example
-rw-r--r-- 1 1024 1024  2681 Jul 29  2022 user_ec_policies.xml.template
-rw-r--r-- 1 1024 1024    10 Jul 29  2022 workers
-rw-r--r-- 1 1024 1024  2250 Jul 29  2022 yarn-env.cmd
-rw-r--r-- 1 1024 1024  6329 Jul 29  2022 yarn-env.sh													# YARN环境变量
-rw-r--r-- 1 1024 1024  2591 Jul 29  2022 yarnservice-log4j.properties
-rw-r--r-- 1 1024 1024   690 Jul 29  2022 yarn-site.xml												# YARN配置

2.1 core-site.xml

  • hadoop.tmp.dir:数据临时存放目录,默认/tmp/hadoop-${user.name};
  • fs.defaultFS:定义HDFS文件系统的主机信息与端口号,hdfs://[ip|hostname]:port,hadoop1.x默认端口9000,hadoop2.x默认端口8020;
  • io.file.buffer.size:集群读写操作时缓冲区大小,默认4K;

2.2 hdfs-site.xml

  • dfs.namenode.name.dir:DFS 名称节点在文件系统内存储名称表 fsimage 的路径,多个目录使用逗号间隔,名称表会复制存储到所有目录中,默认为file://${hadoop.tmp.dir}/dfs/name;
  • dfs.datanode.data.dir:DFS 数据节点在文件系统内存储数据的路径,多个目录使用逗号间隔,数据将存储在所有目录中,通常存储在不同设备上,默认为file://${hadoop.tmp.dir}/dfs/data;
  • dfs.replication:DFS 数据库的副本数量,默认为3;
  • dfs.blocksize:文件系统中块大小,以字节为单位,可以使用k/m/g/t/p/e指定大小,默认为128M;
  • dfs.namenode.http-address:WebHDFS UI监听地址与端口,默认为0.0.0.0:50070;
  • dfs.webhdfs.enabled:是否启用WebHDFS UI,默认为false,开启为true;
  • fs.checkpoint.period:多长时间记录一次hdfs的镜像,默认1小时;
  • fs.checkpoint.size:一次记录多大的size的镜像,默认64M。

2.3 mapred-site.xml

若是在etc/hadoop/目录下没有mapred-site.xml文件,倒是有一个mapred-site.xml.template样板,可以复制一份进行修改配置。

  • mapreduce.framework.name:指定执行MapReduce作业的运行时框架,属性值可以是local,classic或yarn;
  • mapreduce.jobhistory.address:指定查看运行完mapreduce程序的服务器的IP协议的主机名和端口号,默尔为0.0.0.0:10020;
  • mapreduce.jobhistory.webapp.address:指定使用WebUI查看mapreduce程序的主机名和端口号,默认为0.0.0.0:19888;

2.4 yarn-site.xml

  • yarn.nodemanager.aux-services:指定在进行mapreduce作业时,yarn使用mapreduce_shuffle混洗技术;
  • yarn.nodemanager.aux-services.mapreduce_shuffle.class:指定混洗技术对应的字节码文件,value = org.apache.hadoop.mapred.ShuffleHandler;
  • yarn.resourcemanager.hostname:指定resourcemanager的主机名,默认为0.0.0.0;
  • yarn.resourcemanager.address:指定在RM中的应用程序管理器接口的地址,默认为${yarn.resourcemanager.hostname}:8032;
  • yarn.resourcemanager.scheduler.address:指定RM调度程序接口的地址,默认为${yarn.resourcemanager.hostname}:8030;
  • yarn.resourcemanager.resource-tracker.address:指定RM下的resource-tracker的地址,默认为${yarn.resourcemanager.hostname}:8031;
  • yarn.resourcemanager.admin.address:指定RM管理界面的地址,默认为${yarn.resourcemanager.hostname}:8033;
  • yarn.resourcemanager.webapp.address:指定RM的web访问的地址,默认为${yarn.resourcemanager.hostname}:8088;

3、环境安装

3.1 安装包下载

官网安装包下载链接:https://hadoop.apache.org/releases.html,下载二进制文件即可。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

3.2 单机部署

Hadoop单机部署的情况下没有太大必要部署YARN服务,只是单纯部署HDFS作为测试环境完成实验即可。

[root@master tar]# tar -xf hadoop-3.3.4.tar.gz -C /middleware/
[root@master tar]# cd /middleware/
[root@master middleware]# ln -s hadoop-3.3.4/ hadoop

[root@master middleware]# cd hadoop
[root@master hadoop]# ll
total 116
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 bin
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 etc
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 include
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 lib
drwxr-xr-x 4 1024 1024  4096 Jul 29  2022 libexec
-rw-rw-r-- 1 1024 1024 24707 Jul 29  2022 LICENSE-binary
drwxr-xr-x 2 1024 1024  4096 Jul 29  2022 licenses-binary
-rw-rw-r-- 1 1024 1024 15217 Jul 17  2022 LICENSE.txt
-rw-rw-r-- 1 1024 1024 29473 Jul 17  2022 NOTICE-binary
-rw-rw-r-- 1 1024 1024  1541 Apr 22  2022 NOTICE.txt
-rw-rw-r-- 1 1024 1024   175 Apr 22  2022 README.txt
drwxr-xr-x 3 1024 1024  4096 Jul 29  2022 sbin
drwxr-xr-x 4 1024 1024  4096 Jul 29  2022 share

[root@master hadoop]# vim etc/hadoop/hadoop-env.sh 
export JAVA_HOME=/middleware/jdk

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

[root@master hadoop]# source etc/hadoop/hadoop-env.sh 
[root@master hadoop]# ./bin/hadoop version
Hadoop 3.3.4
Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb
Compiled by stevel on 2022-07-29T12:32Z
Compiled with protoc 3.7.1
From source with checksum fb9dd8918a7b8a5b430d61af858f6ec
This command was run using /middleware/hadoop-3.3.4/share/hadoop/common/hadoop-common-3.3.4.jar

[root@master hadoop]# vim etc/hadoop/core-site.xml  
<configuration>
 <property>
     <name>fs.defaultFS</name>
     <value>hdfs://localhost:9000</value>
 </property>
 <property>
     <name>hadoop.tmp.dir</name>
     <value>/middleware/hadoop/</value>
 </property>
</configuration>

[root@master hadoop]# vim etc/hadoop/hdfs-site.xml 
<configuration>
 <property>
     <name>dfs.replication</name>
     <value>1</value>
 </property>
 <property>
     <name>dfs.webhdfs.enabled</name>
     <value>true</value>
 </property>
 <property>
  <name>dfs.namenode.http-address</name>
  <value>0.0.0.0:50070</value>
 </property>
</configuration>

[root@master hadoop]# bin/hdfs namenode -format
~
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/9.134.244.180
************************************************************/

[root@master hadoop]# tree dfs/
dfs/
└── name
    └── current
        ├── fsimage_0000000000000000000
        ├── fsimage_0000000000000000000.md5
        ├── seen_txid
        └── VERSION

2 directories, 4 files

[root@master hadoop]# ./sbin/start-dfs.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [localhost]
Last login: Tue Jul 11 13:55:17 CST 2023 from 10.95.19.138 on pts/0
localhost: ssh: connect to host localhost port 22: Connection refused
Starting datanodes
Last login: Tue Jul 11 14:10:44 CST 2023 on pts/0
localhost: ssh: connect to host localhost port 22: Connection refused
Starting secondary namenodes [master]
Last login: Tue Jul 11 14:10:44 CST 2023 on pts/0
master: ssh: connect to host master port 22: Connection refused

[root@master hadoop]# vim etc/hadoop/hadoop-env.sh
export HADOOP_SSH_OPTS="-p 36000"

[root@master hadoop]# ./sbin/start-dfs.sh

3.3 集群部署(推荐)

环境准备:JDK安装与升级 + 集群免密登录。

# 制作密钥文件(持续回车保持默认配置)
[root@master hadoop]# ssh-keygen -t rsa -b 4096								# t为加密算法类型,b为秘钥长度
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 			# 秘钥文件存储位置
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FbNOpySF2pNAo2vR9L53bm91fSgJf/MYnHBwTenf35o root@localhost.localhost
The key's randomart image is:
+---[RSA 4096]----+
|     .+  .+    oo|
|     +.o.. +. ...|
|    o .+o.= .o.  |
|     o..+*.o. .. |
|    o   S.oo = o+|
|   .     .  + B B|
|        . . .o *=|
|         . o. o.+|
|           ..oE. |
+----[SHA256]-----+

# 集群节点互相发放密钥文件,首次发放需要进行登录密码验证,三台机器共计发放秘钥文件六次(本机不需要发送到本机)
[root@master hadoop]# ssh-copy-id master
[root@master hadoop]# ssh-copy-id node1
[root@master hadoop]# ssh-copy-id node2

# 配置hosts,将IP替换为当前环境下地址即可
[root@master hadoop]# vim /etc/hosts 
# [hadoop_cluster]
$ip1 master
$ip2 node1
$ip3 node2

3.3.1 HDFS

3.3.1.1 部署
# 解压过程省略
[root@master hadoop]# vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/middleware/jdk
export HADOOP_SSH_OPTS="-p 36000"

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

[root@master hadoop]# vim etc/hadoop/core-site.xml
<configuration>
    <!--指定HDFS的数量-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!--secondary namenode 所在主机的IP和端口-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node1:50090</value>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>master:50090</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
</configuration>

[root@master hadoop]# vim etc/hadoop/hdfs-site.xml
<configuration>
    <!--指定HDFS的数量-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!--secondary namenode 所在主机的IP和端口-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node1:50090</value>
    </property>
</configuration>

[root@master hadoop]# vim etc/hadoop/mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

[root@master hadoop]# vim etc/hadoop/yarn-site.xml
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8034</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
</configuration>

[root@master hadoop]# vim workers 
master
node1
node2

# 格式化HDFS
[root@master hadoop]# ./bin/hdfs namenode -format
~
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/9.134.244.180
************************************************************/

# 启动服务
[root@master hadoop]# ./sbin/start-dfs.sh
Starting namenodes on [master]
Last login: Fri Sep  8 12:30:14 CST 2023 from 10.91.28.109 on pts/2
Starting datanodes
Last login: Fri Sep  8 15:24:19 CST 2023 on pts/1
node2: WARNING: /middleware/hadoop-3.3.4/logs does not exist. Creating.
node1: WARNING: /middleware/hadoop-3.3.4/logs does not exist. Creating.
Starting secondary namenodes [node1]
Last login: Fri Sep  8 15:24:21 CST 2023 on pts/1

# 进程验证
[root@master hadoop]# jps
806826 Jps
801889 DataNode
801667 NameNode

[root@node1 middleware]# jps
1109584 Jps
1095393 DataNode
1095563 SecondaryNameNode

[root@node2 /middleware]# jps
29733 Jps
12063 DataNode
3.3.1.2 验证

HDFS Web端验证:http://9.134.244.180:50090,端口配置参考本文2.1章节core-site.xml中dfs.namenode.http-address参数详解。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

HDFS参数详解:
    -ls                         # 查看目录
    -mkdir                      # 创建目录
    -rmdir                      # 删除空目录
    -rm                         # 删除文件或文件夹
    	-r 												# 强制删除非空目录
    -moveFromLocal              # 从本地剪切到HDFS
    -copyFromLocal              # 从本地复制到HDFS
    -copyToLocal                # 从HDFS复制到本地
    -appendToFile               # 追加文件到末尾
    -cat                        # 查看文件内容
    -cp                         # 在HDFS上复制文件
    -mv                         # 在HDFS上移动文件
    -get                        # = copyToLocal
    -put                        # = copyFromLocal
    -getmerge                   # 合并下载多个文件
    -tail                       # 从末尾查看
    -chgrp/-chmod/-chwon        # 修改文件所属权限
    -du                         # 统计文件夹的大小
    -setrep                     # 设置HDFS中文件副本数(取决于DN数量)

# 上传或下载测试
[root@master hadoop]# echo "this is test!" > ./aaa.txt 
[root@master hadoop]# ./bin/hdfs dfs -put ./aaa.txt /
[root@master hadoop]# ./bin/hdfs dfs -ls /
Found 1 items
-rw-r--r--   3 root supergroup         14 2023-09-11 14:29 /aaa.txt

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

3.3.1.3 数据存储

HDFS的数据存储路径为core-site.xml内dfs.datanode.data.dir参数的值。

[root@master hadoop]# tree dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
├── blk_1073741825
├── blk_1073741825_1001.meta

0 directories, 2 files

[root@master hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@master subdir0]# cat blk_1073741825
this is test!

[root@node1 hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@node1 subdir0]# cat blk_1073741825
this is test!

[root@node2 hadoop]# cd dfs/data/current/BP-1096417423-9.134.244.180-1694157712400/current/finalized/subdir0/subdir0/
[root@node2 subdir0]# cat blk_1073741825
this is test!

# 三台机器的存储数据完全一致,原因:core-site.xml内dfs.replication的副本数量默认值为3

3.3.2 YARN

3.3.2.1 部署
# 配置MapReduce、YARN并分发到node1与node2
[root@master hadoop]# vimetc/hadoop/mapred-site.xml 
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

[root@master hadoop]# vim etc/hadoop/yarn-site.xml 
<configuration>
  <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
  </property>
 <property>
       <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
  </property>
 <property>
        <name>yarn.nodemanager.resource-tracker.address</name>
        <value>master:8031</value>
  </property>
</configuration>

[root@master hadoop]# ./sbin/start-yarn.sh
Starting resourcemanager
Last login: Mon Sep 11 14:35:42 CST 2023 on pts/2
Starting nodemanagers
Last login: Mon Sep 11 15:19:31 CST 2023 on pts/1

# 进程验证
[root@master hadoop]# jps
809885 Jps
809508 NodeManager
809302 ResourceManager
801889 DataNode
801667 NameNode

[root@node1 hadoop]# jps
1095393 DataNode
1117415 Jps
1095563 SecondaryNameNode
1116957 NodeManager

[root@node2 /middleware]# jps
6407 NodeManager
6909 Jps
12063 DataNode
3.3.2.2 验证

YARN Web端验证:http://9.134.244.180:8088,端口配置参考本文2.4章节yarn-site.xml中yarn.resourcemanager.webapp.address参数详解。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

# 创建测试环境,上传一个文本文档到HDFS中
[root@master hadoop]# ./bin/hdfs dfs -mkdir -p /input
[root@master hadoop]# vim word.txt
I’m LiHua , a Chinese student taking summer course in your university . I’m writing to ask for help . I came here last month and found my courses interesting .But I have some difficulty with note-taking and I have no idea of how to use the library . I was told the learning center provides help for students and I’m anxious to get help from you. I have no class on Tuesdays mornings and Friday afternoons . Please let me know which day is ok with you. You may email or phone me . Here are my email address and phone number :lihua@1236.com ; 1234567.
[root@master hadoop]# ./bin/hdfs dfs -put ./word.txt /input

# 使用YARN进行文件单词统计操作,输入文件(存储在HDFS服务):/input/word.txt,输出文件:/output/count.txt
[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-11 15:52:39,678 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
2023-09-11 15:52:39,932 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694418178447_0001
2023-09-11 15:52:42,335 INFO input.FileInputFormat: Total input files to process : 1
2023-09-11 15:52:42,762 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-11 15:52:45,028 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694418178447_0001
2023-09-11 15:52:45,029 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-11 15:52:45,141 INFO conf.Configuration: resource-types.xml not found
2023-09-11 15:52:45,141 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-11 15:52:45,326 INFO impl.YarnClientImpl: Submitted application application_1694418178447_0001
2023-09-11 15:52:45,359 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694418178447_0001/
2023-09-11 15:52:45,360 INFO mapreduce.Job: Running job: job_1694418178447_0001
2023-09-11 15:52:50,413 INFO mapreduce.Job: Job job_1694418178447_0001 running in uber mode : false
2023-09-11 15:52:50,414 INFO mapreduce.Job:  map 0% reduce 0%
2023-09-11 15:52:50,426 INFO mapreduce.Job: Job job_1694418178447_0001 failed with state FAILED due to: Application application_1694418178447_0001 failed 2 times due to AM Container for appattempt_1694418178447_0001_000002 exited with  exitCode: 1
Failing this attempt.Diagnostics: [2023-09-11 15:52:49.413]Exception from container-launch.
Container id: container_1694418178447_0001_02_000001
Exit code: 1

[2023-09-11 15:52:49.446]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

Please check whether your <HADOOP_HOME>/etc/hadoop/mapred-site.xml contains the below configuration:
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>

[2023-09-11 15:52:49.447]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

Please check whether your <HADOOP_HOME>/etc/hadoop/mapred-site.xml contains the below configuration:
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>

For more detailed output, check the application tracking page: http://master:8088/cluster/app/application_1694418178447_0001 Then click on links to logs of each attempt.
. Failing the application.
2023-09-11 15:52:50,440 INFO mapreduce.Job: Counters: 0
# 失败原因:mapreduce配置缺失
[root@master hadoop]# ./bin/hadoop classpath							# 将下面输出的':'修改为','
/middleware/hadoop-3.3.4/etc/hadoop:/middleware/hadoop-3.3.4/share/hadoop/common/lib/*:/middleware/hadoop-3.3.4/share/hadoop/common/*:/middleware/hadoop-3.3.4/share/hadoop/hdfs:/middleware/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/middleware/hadoop-3.3.4/share/hadoop/hdfs/*:/middleware/hadoop-3.3.4/share/hadoop/mapreduce/*:/middleware/hadoop-3.3.4/share/hadoop/yarn:/middleware/hadoop-3.3.4/share/hadoop/yarn/lib/*:/middleware/hadoop-3.3.4/share/hadoop/yarn/*

# 追加配置到MapReduce,并且分发到node1与node2
[root@master hadoop]# vim etc/hadoop/mapred-site.xml 
	<property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
    <property>
      <name>yarn.app.mapreduce.am.env</name>
      <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
      <name>mapreduce.map.env</name>
      <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
      <name>mapreduce.reduce.env</name>
      <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
    	<name>yarn.application.classpath</name>
    	<value>/middleware/hadoop-3.3.4/etc/hadoop,
		/middleware/hadoop-3.3.4/share/hadoop/common/lib/*,
		/middleware/hadoop-3.3.4/share/hadoop/common/*,
		/middleware/hadoop-3.3.4/share/hadoop/hdfs,
		/middleware/hadoop-3.3.4/share/hadoop/hdfs/lib/*,
		/middleware/hadoop-3.3.4/share/hadoop/hdfs/*,
		/middleware/hadoop-3.3.4/share/hadoop/mapreduce/*,
		/middleware/hadoop-3.3.4/share/hadoop/yarn,
		/middleware/hadoop-3.3.4/share/hadoop/yarn/lib/*,
		/middleware/hadoop-3.3.4/share/hadoop/yarn/*</value>
    </property>

# 服务重启
[root@master hadoop]# ./sbin/stop-yarn.sh && ./sbin/start-yarn.sh 
Stopping nodemanagers
Last login: Mon Sep 11 15:42:57 CST 2023 on pts/1
master: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
node1: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
Last login: Mon Sep 11 16:04:48 CST 2023 on pts/1
Starting resourcemanager
Last login: Mon Sep 11 16:04:56 CST 2023 on pts/1
Starting nodemanagers
Last login: Mon Sep 11 16:04:58 CST 2023 on pts/1

# 重新执行
[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-11 16:06:15,116 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
2023-09-11 16:06:15,361 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694419501011_0001
2023-09-11 16:06:15,826 INFO input.FileInputFormat: Total input files to process : 1
2023-09-11 16:06:16,259 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-11 16:06:16,591 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694419501011_0001
2023-09-11 16:06:16,591 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-11 16:06:16,706 INFO conf.Configuration: resource-types.xml not found
2023-09-11 16:06:16,707 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-11 16:06:16,904 INFO impl.YarnClientImpl: Submitted application application_1694419501011_0001
2023-09-11 16:06:16,945 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694419501011_0001/
2023-09-11 16:06:16,945 INFO mapreduce.Job: Running job: job_1694419501011_0001
2023-09-11 16:06:25,035 INFO mapreduce.Job: Job job_1694419501011_0001 running in uber mode : false
2023-09-11 16:06:25,035 INFO mapreduce.Job:  map 0% reduce 0%
2023-09-11 16:06:30,080 INFO mapreduce.Job:  map 100% reduce 0%
2023-09-11 16:06:35,100 INFO mapreduce.Job:  map 100% reduce 100%
2023-09-11 16:06:36,110 INFO mapreduce.Job: Job job_1694419501011_0001 completed successfully
2023-09-11 16:06:36,191 INFO mapreduce.Job: Counters: 54
        File System Counters
                FILE: Number of bytes read=915
                FILE: Number of bytes written=555667
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=654
                HDFS: Number of bytes written=601
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
                HDFS: Number of bytes read erasure-coded=0
        Job Counters 
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=2216
                Total time spent by all reduces in occupied slots (ms)=2858
                Total time spent by all map tasks (ms)=2216
                Total time spent by all reduce tasks (ms)=2858
                Total vcore-milliseconds taken by all map tasks=2216
                Total vcore-milliseconds taken by all reduce tasks=2858
                Total megabyte-milliseconds taken by all map tasks=2269184
                Total megabyte-milliseconds taken by all reduce tasks=2926592
        Map-Reduce Framework
                Map input records=1
                Map output records=106
                Map output bytes=980
                Map output materialized bytes=915
                Input split bytes=98
                Combine input records=106
                Combine output records=77
                Reduce input groups=77
                Reduce shuffle bytes=915
                Reduce input records=77
                Reduce output records=77
                Spilled Records=154
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=99
                CPU time spent (ms)=1150
                Physical memory (bytes) snapshot=595423232
                Virtual memory (bytes) snapshot=5482131456
                Total committed heap usage (bytes)=546832384
                Peak Map Physical memory (bytes)=325435392
                Peak Map Virtual memory (bytes)=2638544896
                Peak Reduce Physical memory (bytes)=269987840
                Peak Reduce Virtual memory (bytes)=2843586560
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters 
                Bytes Read=556
        File Output Format Counters 
                Bytes Written=601

# 执行完成
[root@master hadoop]# ./bin/hdfs dfs -ls /output/count.txt
Found 2 items
-rw-r--r--   3 root supergroup          0 2023-09-11 16:06 /output/count.txt/_SUCCESS										# 执行结果标识
-rw-r--r--   3 root supergroup        601 2023-09-11 16:06 /output/count.txt/part-r-00000								# 执行结果
[root@master hadoop]# ./bin/hdfs dfs -cat /output/count.txt/part-r-00000
,       1
.       5
.But    1
1234567.        1
:lihua@1236.com 1# 结果太多,此处省略

新任务job_1694419501011_0001执行成功,网页展示如下:

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

点击任务可查看详细信息:Attempt:应用Application的尝试任务;Logs:尝试任务日志;Node:执行尝试任务节点。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

Attempt尝试任务详情:

  • Num Node Local Containers (satisfied by)表示在同一节点上启动任务的容器数量。即,任务需要的资源可以满足在同一节点上启动,而不需要通过网络从其他节点上获取资源的容器数量。
  • Num Rack Local Containers (satisfied by)表示在同一机架上启动任务的容器数量。即,任务需要的资源可以从同一机架上的其他节点上获取,而不需要通过网络从不同机架上获取资源的容器数量。
  • Num Off Switch Containers (satisfied by)表示需要跨机架获取资源的容器数量。即,任务需要的资源无法从同一机架上的其他节点上获取,而需要通过网络从不同机架上获取资源的容器数量。

这些指标对于优化Hadoop集群的性能和资源利用率非常重要。例如,如果Num Node Local Containers的数量太少,可能表示某些节点的资源利用率不足;如果Num Off Switch Containers的数量太多,可能表示集群的网络拓扑结构需要优化。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

3.3.2.3 资源控制

YARN资源控制流程如下:

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

  • MR程序提交到客户端所在的节点;
  • YarnRunner向ResourceManager申请一个Application;
  • RM将该应用程序的资源路径返回给YarnRunner;
  • 该程序将运行所需资源提交到HDFS上;
  • 程序资源提交完毕后,申请运行mrAppMaste;
  • RM将用户的请求初始化成一个Task;
  • 其中一个NodeManager领取到Task任务;
  • 该NodeManager创建容器Container,并产生MRAppmaster;
  • Container从HDFS上拷贝资源到本地;
  • MRAppmaster向RM 申请运行MapTask资源;
  • RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器;
  • MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序;
  • MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask;
  • ReduceTask向MapTask获取相应分区的数据;
  • 程序运行完毕后,MR会向RM申请注销自己;

YARN执行任务案例

[root@master hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input/word.txt /output/count.txt
2023-09-12 11:03:02,112 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032														# 客户端申请RM连接
2023-09-12 11:03:02,385 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0001		# RM返回客户端HDFS的job id存储路径

# 插入当时查看记录
[root@master bin]# ./hdfs dfs -ls  /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002
Found 6 items
-rw-r--r--  10 root supergroup     280990 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.jar
-rw-r--r--  10 root supergroup        105 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.split
-rw-r--r--   3 root supergroup         34 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.splitmetainfo
-rw-r--r--   3 root supergroup     236995 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job.xml
-rw-r--r--   3 root supergroup          0 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job_1694487467398_0002_1.jhist
-rw-r--r--   3 root supergroup     273861 2023-09-12 11:23 /tmp/hadoop-yarn/staging/root/.staging/job_1694487467398_0002/job_1694487467398_0002_1_conf.xml

2023-09-12 11:03:03,491 INFO input.FileInputFormat: Total input files to process : 1		# 需要处理的文件总数
2023-09-12 11:03:03,993 INFO mapreduce.JobSubmitter: number of splits:1
2023-09-12 11:03:04,356 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1694487467398_0001		# 任务令牌
2023-09-12 11:03:04,356 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-09-12 11:03:04,477 INFO conf.Configuration: resource-types.xml not found
2023-09-12 11:03:04,477 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-09-12 11:03:04,667 INFO impl.YarnClientImpl: Submitted application application_1694487467398_0001		# 提交的job任务
2023-09-12 11:03:04,703 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1694487467398_0001/
																										# 跟踪查看job任务执行的URL
2023-09-12 11:03:04,704 INFO mapreduce.Job: Running job: job_1694487467398_0001														# 运行中的job任务
2023-09-12 11:03:12,785 INFO mapreduce.Job: Job job_1694487467398_0001 running in uber mode : false
2023-09-12 11:03:12,785 INFO mapreduce.Job:  map 0% reduce 0%																							# MapReduce进度
2023-09-12 11:03:16,824 INFO mapreduce.Job:  map 100% reduce 0%																						# 当Map执行完成开始Reduce
2023-09-12 11:03:21,846 INFO mapreduce.Job:  map 100% reduce 100%																					# Map+Reduce均完成
2023-09-12 11:03:22,855 INFO mapreduce.Job: Job job_1694487467398_0001 completed successfully							# job任务完成标识
2023-09-12 11:03:22,934 INFO mapreduce.Job: Counters: 54
        File System Counters													# 文件系统计数统计									
                FILE: Number of bytes read=915
                FILE: Number of bytes written=555663
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=654
                HDFS: Number of bytes written=601
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
                HDFS: Number of bytes read erasure-coded=0
        Job Counters 																	# job任务计数统计
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=2280
                Total time spent by all reduces in occupied slots (ms)=1981
                Total time spent by all map tasks (ms)=2280
                Total time spent by all reduce tasks (ms)=1981
                Total vcore-milliseconds taken by all map tasks=2280
                Total vcore-milliseconds taken by all reduce tasks=1981
                Total megabyte-milliseconds taken by all map tasks=2334720
                Total megabyte-milliseconds taken by all reduce tasks=2028544
        Map-Reduce Framework													# MapReduce框架信息
                Map input records=1
                Map output records=106
                Map output bytes=980
                Map output materialized bytes=915
                Input split bytes=98
                Combine input records=106
                Combine output records=77
                Reduce input groups=77
                Reduce shuffle bytes=915
                Reduce input records=77
                Reduce output records=77
                Spilled Records=154
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=72
                CPU time spent (ms)=880
                Physical memory (bytes) snapshot=553959424
                Virtual memory (bytes) snapshot=5285777408
                Total committed heap usage (bytes)=591921152
                Peak Map Physical memory (bytes)=327335936
                Peak Map Virtual memory (bytes)=2640453632
                Peak Reduce Physical memory (bytes)=226623488
                Peak Reduce Virtual memory (bytes)=2645323776
        Shuffle Errors																	# Shuffle错误统计
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters 											# 文件输入格式计数器
                Bytes Read=556
        File Output Format Counters 										# 文件输出格式计数器
                Bytes Written=601

3.3.3 集群控制脚本

#!/bin/bash

read -p "please input 'hdfs/yarn/all/help':" a1
cd /middleware/hadoop/sbin					# hadoop安装路径

case ${a1:-help} in
	hdfs )
		read -p "please input 'start/stop/restart':" b2
		case ${b2:-help} in
			start )
				bash start-dfs.sh
			;;
			stop )
				bash stop-dfs.sh
			;;
			restart )
				bash stop-dfs.sh && bash start-dfs.sh
			;;
			* )
				echo "ERROR,please input 'start/stop/restart'!"
			;;
		esac
	;;
	yarn )
		read -p "please input 'start/stop/restart':" c3
		case ${c3:-help} in
			start )
				bash start-yarn.sh
			;;
			stop )
				bash stop-yarn.sh
			;;
			restart )
				bash stop-yarn.sh && bash start-yarn.sh
			;;
			* )
				echo "ERROR,please input 'start/stop/restart'!"
			;;
		esac
	;;
	all )
		read -p "please input 'start/stop/restart':" d4
		case ${d4:-help} in
			start )
				bash start-all.sh
			;;
			stop )
				bash stop-all.sh
			;;
			restart )
				bash stop-all.sh && bash start-all.sh
			;;
			* )
				echo "ERROR,please input 'start/stop/restart'!"
			;;
		esac
	;;
	* )
		echo "ERROR,please input 'hdfs/yarn/all/help'!"
	;;
esac

cd - > /dev/null 2>&1

4、常见操作

4.1 NN异常恢复

模拟NN节点异常,将SNN fsimage数据导入NN进行恢复的场景。

[root@master hadoop]# kill -9 19514									# NameNode进程
1.2 
[root@node1 hadoop]# ll dfs/
total 8
drwx------ 3 root root 4096 Sep 11 14:35 data
drwxr-xr-x 3 root root 4096 Sep 11 14:35 namesecondary
# 备份NN数据
[root@master hadoop]# mkdir /tmp/nn_backup/
[root@master hadoop]# mv dfs/name/* /tmp/nn_backup/
# 将SNN的数据拷贝到NN
[root@node1 hadoop]# scp -r -P 36000 dfs/namesecondary/* master:/middleware/hadoop/dfs/name/
# 导入元数据
[root@master hadoop]# ./bin/hadoop namenode –importCheckpoint
# 启动HDFS
[root@master hadoop]# ./sbin/start-dfs.sh
# 导入fsimage文件后,可能需要等待一段时间才能完成所有块的复制和状态更新。在此期间,HDFS可能无法对外提供完全正常的服务

4.2 安全模式

HDFS集群正常开启时处于短暂的安全模式,不能执行重要操作(写操作),待集群启动完成后,自动退出安全模式。

# 查看
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode get
Safe mode is OFF
# 开启
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode enter
Safe mode is ON
# 关闭
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode leave
Safe mode is OFF
# 等待
[root@master hadoop-1]# ./bin/hdfs dfsadmin -safemode wait
Safe mode is OFF

4.3 数据平衡

新加入的节点,没有数据块的存储,或HDFS长期使用过程发现其数据分布不均衡,部分节点远超其他节点时,使得集群整体来看负载还不均衡。因此需要对HDFS数据存储设置负载均衡。

# 默认的数据传输带宽比较低,可以设置为64M
[root@master hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 67108864
# 默认balancer的threshold为10%(各个节点与集群总的存储使用率相差不超过10%)
[root@master hadoop]# ./sbin/start-balancer.sh -threshold 5

4.4 集群扩/缩容

4.4.1 扩容

# 配置免密登录,参考本文3.3章节环境准备操作
[root@master hadoop]# ssh-keygen -t rsa -b 4096
# 下发密钥到其他节点,并拷贝其他节点密钥到本地,共计6次(对外3次,对内3次)
[root@master hadoop]# ssh-copy-id master

# 附加hosts
[root@node3 hadoop]# vim /etc/hosts$ip4 node3

# 附加workers
[root@node3 hadoop]# vim workers
~
node3

# 启动node3 DdataNode与NodeManager
[root@node3 hadoop]# hadoop-daemon.sh start datanode
[root@node3 hadoop]# yarn-daemon.sh start nodemanager

# 可以使用工具查看YARN NM机器列表;HDFS DN列表可通过浏览器查看ip:50090中DataNodes页面
[root@master hadoop]# ./bin/yarn node -list
2023-09-12 14:28:47,291 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at master/9.134.244.180:8032
Total Nodes:4
         Node-Id             Node-State Node-Http-Address       Number-of-Running-Containers
    master:41295                RUNNING       master:8042                                  0
     node2:38853                RUNNING        node2:8042                                  0
     node1:41665                RUNNING        node1:8042                                  0
     node3:41573                RUNNING        node3:8042                                  0

# 开启node3为DN后数据块不会立刻存储到node3上,可以使用数据平衡操作重新平衡数据分配
[root@node3 hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 104857600
[root@node3 hadoop]# ./bin/hdfs balancer -threshold 1					# 集群数据较少,因此阈值设置为1,平衡操作参考本文4.3章节,等待集群自均衡完成即可

4.4.2 缩容

DataNode缩容不像扩容那样启动一个节点即可, 缩容需要把当前节点数据移出去,Hadoop已经提供了下线功能,前提是在NameNode机器的hdfs-site.xml配置文件中需要提前配置dfs.hosts.exclude属性,该属性指向的文件就是所谓的黑名单列表,会被NameNode排除在集群之外。如果文件内容为空,则意味着不禁止任何机器。所以在安装Hadoop的时候就需要指定好改配置,如果最开始没有配置该参数,则需要添加后重启NameNode 。

# 在NameNode所在服务器的配置目录etc/hadoop下创建dfs.hosts.exclude文件,并添加需要退役的主机名称。
[root@master hadoop]# vim hdfs-site.xml<property>
    <name>dfs.hosts.exclude</name>
    <value>/middleware/hadoop/etc/hadoop/excludes</value>
</property>
# 重启NN使其配置生效

[root@master hadoop]# vim /middleware/hadoop/etc/hadoop/excludes
node3
# 如果副本数是3,在线的节点小于等于3,是不能下线成功的,需要修改副本数后才能下线。

# 刷新NameNode、刷新ResourceManager进程
[root@master hadoop]# ./bin/hdfs dfsadmin -refreshNodes
[root@master hadoop]# ./bin/yarn rmadmin –refreshNodes
# 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器

# 停止node3进程
[root@master hadoop]# ./sbin/hadoop-daemon.sh stop datanode
[root@master hadoop]# ./sbin/yarn-daemon.sh stop nodemanager

4.5 回收站

在HDFS中删除的文件不会直接彻底清掉,会先丢弃到回收站中(HDFS回收站路径:/user/root/.Trash/),过一段时间之后,自动清空垃圾桶当中的文件。

在core-site.xml配置中fs.trash.interval=0代表禁用回收站,大于0时表示启用回收站,以分钟为单位的垃圾回收时间;默认值fs.trash.checkpoint.interval=0,如果是0,值等同于fs.trash.interval,以分钟为单位的垃圾回收检查间隔。要求fs.trash.checkpoint.interval<=fs.trash.interval。

[root@master hadoop]# vim core-site.xml
<!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
  <name>fs.trash.interval</name>
  <value>10</value>
</property>

[root@master hadoop]# ./sbin/stop-dfs.sh && ./sbin/start-dfs.sh

# 测试删除
[root@master hadoop]# ./bin/hdfs dfs -put ./aaa.txt /delete.txt
[root@master hadoop]# ./bin/hdfs dfs -rm /delete.txt
2023-09-11 19:37:43,757 INFO fs.TrashPolicyDefault: Moved: 'hdfs://master:9000/delete.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current/delete.txt
[root@master hadoop]# ./bin/hdfs dfs -ls /user/root/.Trash/Current/
Found 1 items
-rw-r--r--   3 root supergroup         14 2023-09-11 19:37 /user/root/.Trash/Current/delete.txt

# 恢复数据
[root@master hadoop]# ./bin/hadoop fs -mv /user/root/.Trash/Current/delete.txt /
[root@master hadoop]# ./bin/hdfs dfs -ls /delete.txt
-rw-r--r--   3 root supergroup         14 2023-09-11 19:37 /delete.txt
# 清空回收站
[root@master bin]# ./hadoop fs -expunge
2023-09-12 11:02:07,077 INFO fs.TrashPolicyDefault: TrashPolicyDefault#deleteCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,077 INFO fs.TrashPolicyDefault: TrashPolicyDefault#deleteCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,087 INFO fs.TrashPolicyDefault: TrashPolicyDefault#createCheckpoint for trashRoot: hdfs://master:9000/user/root/.Trash
2023-09-12 11:02:07,094 INFO fs.TrashPolicyDefault: Created trash checkpoint: /user/root/.Trash/230912110207

4.6 Snapshot 快照

Snapshot是HDFS整个文件系统,或者某个目录在某个时刻的镜像。**快照不是数据的简单拷贝,快照只做差异的记录!**HDFS 快照的核心功能包括:数据恢复、数据备份、数据测试。

  • 差异拷贝:在 HDFS 中,如果在其中一个目录比如/A下创建一个快照,则快照文件中将会存在与/A目录下完全一致的子目录文件结构以及相应的属性信息,通过命令也能看到快照里面具体的文件内容。但是这并不意味着快照已经对此数据进行完全的拷贝 。这里遵循一个原则:对于大多不变的数据,你所看到的数据其实是当前物理路径所指的内容,而发生变更的inode数据才会被快照额外拷贝;
  • HDFS快照不会复制Datanode中的块,只记录了块列表和文件大小;
  • HDFS快照不会对常规HDFS操作产生不利影响,修改记录按逆时针顺序进行,因此可以直接访问当前数据,通过从当前数据中减去修改来计算快照数据;

4.6.1 操作命令

HDFS 中可以针对整个文件系统或者文件系统中某个目录创建快照,但是创建快照的前提是相应的目录开启快照的功能。

# 启用快照功能
[root@master hadoop]# ./hdfs dfsadmin -allowSnapshot $path
# 禁用快照功能
[root@master hadoop]# ./hdfs dfsadmin -disallowSnapshot $path
# 对目录创建快照
[root@master hadoop]# ./hdfs dfs -createSnapshot $path
# 指定名称创建快照
[root@master hadoop]# ./hdfs dfs -createSnapshot $path $name
# 重命名快照
[root@master hadoop]# ./hdfs dfs -renameSnapshot $path $name1 $name2
# 列出当前用户所有可快照目录
[root@master hadoop]# ./hdfs lsSnapshottableDir
# 比较两个快照目录的不同之处
[root@master hadoop]# ./hdfs snapshotDiff $path1 $path2
# # 删除快照
[root@master hadoop]# ./hdfs dfs -deleteSnapshot $path $name

4.6.2 快照使用

4.6.2.1开启快照
[root@master hadoop]# ./bin/hdfs dfsadmin -allowSnapshot /input
Allowing snapshot on /input succeeded

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

4.6.2.2 对指定目录创建快照
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input
Created snapshot /input/.snapshot/s20230912-144829.624

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap1
Created snapshot /input/.snapshot/mysnap1

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

4.6.2.3 重命名快照
[root@master hadoop]# ./bin/hdfs dfs -renameSnapshot /input mysnap1 mysnap2
Renamed snapshot mysnap1 to mysnap2 under hdfs://master:9000/input

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

4.6.2.4 列出当前用户所有可以快照的目录
[root@master hadoop]# ./bin/hdfs lsSnapshottableDir
drwxr-xr-x 0 root supergroup 0 2023-09-12 14:49 2 65536 /input
4.6.2.5 比较两个快照不同之处
[root@master hadoop]# echo 222 > 2.txt
[root@master hadoop]# ./bin/hadoop fs -appendToFile 2.txt /input/1.txt
[root@master hadoop]# ./bin/hadoop fs -cat /input/1.txt
222
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap3
Created snapshot /input/.snapshot/mysnap3
[root@master hadoop]# ./bin/hadoop fs -put 2.txt /input
[root@master hadoop]# ./bin/hdfs dfs -createSnapshot /input mysnap4
Created snapshot /input/.snapshot/mysnap4
[root@master hadoop]# ./bin/hdfs snapshotDiff /input mysnap2 mysnap4
Difference between snapshot mysnap2 and snapshot mysnap4 under directory /input:
M       .
+       ./1.txt
+       ./2.txt

# 表头备注:
# + The file/directory has been created.
# - The file/directory has been deleted.
# M The file/directory has been modified.
# R The file/directory has been renamed.

4.6.2.6 删除快照
[root@master hadoop]# ./bin/hdfs dfs -deleteSnapshot /input mysnap4
Deleted snapshot mysnap4 under hdfs://master:9000/input
4.6.2.7 删除有快照的目录
# 拥有快照的目录不允许被删除(强制-r仍不可删除),某种程度上也保护了文件安全
[root@master hadoop]# ./bin/hadoop fs -rm -r /input
rm: Failed to move to trash: hdfs://master:9000/input: The directory /input cannot be deleted since /input is snapshottable and already has snapshots

5、错误记录

5.1 Java版本不兼容

java版本过高,与当前Hadoop部分代码不兼容导致功能异常,报错如下:

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

降低Java版本,本环境使用TencentJDK 17(为何不用Oracle JDK的原因:虚拟机为测试机器,版权问题无法使用),降低为TencentJDK 8。

[root@node2 ~]# tar -xf /root/TencentKona8.0.15.b2_jdk_linux-x86_64_8u382.tar.gz  -C /middleware/
[root@node2 ~]# cd /middleware/
# 由于之前JDK部署为软链接,因此降低版本只需要更新软链接即可
export JAVA_HOME=/middleware/jdk
export PATH=${JAVA_HOME}/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib

[root@node2 /middleware]# unlink jdk
[root@node2 /middleware]# ln -s TencentKona-8.0.15-382/ jdk
[root@node2 /middleware]# source /etc/profile
[root@node2 /middleware]# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (Tencent Kona 8.0.15) (build 1.8.0_382-b2)
OpenJDK 64-Bit Server VM (Tencent Kona 8.0.15) (build 25.382-b2, mixed mode, sharing)

# 重启服务
[root@master hadoop]# ./sbin/stop-dfs.sh && ./sbin/start-dfs.sh

重新使用浏览器登录或刷新页面即可查看到数据展示正常。

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

5.2 无法正常查看文件内容

上传一个文件后,使用Head eth file或Tail the file时无法正常查看文件内容,报错如下:

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce

这是因为机器内部发送请求为http://node2:9864/webhdfs/v1/aaa.txt请求时,当前物理机器无法识别node2的ip地址导致异常,需要更改本地Hosts,添加master、node1、node2三个机器的ip地址。

  • MAC:/etc/hosts

  • Windows:C:\Windows\System32\drivers\etc\hosts

修改完成后刷新页面重新访问即可恢复。
Middleware ❀ Hadoop功能与使用详解(HDFS+YARN),Middleware,hadoop,hdfs,大数据,yarn,mapreduce文章来源地址https://www.toymoban.com/news/detail-733461.html

到了这里,关于Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【运维】hadoop 集群安装(三)hdfs、yarn集群配置、nodemanager健康管理讲解

    上篇简单说明了多节点的hadoop节点怎么安装,但是没有细致的分析hadoop相关配置,具体怎么根据环境进行配置,接下来我们对这些配置进行讲解 Daemon Environment Variable NameNode HDFS_NAMENODE_OPTS DataNode HDFS_DATANODE_OPTS Secondary NameNode HDFS_SECONDARYNAMENODE_OPTS ResourceManager YARN_RESOURCEMANAGER_OP

    2024年02月10日
    浏览(33)
  • 三台异构服务器搭建hadoop HA集群史上最详细方案(HDFS+YARN)

     一、系统基础服务配置 主机名 IP 操作系统 CPU 内存 磁盘 Hive01 10.86.102.104 Centos 7.9.2009 Xeon 4208 X16 192G 46T Hive02 10.86.102.102 Centos 7.9.2009 Xeon 4208 X16 192G 46T Hive03 10.86.102.105 Centos 7.9.2009 Xeon 8260 X48 256G         11T 最终组成的是一个双副本56T的集群,设置YARN内存共400GB(可调) 3台服务

    2024年02月07日
    浏览(44)
  • HADOOP HDFS详解

    目录 第一章 概述 1.1大数据的特征(4V) 1.2 大数据的应用场景 1.3大数据的发展前景 1.4企业大数据的一般处理流程 1.4.1数据源 1.4.2数据采集或者同步 1.4.3数据存储 1.4.4 数据清洗 1.4.5 数据分析 1.4.6数据展示 第二章 hadoop介绍 2.1.hadoop 目标 2.2 hadoop的介绍 2.3 hadoop起源 2.4 Hadoop版本

    2024年03月13日
    浏览(44)
  • 【Hadoop精讲】HDFS详解

    目录 理论知识点 角色功能 元数据持久化 安全模式 SecondaryNameNode(SNN) 副本放置策略 HDFS写流程 HDFS读流程 HA高可用 CPA原则 Paxos算法 HA解决方案 HDFS-Fedration解决方案(联邦机制) 另一台机器就是SecondaryNameNode(SNN) 不保存位置信息的原因,是因为当机器重启恢复后,DN会和NN建立心

    2024年02月02日
    浏览(29)
  • hadoop-hdfs简介及常用命令详解(超详细)

    HDFS(Hadoop Distributed File System)是Apache Hadoop生态系统中的分布式文件系统,用于存储和处理大规模数据集。HDFS具有高容错性、高可靠性和高吞吐量的特点,适用于大数据处理和分析场景。本文将介绍HDFS的基本概念和常用操作,帮助您更好地理解和使用HDFS。 HDFS 是一个分布式

    2024年02月04日
    浏览(41)
  • Java 操作 Hadoop 集群之 HDFS 的应用案例详解

    注意:本文内容基于 Hadoop 集群搭建完成基础上: Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤 本文的内容是基于下面前提: Hadoop 集群搭建完成并能正常启动和访问 Idea 和 Maven 分别安装完成 需要有 JavaSE 基础和熟悉操作hadoop 的 hdfs dfs 命令 Maven 及 idea 中 Maven 相关配置 本地

    2024年04月16日
    浏览(30)
  • Hadoop入门学习笔记——三、使用HDFS文件系统

    视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd=5ay8 Hadoop入门学习笔记(汇总) 3.1.1. HDFS文件系统基本信息 HDFS和Linux系统一样,均是以 / 作为根目录的组织形式; 如何区分HDFS和Linux文件系统: Linux文件系统以 file:// 作为

    2024年01月16日
    浏览(31)
  • Hadoop学习-集群配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

    配置核心文件 core-site.xml 编辑core-site.xml(进入hadoop文件夹内) hdfs-site.xml yarn-site.xml mapred-site.xml 配置完后要分发给其他服务器,可以使用之前写的分发脚本xsync进行快速分发 配置workers(各集群节点) 启动集群 如果集群是第一次启动 ,需要在 hadoop102 节点格式化 NameNode(注意:格式

    2024年02月08日
    浏览(32)
  • 大数据技术之Hadoop:使用命令操作HDFS(四)

    目录 一、创建文件夹 二、查看指定目录下的内容 三、上传文件到HDFS指定目录下 四、查看HDFS文件内容 五、下载HDFS文件 六、拷贝HDFS文件 七、HDFS数据移动操作 八、HDFS数据删除操作 九、HDFS的其他命令 十、hdfs web查看目录 十一、HDFS客户端工具 11.1 下载插件 11.2 本地安装Had

    2024年02月09日
    浏览(38)
  • 【Hadoop】HDFS读写流程和客户端命令使用

    🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包