当前位置: 首页 > news >正文

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

文章目录

  • 1、服务概述
    • 1.1 HDFS
      • 1.1.1 架构解析
        • 1.1.1.1 Block 数据块
        • 1.1.1.2 NameNode 名称节点
        • 1.1.1.3 Secondary NameNode 第二名称节点
        • 1.1.1.4 DataNode 数据节点
        • 1.1.1.5 Block Caching 块缓存
        • 1.1.1.6 HDFS Federation 联邦
        • 1.1.1.7 Rack Awareness 机架感知
      • 1.1.2 读写操作与可靠性
        • 1.1.2.1 写操作
        • 1.1.2.2 读操作
        • 1.1.2.3 可靠性
      • 1.1.3 NameNode元数据解析
    • 1.2 YARN
      • 1.2.1 架构演变
      • 1.2.2 基本流程
      • 1.2.3 进程组件
        • 1.2.3.1 ResourceManager 资源管理
        • 1.2.3.2 NodeManager 节点管理
        • 1.2.3.3 ApplicationMaster 应用管理
        • 1.2.3.4 Container 容器
        • 1.2.3.5 Failover 故障处理
    • 1.3 MapReduce
      • 1.3.1 Map
      • 1.3.2 Reduce
      • 1.3.3 读取数据
        • 1.3.3.1 InputFormat 输入格式化
        • 1.3.3.2 InputSplit 输入分割
        • 1.3.3.3 RecordReader 记录读者
        • 1.3.3.4 Mapper 映射器
        • 1.3.3.5 Shuffle 清洗器
  • 2、配置文件常用参数
    • 2.1 core-site.xml
    • 2.2 hdfs-site.xml
    • 2.3 mapred-site.xml
    • 2.4 yarn-site.xml
  • 3、环境安装
    • 3.1 安装包下载
    • 3.2 单机部署
    • 3.3 集群部署(推荐)
      • 3.3.1 HDFS
        • 3.3.1.1 部署
        • 3.3.1.2 验证
        • 3.3.1.3 数据存储
      • 3.3.2 YARN
        • 3.3.2.1 部署
        • 3.3.2.2 验证
        • 3.3.2.3 资源控制
      • 3.3.3 集群控制脚本
  • 4、常见操作
    • 4.1 NN异常恢复
    • 4.2 安全模式
    • 4.3 数据平衡
    • 4.4 集群扩/缩容
      • 4.4.1 扩容
      • 4.4.2 缩容
    • 4.5 回收站
    • 4.6 Snapshot 快照
      • 4.6.1 操作命令
      • 4.6.2 快照使用
        • 4.6.2.1开启快照
        • 4.6.2.2 对指定目录创建快照
        • 4.6.2.3 重命名快照
        • 4.6.2.4 列出当前用户所有可以快照的目录
        • 4.6.2.5 比较两个快照不同之处
        • 4.6.2.6 删除快照
        • 4.6.2.7 删除有快照的目录
  • 5、错误记录
    • 5.1 Java版本不兼容
    • 5.2 无法正常查看文件内容

1、服务概述

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

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

1.1 HDFS

Hadoop Distributed File System,Hadoop分布式文件系统,简称HDFS
在这里插入图片描述

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把机器之间的拓扑结构组织成树结构,并且用到达公共父节点所需跳转数之和作为距离。事实上这是一个距离矩阵的例子。下面的例子简明地说明了距离的计算:

在这里插入图片描述

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

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

1.1.2 读写操作与可靠性

1.1.2.1 写操作

在这里插入图片描述

  • 客户端将文件写入本地磁盘的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 读操作

在这里插入图片描述

  • 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的值。

在这里插入图片描述

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

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

在这里插入图片描述

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: 资源申请的单位和任务运行的容器。

两种版本架构对比

在这里插入图片描述

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

1.2.2 基本流程

在这里插入图片描述

在这里插入图片描述

  • 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,从而减少数据移动)。

内部结构

在这里插入图片描述

  • 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之前将需要的程序及其依赖包、配置文件等拷贝到本地)

内部结构

在这里插入图片描述

  • 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输入格式一定是相同的。

在这里插入图片描述
在这里插入图片描述

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,下载二进制文件即可。

在这里插入图片描述

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/jdkexport 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└── VERSION2 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参数详解。

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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.meta0 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参数详解。

在这里插入图片描述

在这里插入图片描述

# 创建测试环境,上传一个文本文档到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.MRAppMasterPlease 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.MRAppMasterPlease 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: 54File System CountersFILE: Number of bytes read=915FILE: Number of bytes written=555667FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=654HDFS: Number of bytes written=601HDFS: Number of read operations=8HDFS: Number of large read operations=0HDFS: Number of write operations=2HDFS: Number of bytes read erasure-coded=0Job Counters Launched map tasks=1Launched reduce tasks=1Data-local map tasks=1Total time spent by all maps in occupied slots (ms)=2216Total time spent by all reduces in occupied slots (ms)=2858Total time spent by all map tasks (ms)=2216Total time spent by all reduce tasks (ms)=2858Total vcore-milliseconds taken by all map tasks=2216Total vcore-milliseconds taken by all reduce tasks=2858Total megabyte-milliseconds taken by all map tasks=2269184Total megabyte-milliseconds taken by all reduce tasks=2926592Map-Reduce FrameworkMap input records=1Map output records=106Map output bytes=980Map output materialized bytes=915Input split bytes=98Combine input records=106Combine output records=77Reduce input groups=77Reduce shuffle bytes=915Reduce input records=77Reduce output records=77Spilled Records=154Shuffled Maps =1Failed Shuffles=0Merged Map outputs=1GC time elapsed (ms)=99CPU time spent (ms)=1150Physical memory (bytes) snapshot=595423232Virtual memory (bytes) snapshot=5482131456Total committed heap usage (bytes)=546832384Peak Map Physical memory (bytes)=325435392Peak Map Virtual memory (bytes)=2638544896Peak Reduce Physical memory (bytes)=269987840Peak Reduce Virtual memory (bytes)=2843586560Shuffle ErrorsBAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0File Input Format Counters Bytes Read=556File 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执行成功,网页展示如下:

在这里插入图片描述

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

在这里插入图片描述

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的数量太多,可能表示集群的网络拓扑结构需要优化。

在这里插入图片描述

3.3.2.3 资源控制

YARN资源控制流程如下:

在这里插入图片描述

  • 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.xml2023-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: 54File System Counters													# 文件系统计数统计									FILE: Number of bytes read=915FILE: Number of bytes written=555663FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=654HDFS: Number of bytes written=601HDFS: Number of read operations=8HDFS: Number of large read operations=0HDFS: Number of write operations=2HDFS: Number of bytes read erasure-coded=0Job Counters 																	# job任务计数统计Launched map tasks=1Launched reduce tasks=1Data-local map tasks=1Total time spent by all maps in occupied slots (ms)=2280Total time spent by all reduces in occupied slots (ms)=1981Total time spent by all map tasks (ms)=2280Total time spent by all reduce tasks (ms)=1981Total vcore-milliseconds taken by all map tasks=2280Total vcore-milliseconds taken by all reduce tasks=1981Total megabyte-milliseconds taken by all map tasks=2334720Total megabyte-milliseconds taken by all reduce tasks=2028544Map-Reduce Framework													# MapReduce框架信息Map input records=1Map output records=106Map output bytes=980Map output materialized bytes=915Input split bytes=98Combine input records=106Combine output records=77Reduce input groups=77Reduce shuffle bytes=915Reduce input records=77Reduce output records=77Spilled Records=154Shuffled Maps =1Failed Shuffles=0Merged Map outputs=1GC time elapsed (ms)=72CPU time spent (ms)=880Physical memory (bytes) snapshot=553959424Virtual memory (bytes) snapshot=5285777408Total committed heap usage (bytes)=591921152Peak Map Physical memory (bytes)=327335936Peak Map Virtual memory (bytes)=2640453632Peak Reduce Physical memory (bytes)=226623488Peak Reduce Virtual memory (bytes)=2645323776Shuffle Errors																	# Shuffle错误统计BAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0File Input Format Counters 											# 文件输入格式计数器Bytes Read=556File Output Format Counters 										# 文件输出格式计数器Bytes Written=601

3.3.3 集群控制脚本

#!/bin/bashread -p "please input 'hdfs/yarn/all/help':" a1
cd /middleware/hadoop/sbin					# hadoop安装路径case ${a1:-help} inhdfs )read -p "please input 'start/stop/restart':" b2case ${b2:-help} instart )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':" c3case ${c3:-help} instart )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':" d4case ${d4:-help} instart )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'!";;
esaccd - > /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:4Node-Id             Node-State Node-Http-Address       Number-of-Running-Containersmaster:41295                RUNNING       master:8042                                  0node2:38853                RUNNING        node2:8042                                  0node1:41665                RUNNING        node1:8042                                  0node3: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

在这里插入图片描述

4.6.2.2 对指定目录创建快照

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

在这里插入图片描述

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

在这里插入图片描述

4.6.2.3 重命名快照

[root@master hadoop]# ./bin/hdfs dfs -renameSnapshot /input mysnap1 mysnap2
Renamed snapshot mysnap1 to mysnap2 under hdfs://master:9000/input

在这里插入图片描述

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部分代码不兼容导致功能异常,报错如下:

在这里插入图片描述

降低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

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

在这里插入图片描述

5.2 无法正常查看文件内容

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

在这里插入图片描述

在这里插入图片描述

这是因为机器内部发送请求为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)

文章目录 1、服务概述1.1 HDFS1.1.1 架构解析1.1.1.1 Block 数据块1.1.1.2 NameNode 名称节点1.1.1.3 Secondary NameNode 第二名称节点1.1.1.4 DataNode 数据节点1.1.1.5 Block Caching 块缓存1.1.1.6 HDFS Federation 联邦1.1.1.7 Rack Awareness 机架感知 1.1.2 读写操作与可…...

Matlab图像处理-从RGB转换为HSV

从RGB转换为HSV HSV彩色系统基于圆柱坐标系。从RGB转换为HSV需要开发将(笛卡儿坐标系中的)RGB值映射到圆柱坐标系的公式。多数计算机图形学教材中已详细推导了这一公式&#xff0c;故此处从略。 从RGB转换为HSV的MATLAB函数是rgb2hsv&#xff0c;其语法为&#xff1a; hsv_imag…...

iOS Error Domain=PHPhotosErrorDomain Code=3300

AVCapturePhoto的数据保存到 PHPhotoLibrary的时候报错Error DomainPHPhotosErrorDomain Code3300解决代码&#xff08;也可以使用addResourceWithType:data:options:来添加数据到request&#xff0c;JEPG的实测可以&#xff0c;raw的不确定&#xff09;&#xff1a; [PHPhoto…...

LeetCode(力扣)435. 无重叠区间Python

LeetCode435. 无重叠区间 题目链接代码 题目链接 https://leetcode.cn/problems/non-overlapping-intervals/ 代码 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if not intervals:return 0intervals.sort(keylambda x: x[0])co…...

opencv c++实现鼠标框选区域并显示选择的图片区域

OpenCV可以使用setMouseCallback设置鼠标事件的回调函数,从而然后根据需要进行处理。 setMouseCallback原型为: void cv::setMouseCallback(const cv::String& windowName, MouseCallback onMouse, void* userData = 0); 其中,参数说明如下:windowName:窗口名称 onMo…...

Python实现自主售卖机

1 问题 在python中我们常常使用到条件判断&#xff0c;if语句时常见的条件判断语句之一。那么如何使用if语句实现根据情况自动选择商品进行售卖呢&#xff1f; 2 方法 根据if语句执行时从上往下执行的特点&#xff0c;使用if语句、dict和list来实现整个流程。 代码清单 1 drink…...

任务复杂度与人机

任务复杂度计算是指根据任务的难易程度和需要的资源投入来评估任务的复杂程度。一般来说&#xff0c;任务复杂度计算会考虑以下几个因素&#xff1a; 难度程度&#xff1a;任务的难度程度是指完成任务所需要的知识、技能和经验等的要求。较高的难度程度会增加任务的复杂度。任务…...

Windows关闭zookeeper、rocketmq日志输出以及修改rocketmq的JVM内存占用大小

JDK-1.8zookeeper-3.4.14rocketmq-3.2.6 zookeeper 进入到zookeeper的conf目录 清空配置文件&#xff0c;只保留下面这一行。zookeeper关闭日志输出相对简单。 log4j.rootLoggerOFFrocketmq 进入到rocketmq的conf目录 logback_broker.xml <?xml version"1.0&q…...

Convai:让虚拟游戏角色更智能的对话AI人工智能平台

【产品介绍】​ 名称 Convai​ 具体描述​ Convai是一款专为虚拟世界而设计的对话人工智能平台&#xff0c;它可以让你为你的游戏或应用中的角色 赋予人类般的对话能力。Convai利用了最先进的生成式对话人工智能技术&#xff0c;让你的角色可以…...

【送书活动】大模型赛道如何实现华丽的弯道超车

文章目录 导读前言AI/ML 模型训练任务对数据平台的需求01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率&#xff0c;降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署 核心密码01 通过数据抽象化统一数据孤岛02 通过分布…...

opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4

博客【opencv dnn模块 示例(3) 目标检测 object_detection (2) YOLO object detection】 测试了yolov3 及之前系列的模型&#xff0c;有在博客【opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速&#xff08;vs2015异常解决&#xff09;】 说明了如何使用dnn模块进行cuda…...

Python提取JSON数据中的键值对并保存为.csv文件

本文介绍基于Python&#xff0c;读取JSON文件数据&#xff0c;并将JSON文件中指定的键值对数据转换为.csv格式文件的方法。 在之前的文章Python提取JSON文件中的指定数据并保存在CSV或Excel表格文件内&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/132…...

使用IDEA开发Servlet

一、新建工程 二、填写新工程的基本信息 javaee8的项目可以运行在tomcat9 三、配置tomcat 1、编辑server信息 “On frame deactivation”的意思是idea窗口发生切换时。 2、编辑部署信息 war exploded方式&#xff0c;这种方式是以文件夹方式部署的&#xff0c;支持热加载。 …...

腾讯mini项目-【指标监控服务重构】2023-07-21

今日已办 当在Docker容器中运行程序时&#xff0c;可能会遇到使用os.Getpid()函数时出现异常的情况。这是因为Docker容器中的进程隔离机制与宿主机器不同&#xff0c;容器内部的进程可能无法访问宿主机器的进程信息。 要解决这个问题&#xff0c;可以尝试&#xff1a; 使用do…...

Spring MVC里的DispatchServlet(结合Spring官网翻译)

Spring MVC里的DispatchServlet 前言1.Spring Web MVC1.1 DispatcherServlet&#xff08;中央调度器&#xff09;1.1.1 Context Hierarchy&#xff08;上下文层次结构&#xff09;1.1.2 Special Bean Types&#xff08;特定的bean类型&#xff09;1.1.3 Web MVC Config1.1.4 Se…...

数据分享|R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型...

全文链接&#xff1a;http://tecdat.cn/?p32496 人口流动与迁移&#xff0c;作为人类产生以来就存在的一种社会现象&#xff0c;伴随着人类文明的不断进步从未间断&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 人力资源是社会文明进步、人民富裕…...

解决 Axios 跨域问题,轻松实现接口调用

跨域是指访问另外一个域的资源&#xff0c;由于浏览器的同源策略&#xff0c;默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略&#xff0c;这是由浏览器对 JavaScript 施加的安全限制。 Axios 跨域常见报错 跨域请求被阻止 (…...

Layui快速入门之第十节 表单

目录 一&#xff1a;基本用法 二&#xff1a;输入框 普通输入框 输入框点缀 前置和后置 前缀和后缀 动态点缀 密码显隐 内容清除 自定义动态点缀 点缀事件 三&#xff1a;复选框 默认风格 标签风格 开关风格 复选框事件 四&#xff1a;单选框 普通单选框 自…...

Linux之yum/git的使用

目录 一、yum 1、关于yum 2、yum的操作 ①、yum list ②、yum install ③、yum remove 二、git 1、Linux中连接gitee 2、git的操作 ①git add [文件] ②git commit -m "提交日志" ③git push 3、可能出现的问题 ①配置用户名、邮箱 ②出现提交冲突 ③…...

使用ExcelJS快速处理Node.js爬虫数据

什么是ExcelJS ExcelJS是一个用于处理Excel文件的JavaScript库。它可以让你使用JavaScript创建、读取和修改Excel文件。 以下是ExcelJS的一些主要特点&#xff1a; 支持xlsx、xlsm、xlsb、xls格式的Excel文件。可以创建和修改工作表、单元格、行和列。可以设置单元格样式、字…...

轻量级的Python IDE —— Thonny

现在的开发工具太多了&#xff0c;而且每个开发工具都致力于做成最好用最智能的工具&#xff0c;所以功能越堆越多&#xff0c;越怼越智能。安装这些开发工具比较烧脑&#xff0c;经常需要经过许多配置步骤。作为一个 Python 开发者来说&#xff0c;好多人光是这些配置都要弄半…...

java设计模式之观察者模式

. 基本概念 观察者&#xff08;Observer&#xff09;模式中包含两种对象&#xff0c;分别是目标对象和观察者对象。在目标对象和观察者对象间存在着一种一对多的对应关系&#xff0c;当这个目标对象的状态发生变化时&#xff0c;所有依赖于它的观察者对象都会得到通知并执行它…...

掌动智能分享:性能压力测试的重要性与优势

在当今数字化时代&#xff0c;应用程序的性能对于用户体验和业务成功至关重要。为了保证应用程序的高性能和稳定性&#xff0c;性能压力测试成为了不可或缺的环节。在这个领域&#xff0c;掌动智能作为一家专业的性能压力测试公司&#xff0c;正以其卓越的技术与服务&#xff0…...

C# ppt文件转换为pdf文件

使用第三方插件 Office 实现转换 1.Application方式转换 /// <summary>/// Microsoft.Office.Interop.PowerPoint/// 使用第三方软件 office/// </summary>/// <param name"pptPath">需要转换的ppt文件路径</param>/// <param name"…...

使用Pyarmor保护Python脚本不被反向工程

Python可读性强&#xff0c;使用广泛。虽然这种可读性有利于协作&#xff0c;但也增加了未授权访问和滥用的风险。如果未采取适当的保护&#xff0c;竞争对手或恶意攻击者可以复制您的算法和专有逻辑&#xff0c;这将对您软件的完整性和用户的信任产生负面影响。 实施可靠的安…...

STM32单片机——串口通信(轮询+中断)

STM32单片机——串口通信&#xff08;轮询中断&#xff09; 串口通信相关概念HAL库解析及CubeMX工程配置与程序设计常用函数介绍CubeMX工程配置HAL库程序设计&#xff08;轮询中断&#xff09;轮询数据收发中断收发数据 固件库程序设计及实现固件库配置流程结构体配置及初始化程…...

Python if语句的嵌套应用

视频版教程 Python3零基础7天入门实战视频教程 有时候业务上有多维度复杂条件判断&#xff0c;我们需要用到if语句的嵌套来实现。 举例&#xff1a;我们在一些游戏网站活动充值的时候&#xff0c;冲100送 20 冲200送50 但是vip用户的话&#xff0c;冲100送 30 冲200送70 代码…...

C++中带默认值的函数参数

C中带默认值的函数参数 如果一直将 Pi 声明为常量&#xff0c;没有给用户提供修改它的机会。然而&#xff0c;用户可能希望其精度更高或更低。如何编写一个函数&#xff0c;在用户没有提供的情况下&#xff0c;将 Pi 设置为默认值呢&#xff1f; 为解决这种问题&#xff0c;一…...

记录一次部署Hugo主题lotusdocs到Github Pages实践

引言 随着开源项目的越来越复杂&#xff0c;项目文档的重要性日渐突出。一个好的项目要有一个清晰明了的文档来帮助大家使用。最近一直有在找寻一个简洁明了的文档主题来放置项目的各种相关文档。最终找到这次的主角&#xff1a;Lotus Docs 基于Hugo的主题。Lotus Docs的样子&…...

stm32---基本定时器(TIM6,TIM7)

STM32F1的定时器非常多&#xff0c;由两个基本定时器&#xff08;TIM6&#xff0c;TIM7&#xff09;、4个通用定时器&#xff08;TIM2-TIM5&#xff09;和两个高级定时器&#xff08;TIM&#xff11;&#xff0c;TIM&#xff18;&#xff09;组成。基本定时器的功能最为简单&am…...

wordpress rocket/百度平台我的订单

盒子模型 把页面上的每一个元素当成一个盒子 由内容&#xff0c;内边距&#xff0c;边框&#xff0c;外边距组成 盒子模型举例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><…...

新疆做网站哪家好/海外市场推广做什么的

我有一个Thread-extends类,它应该一次只运行一个实例(跨进程).为了实现这一点,我正在尝试使用文件锁.以下是我的代码&#xff1a;class Scanner(Thread):def __init__(self, path):Thread.__init__(self)self.lock_file open(os.path.join(config.BASEDIR, "scanner.lock…...

怎么看个人做的付费视频网站/深圳seo云哥

目录 正则表达式语法规则 字符 预定义字符集 数量词 贪婪和非贪婪 边界匹配&#xff08;不消耗匹配字符串中的字符) 逻辑、分组 Python re模块介绍 引入模块 正则检索 正则分割字符串 字符串替换 分组引用 匹配中文 正则表达式语法规则 百度百科简介&#xff1a…...

美团推广联盟/seo深圳培训班

leetcode 30题目大意算法思想hashtable的理解双指针的理解some tricks一个for循环我们可以写了呀hashtable的应用写写代码吧题目 you are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s …...

网站页面设计模板代码/软文兼职

推荐最近很火的 6 个开源项目&#xff0c;本期所有推荐都已经收录到 Awesome GitHub Repo&#xff0c;欢迎各位读者 Star。欢迎 Star&#xff1a;https://github.com/Wechat-ggGitHub/Awesome-GitHub-Repo本期推荐的开源项目是&#xff1a;1. 中国 Web 开发者路线图2. 一个简单…...

做网站 先上线再调整/2021年最为成功的营销案例

可以将JAVA变量在JSP头部定义成全局变量。 然后可以分别在JS和JSP里调用。 因为可以将JS和JSP理解为两个相互独立的块。这2个块里面的变量都是局部变量。 而局部变量是不共享的。 所以没法取到。...