李翔-大数据技术

Big data technology!

第2章 Hadoop完全分布式集群

Hadoop完全分布式集群


一、hadoop基础知识

1.1 hadoop是什么?

    是指Apache软件基金会的一款开源软件,允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理

hadoop核心组件

  • HDFS(分布式文件存储系统):解决海量数据存储

  • YARN(集群资源管理和任务调度框架):解决资源、任务调度

  • MapReduce(分布式计算框架):解决海量数据计算


1.2 hadoop工作流程

  1. HDFS存储数据

  2. 客户端发起请求,提交作业

  3. YARN分配资源,创建MapReduce任务

  4. 任务结果再入HDFS

  5. 作业结果返回客户端



1.3  hadoop核心组件介绍

1.3.1 HDFS

HDFSHadoop DFS  Hadoop分布式文件系统

DFSDistributed FileSystem 分布式文件系统

HDFS架构及存储

  • HDFS 采用Master/Slave的架构来存储数据

  • 这种架构主要由四个部分组成,分别为HDFS ClientNameNodeDataNodeSecondary NameNode

  • 一个HDFS集群是由一个NameNode和一定数目的DataNode组成的。

  • NameNode是一个中心服务器,负责管理文件系统的名字空间 (Namespace )及客户端对文件的访问。

  • DataNode一般是一个节点运行一个DataNode进程,负责管理它所在节点上的存储。


img


HDFS的特点

  1. 在HDFS中,对于文件是进行切块保存,HDFS中的文件在物理上是分块存储 (Block),默认大小是128M

  2. HDFS中有2类主要的节点:NameNodeDataNode

  3. NameNode负责管理DataNode

  4. DataNode负责存储数据

  5. HDFS会对文件块进行自动的备份,每一个备份称之为复本(Replication),HDFS默认是3个复本

  6. 如果某一个DataNode宕机,那么在HDFS中默认将这个DataNode所存储的复本再进行一次备份,保证指定的复本数量,宕机的设备恢复后不会删除多余副本。

  7. Secondary NameNode每隔一段时间对NameNode元数据备份


NameNode中元数据存储问题及工作机制

Namenode是HDFS集群主节点,管理文件系统的元数据,其工作机制包括内存元数据、磁盘镜像文件(FsImage)、操作日志文件(Edits)三部分。

内存元数据:

  • 存储在Namenode节点的内存中,包含完整的文件系统元数据。

  • 提供高效的随机访问,响应客户端请求。

FsImage文件:

  • 存储在Namenode节点的磁盘中,是文件系统的镜像文件,记录了文件系统的静态快照。

  • 在Namenode启动时生成,用于防止内存中元数据的断电丢失。

Edits文件:

  • 存储在Namenode节点的磁盘中,是元数据的操作日志文件,记录了元数据的更新操作。

  • 当元数据更新或添加时,将操作记录追加到Edits中。

内存元数据和持久化存储的关系:

  • 内存元数据与FsImage文件和Edits文件的关系为:FsImage + Edits = 内存元数据

  • 内存中的元数据提供高效读写,而FsImage和Edits用于持久化和防止断电丢失。

SecondaryNamenode的作用:

  • 用于定期合并FsImage和Edits,防止Edits文件过大影响效率。

  • 合并后的结果作为新的FsImage文件,保持文件系统的一致性。

触发合并的条件:

  • 定时触发:根据设定的时间间隔进行合并操作。

  • Edits文件满:当Edits中的操作记录达到一定数量时,触发合并。

整体工作流程

  • Namenode开机时加载FsImage和Edits到内存,处理客户端请求;

  • 定期由SecondaryNamenode合并FsImage和Edits,保持文件系统的稳定性和一致性。


HDFS的写数据流程

image-20220927083127624

  1. 客户端通过 DistributedFileSystem 模块向 NameNode 请求上传文件, NameNode 检查目标文件是否已存在,父目录是否存在。

  2. NameNode 返回是否可以上传。

  3. 客户端请求第一个 Block(包含0-128M的数据) ,询问NameNode可以上传到哪几个 DataNode 服务器上。

  4. NameNode 响应客户端请求,返回 3 个 DataNode 节点, 分别为 dn1、 dn2、 dn3。表现这些节点是可以存储。

  5. 客户端通过 FSDataOutputStream 模块请求 dn1 上传数据, dn1 收到请求会继续调用dn2,然后 dn2 调用 dn3,将这个通信管道建立完成。

  6. dn1、 dn2、 dn3 逐级应答客户端。

  7. 客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 Packet 为单位, dn1 收到一个 Packet 就会传给 dn2, dn2 传给 dn3; dn1 每传一个 packet会放入一个应答队列等待应答。这里要注意,是向其中一个节点写数据,然后由此节点把数据转发到其他节点。

  8. 当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复执行 3-7 步)。


HDFS的读数据流程

image-20220927083450102

  1. 客户端通过 DistributedFileSystem 向 NameNode 请求下载文件, NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。

  2. 挑选一台 DataNode(就近原则)服务器,请求读取数据。

  3. DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。

  4. 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。


Client:客户端【Hadoop命令行工具的用户、Hadoop Java API的应用程序】。

  1. 文件切分:文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block(128M),然后进行存储。

  2. NameNode 交互,获取文件的位置信息。

  3. DataNode 交互,读取或者写入数据。

  4. Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。

  5. Client 可以通过一些命令来访问 HDFS。


NameNode:就是 master,它是一个主管、管理者。

  1. NameNode是用于管理DataNode

  2. NameNode本身会记录元数据,管理数据块(Block)映射信息

  3. 配置副本策略

  4. 处理客户端读写请求


DataNode:就是SlaveNameNode 下达命令,DataNode 执行实际的操作。

  1. 存储实际的数据块。

  2. 执行数据块的读/写操作

    1. `DataNode`用于存储数据,数据是以`Block`形式存储
    2. `DataNode`通过心跳机制(每隔固定时间)来向`NameNode`发送心跳信号
      心跳信号包含:
        a. 当前节点的状态
        b. 当前`DataNode`存储的数据
    3. `DataNode`每隔3s向`NameNode`发送一次心跳
    4. 如果`NameNode`超过10min没有收到`DataNode`的心跳,那么`NameNode`认为这个`DataNode`已经lost(丢失)
    5. 当`NameNode`认为`DataNode`已经lost的时候,`NameNode`要将这个`DataNode`上的`Block`备份到其他的节点上


Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

  1. 帮助namenode做元数据备份,帮助namenode进行恢复

  2. 辅助 NameNode,分担其工作量,定期合并 fsimagefsedits,并推送给NameNode

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

    • fsimage 镜像文件:包含了整个HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息(id、类型、目录、所属用户、用户权限、时间戳……)。

    • 每次Namenode启动的时候都会将fsimage文件读入内存,保证内存中的元数据信息是最新的、同步的,可以看成Namenode启动的时候就将fsimage和edits文件进行了合并。

  3. 在紧急情况下,可辅助恢复 NameNode


Block

  1. HDFS中,会对文件进行切块,每一个块实际上就是一个Block

  2. BlockHDFS中存储的基本单位

  3. Block在Hadoop1.0中的大小是64M,在Hadoop2.0中的大小是128M

  4. 如果一个文件或者数据的大小不满足Block的大小,那么这个文件或者数据是多大那么对应的Block就是多大

  5. 切块的意义: a. 便于存储超大文件 b. 便于进行快速的备份

  6. HDFS对每一个Block分配一个递增的编号


元数据:

元数据包含:

  1. 文件的存储路径: 元数据中会记录文件在分布式文件系统中的存储路径,例如 /a.log/test/b.txt

  2. 复本数量: 元数据中会存储有关文件的复本数量信息,即在系统中存储该文件的副本的数量。

  3. 文件所对应的文件块 Block 大文件在 Hadoop 分布式文件系统(HDFS)中会被切分成一个个固定大小的数据块(Block)。元数据中会包含有关文件切分后的各个数据块的信息,以便在系统中定位和管理这些数据块。

  4. 每一个 Block 的存储节点: 元数据中会记录每个数据块所存储的实际节点信息,即在集群中的哪些节点上存储了该数据块的副本。

HDFS元数据管理总结:

  1. 元数据大小: 每一条元数据一般在150B左右。

  2. 写请求与元数据: 只有写请求会产生元数据,读请求不会产生元数据。

  3. 元数据存储位置: 元数据存储在 NameNode 中,同时在内存和磁盘中保存。

  4. 内存中的元数据: 元数据存储在内存中是为了实现快速查询。

  5. 磁盘中的元数据: 元数据同时存储在磁盘上,以便进行崩溃恢复。

  6. 磁盘存储路径: 元数据存储在磁盘上的位置由 core-site.xml 中的属性 hadoop.tmp.dir 决定,在指定的目录的子目录 dfs/name/current 下。

  7. 元数据存储的文件:

    • edits:记录 NameNode 接收的每一次写请求(上传、删除、追加)。

    • fsimage:记录元数据,但这个文件中的元数据不是实时的。

  8. 写请求处理流程:NameNode 接收到新的写请求时,会先将该请求写入 edits 文件,待 edits 文件写成功后,再更新内存中的元数据。更新完成后,向客户端返回成功信号。


多副本放置策略

  1. 第一个复本:如果是从集群内部上传,哪个节点上传第一个复本就放在哪个节点上;如果是从集群外部上传,那么NameNode会选择一个相对比较空闲的DataNode存储第一个复本

  2. 第二个复本:放在和第一个复本不同机架的节点上

  3. 第三个复本:放在和第二个复本不同机架的节点上

  4. 更多复本:选择相对空闲的节点来放置


1.3.2 MapReduce

MapReduce定义

  • MapReduce作为大数据生态圈第一代分布式计算引擎

  • MapReduce是采用一种分而治之的思想设计出来的分布式计算框架

  • 如一项复杂的计算任务,单台服务器无法胜任时,可将此大任务切分成一个个小的任务,分别交给不同的服务器上并行执行,最终再汇总每个小任务的结果

  • MapReduce的分布式计算框架分为两个阶段:

    第一个Map【映射】阶段     (Map负责“分”:把一个任务切分成多个任务)

    第二个Reduce【规约】阶段(reduce负责“合”:汇总分解后多任务的结果)


image-20220918123042914

MapReduce并行计算

  • HDFS存储数据时对大于128M的数据会进行数据切分,每128M一个数据块,数据块会分散、分布存储到HDFS。

  • MapReduce在进行计算前会复制计算程序,每个数据块会分配一个独立的计算程序副本(MapTack)。计算时多个数据块几乎同时被读取并计算,但是计算程序完全相同。最终将各个计算程序计算的结果进行汇总(Reduce来汇总)

image-20220920085956446


MapReduce流程

WordCount案例运行和详解

img


MapReduce优缺点

优点

  • MapReduce易于编程:他简单的实现一些接口,就可以完成一个分布式程序

  • 良好的扩展性:可以通过简单的增加机器来扩展它的计算能力

  • 高容错性:假设集群中一台集群挂了,他可以把上面的计算任务转移到另一个节点上运行,而不至于这个任务失败。

  • 适合PB级以上海量数据的离线处理:集群中的服务器并发工作,数据处理能力强。

缺点

  • 不擅长实时计算:无法像一些OLTP数据库一样,在毫秒或者秒级内返回结果。

  • 不擅长流式计算:流式计算的输入数据是动态的,而MapReduce的输入集数据是静态的,不能动态变化。


1.3.3 Yarn

Apache Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统的一个关键组件,它用于集群资源的管理和作业调度。YARN包括以下主要组件和功能:

  1. ResourceManager(资源管理器):ResourceManager是YARN的核心组件之一,负责集群资源的管理和分配。它监控可用的计算资源,并为提交的应用程序分配资源,以确保资源的合理分配和管理。

  2. NodeManager(节点管理器):NodeManager运行在每个集群节点上,负责管理节点的资源和容器的生命周期。它会向ResourceManager报告节点上的资源可用性,并监控运行在节点上的容器(应用程序的一部分)。

YARN是一个用于资源管理和作业调度的分布式框架,它允许多个应用程序在Hadoop集群上共享资源,并提供了高度灵活的资源管理和调度机制,使大规模数据处理更加高效和可扩展。

通俗的解释:

ResourceManager 就像一个大管家,他负责整个集群的资源管理。他知道集群中哪些计算节点有多少可用的CPU、内存等资源,然后他会根据应用程序的需求,分配这些资源。ResourceManager还负责协调应用程序之间的争夺资源,以确保资源分配的合理和公平。

NodeManager 就像集群中每个计算节点的看门人,他们分别工作在每个计算节点上。NodeManager负责监视计算节点上的资源使用情况,并向ResourceManager报告这些信息。


1.4 hadoop优点

  • 高可靠性

Hadoop 维护存储多个数据副本,增加数据冗余,避免数据丢失,并且在任务失败后能自动地重新部署计算任务

  • 高扩展性

Hadoop 集群可以方便地扩展更多的集群节点

  • 高效性

Hadoop 能够在集群节点之间动态地移动数据,并保证各个节点数据的动态平衡,以并行的方式工作,处理速度非常快

  • 高容错性

Hadoop 维护存储多个数据副本,并且能够自动将失败的任务重新分配

  • 低成本

Hadoop 是开源框架,Hadoop集群允许通过部署普通廉价的集群组成集群来处理大数据。

Hadoop 使用 Java 语言编写,可以跨平台运行


1.5 Hadoop 生态圈

Hadoop 生态圈是指围绕 Hadoop 软件框架为核心而出现的越来越多的相关软件框架,这些软件框架和 Hadoop 框架一起构成了一个生机勃勃的 Hadoop 生态圈。

image-20220918123108516


Hadoop 生态圈的架构

  1. Hadoop Common: 是 Hadoop 生态系统中的基础设施,提供了各个模块通用的工具和库。

  2. HDFS(Hadoop 分布式文件系统): Hadoop 的基石,用于存储和管理大规模数据的分布式文件系统。

  3. YARN: 统一资源管理和调度平台,负责集群中的资源分配和任务调度。

  4. MapReduce: 分布式计算的编程模型,适用于大规模数据的批处理操作。

  5. Spark: 开源的大数据内存计算框架,支持基于Hadoop上存储的大数据进行计算。

  6. Flink: 开源的大数据内存计算框架,主要用于实时计算场景。

  7. HBase: 分布式、面向列族的数据库,建立在Hadoop HDFS之上,用于存储非结构化数据。

  8. Hive: 基于Hadoop的数据仓库工具,提供类SQL语法查询功能,可以将结构化的数据文件映射为数据库表。

  9. Pig: 用于大型数据集分析和评估的工具,类似于Hive。

  10. Impala: 交互式SQL查询工具,类似于Hive,可对存储在HDFS、HBase中的数据执行查询。

  11. Mahout: 机器学习和数据挖掘库,实现经典的机器学习算法。

  12. Flume: 高可用、高可靠的分布式日志采集框架。

  13. Sqoop: 开源工具,用于Hadoop、Hive与传统数据库之间的数据传递,支持数据导入导出。

  14. Kafka: 高吞吐量的分布式发布/订阅消息系统。

  15. ZooKeeper: 针对大型分布式系统的可靠协调系统,提供配置维护、名字服务、分布式同步、组服务等功能。


离线大数据处理系统

image-20220918123128640


二、Hadoop 的运行模式

2.1 单机模式

  • 默认情况下,Hadoop即处于该模式,用于开发和调式。

  • 不对配置文件进行修改。

  • 使用本地文件系统,而不是分布式文件系统。

  • Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行的。

  • 用于对MapReduce程序的逻辑进行调试,确保程序的正确。

守护进程(daemon):

是一类在后台运行的特殊进程,用于执行特定的系统任务。

很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

Map()和Reduce()任务

hadoop的分布式计算框架分为两个阶段,第一个是map阶段,第二个是reduce阶段。map阶段负责对输入文件进行切分处理,然后汇总再分组给reduce进行处理,以达到高效的分布式计算效率


2.2 伪分布模式

  • 在一台主机模拟多主机。

  • Hadoop的守护进程运行在本机机器,模拟一个小规模的集群。

  • Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在同一台机器上运行,是相互独立的Java进程。

  • 在这种模式下,Hadoop使用的是分布式文件系统,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试Hadoop程序的执行是否正确。

  • 修改4个配置文件:

    core-site.xml(配置Hadoop集群的特性:例如HDFS、MapReduce和YARN常用的I/O设置等)

    hdfs-site.xml(配置HDFS集群的工作属性:Hadoop守护(守护是后台的意思)进程的配置项,包括namenode、辅助namenode(即SecondNameNode)和datanode等)

    mapred-site.xml( 配置MapReduce集群的属性:MapReduce守护进程的配置项,包括作业历史服务器 )

    yarn-site.xml ( 配置Yarn集群的属性:YARN守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器 )

  • 格式化文件系统


2.3 完全分布式模式

  • Hadoop的守护进程运行在由多台主机搭建的集群上,是真正的生产环境

  • 所有的主机上安装JDK和Hadoop,组成相互连通的网络。

  • 在主机间设置SSH(secure shell)免密码登录,把各从节点生成的公钥添加到主节点的信任列表。

  • 修改3个配置文件:

    core-site.xml(配置Hadoop集群的特性:例如HDFS、MapReduce和YARN常用的I/O设置等)

    hdfs-site.xml(配置HDFS集群的工作属性:Hadoop守护(守护是后台的意思)进程的配置项,包括namenode、辅助namenode(即SecondNameNode)和datanode等)

    mapred-site.xml( 配置MapReduce集群的属性:MapReduce守护进程的配置项,包括作业历史服务器 )

    yarn-site.xml ( 配置Yarn集群的属性:YARN守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器 )

  • 指定NameNode和JobTraker的位置和端口,设置文件的副本等参数。

  • 格式化文件系统


关于几个名词的大体意思

1.集群

集群(Cluster)是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,在单一系统的管理下,共同协作完成同一个任务。

集群中每一个计算机叫作节点,每个节点都实现相同的业务,但是每个节点并不是缺一不可的。其主要作用是缓解并发压力和进行单点故障转移。

集群一般被分为三种类型:高可用集群、负载均衡集群和高性能运算集群。


2. 分布式系统

分布式系统是将不同功能或不同地点、拥有不同数据的多台计算机通过网络连接起来,由控制系统统一管理,完成大规模信息处理的计算机系统。

在分布式文件系统中,一种业务拆分成多个子业务,部署在多台计算机节点上,对外提供服务。其主要作用是大幅度地提高效率,缓解服务器的访问和存储压力。

常见的分布式系统有分布式文件系统、分布式数据库和分布式计算系统。

image-20220920090755233


3. 负载均衡

负载均衡(Load Balance)是指将负载(工作任务)进行平衡,分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其他主要任务服务器等,从而协同完成工作任务。

负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法用于扩展服务器和网络设备的带宽,加强网络数据处理能力,增加吞吐量,提高网络的可用性和灵活性。负载均衡中每个节点分配到的任务基本均衡。

4. 守护进程

就是一个在后台中执行的程序,通常负责系统上的某个服务,让系统接受来自用户或者是网络客户的要求。


三、完全分布式的安装

1. 前期准备

准备工作:

  • 前期安装好一台CentOS7虚拟机master;

  • 关闭防火墙

  • 配置了静态IP

  • 连接Finalshell

软件准备:

  • Hadoop 3.1.3

  • jdk-8u271-linux-x64.tar.gz


2. 克隆两台主机

master先关机

init 0

2.1 master克隆两台机器slave1,slave2

2.2 分别更改两台克隆机的静态IP

分别登录两台克隆机
切换用户:root
口   令:123456

vi /etc/sysconfig/network-scripts/ifcfg-ens33
------------------------------------------------
# 在slave1,slave2上操作,分别更改如下信息:
IPADDR=192.168.36.101       # 修改slave1
IPADDR=192.168.36.102       # 修改slave2

2.3 分别更改两台克隆机的主机名

vim /etc/hostname
# 在slave1,slave2上操作,分别更改如下信息:
slave1
slave2

2.4 重启两台克隆机

2.5 slave1与slave2分别连接Finalshell


3. 在master上安装jdk和hadoop:

说明:在 /opt下创建两目录:apps放置解压文件,software放置压缩文件。

3.1 创建两个文件夹

cd /opt/
mkdir apps
mkdir software

3.2 复制、解压

jdk-8u271-linux-x64.tar.gzhadoop-3.1.3.tar.gz

cd /opt/software
tar zxvf jdk-8u271-linux-x64.tar.gz -C /opt/apps/    # 大写C ,指定解压路径
tar zxvf hadoop-3.1.3.tar.gz -C /opt/apps/

3.3 更改文件名

cd /opt/apps/
mv jdk1.8.0_271/ jdk
mv hadoop-3.1.3/ hadoop


3.4 设置环境变量

目的:可以在任何的路径运行hadoop与jdk

vi /etc/profile

# 添加配置
export JAVA_HOME=/opt/apps/jdk
export HADOOP_HOME=/opt/apps/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

配置生效:

source /etc/profile


3.5 查看版本

# 1.查看本机的PATH路径 
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/apps/jdk/bin:/opt/apps/hadoop/bin:/opt/apps/hadoop/sbin

# 2.查看java与hadoop的版本
java -version
hadoop version


3.6 配置域名映射:

# 分别在三台机器进行更改
vi /etc/hosts
# 三台机器分别添加如下信息
192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2

注:三台主机可以互PING


3.7 分发slave1和slave2主机:

把master下的目录/opt/apps/jdk//opt/apps/hadoop/`复制给其他两个节点

scp -r /opt/apps/ root@slave1:/opt/apps/
scp -r /opt/apps/ root@slave2:/opt/apps/

# 复制过程需要确认和输入密码
# Are you sure you want to continue connecting (yes/no)?   yes
# root@slave1's password:  123456

把master下的文件/etc/profile复制给其他节点

scp -r /etc/profile root@slave1:/etc/
scp -r /etc/profile root@slave2:/etc/

每个节点让环境变量生效:

# 在slave1和slave2上分别运行
source /etc/profile

# echo $PATH  查看生效后的环境变量
# 查看JDk与Hadoop的版本


3.8 三台机器免密互访

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
# 私钥 就像是保险箱的钥匙,你要绝对保密,不与任何人分享。
# 公钥 就像是保险箱的锁,你可以随意分享给其他人,他们可以用它“锁住”消息,但只有你拥有匹配的私钥才能“解锁”这些消息。
## 私钥是拥有者的身份验证工具,而公钥用于加密数据,只有私钥持有者才能解密。


# 第一种方法【建议使用此方法】
首先在三台机器上分别生成ssh公钥和私钥:  ssh-keygen -t rsa
分别将各自公钥发送到所有机器(包括自己):ssh-copy-id 目标IP
解释:此操作将你的公钥(通常是 ~/.ssh/id_rsa.pub)复制到目标机器的 ~/.ssh/authorized_keys 文件中,从而允许你使用私钥在目标机器上进行SSH登录。     `authorized  /ˈɔːθəraɪzd/ 授权`

# 具体操作:
# 1.在master首先生成ssh公钥和私钥:
ssh-keygen -t rsa     # 执行会有提示,三次都按回车
# 2.发送公钥到所有机器(包括自己):
ssh-copy-id master  # 在此过程输入yes 和 密码123456
ssh-copy-id slave1
ssh-copy-id slave2
# 3.然后在slave1\slave2主机上都执行相同的操作。

---------------------------------------------------------------------------------------
# 第二种方法
# 1.依次登录三台机器,使用rsa加密技术,利用ssh-keygen(注册机)生成本机的公钥与私钥
ssh-keygen -t rsa       # 执行会有提示,三次都按回车

# 2.依次登录三台机器,执行以下命令,将本机的都公钥拷贝到master服务器的authorized_keys文件中
 ## 命令:ssh-copy-id 实现将本机的公钥复制到远程机器master的authorized_keys文件中
 ## 目的:实现三台机器的公钥都复制到了master的authorized_keys文件中
ssh-copy-id master  # 三台机器依次执行复制!(复制的过程中需要验证密码)

# 3.在master的服务器,执行以下命令将authorized_keys拷贝到slave1与slave2
[root@master ~]#  cd ~/.ssh                      -- 隐藏目录,命令ll -a查看
[root@master .ssh]#  scp authorized_keys slave1:$PWD  
[root@master .ssh]#  scp authorized_keys slave2:$PWD
## 解读$PWD:拷贝到远程机器的路径与当前机器路径一致

authorized  /ˈɔːθəraɪzd/ 授权


3.9 验证免密

# 可以在三台机器上到访免密
ssh master
ssh slave1
ssh slave2


4.Hadoop集群节点配置

分布式集群部署规划

(1)NameNodeSecondary NameNode不要安装在同一台服务器。 (2)ResourceManager也很消耗内存,不要和 NameNodeSecondaryNameNode配置在同一台机器上。

image-20221010152421381

NameNode 元数据的管理

DataNode 数据存储管理

Secondary NameNode元数据的备份

ResourceManager集群的资源管理分配、作业管理

NodeManager节点的资源管理


修改master主机修改Hadoop如下配置文件,这些配置文件都位于/opt/apps/hadoop/etc/hadoop目录下。

配置文件功能描述
workers配置从节点文件
core-site.xmlHadoop核心全局配置文件,可在其他配置文件中引用
hdfs-site.xmlHDFS配置文件,继承core-site.xml配置文件
mapred-site.xmlMapReduce配置文件,继承core-site.xml配置文件
yarn-site.xmlYarn配置文件
hadoop-env.sh配置Hadoop运行所需的环境变量
yarn-env.sh

site表示的是用户定义的配置,会覆盖default中的默认配置。


4.1 配置workers

workers文件里面记录的是集群里所有DataNode的主机名

把集群中所有数据节点DataNode的主机名写入该文件,每行一个。【原文件默认为 localhost(即把本机既作为名称节点也作为数据节点,在伪分布式配置时,就采用了这种默认的配置)】

如果让master节点同时充当名称节点(NameNode)数据节点(DataNode):

# 三台机器都要进行更改
vi /opt/apps/hadoop/etc/hadoop/workers
# 修改如下
master
slave1
slave2


4.2 配置core-site.xml

vi /opt/apps/hadoop/etc/hadoop/core-site.xml

修改如下:

<configuration>
   <!-- 确定hadoop运行时产生文件的存储路径 -->
   <property>
      <name>hadoop.tmp.dir</name>
      <value>/opt/apps/hadoop/tmp</value>
   </property>
   <!-- 指定HDFS文件系统中(namenode)的URI地址 -->
   <property>
  <name>fs.defaultFS</name>
  <value>hdfs://master:9000</value>
   </property>
</configuration>

解释 :

hadoop.tmp.dir :是hadoop文件系统依赖的基础配置,比如NameNode数据默认都存放这个配置的目录

它的默认位置是在 /tmp/{$user}下面,注意这是个临时目录!!!LINUX 系统,在服务重启后,/tmp 下的目录被清空因此,所有如果选择默认,一旦因为断电等外在因素影响,/tmp/{$user}下的所有东西都会丢失,故更改它为持久化配置很重要!

<value> /opt/apps/hadoop/tmp </value> 这里定义的路径注意修改为你自己的路径!!!

fs.defaultFS: 代表配置NameNode节点地址URI(包括协议、主机名称、端口号)

  • 集群里面的每一台机器都需要知道NameNode的地址。DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。

  • 独立的客户端程序通过这个URI跟DataNode交互,以取得文件的块列表。

  • hdfs://master:9000/表示HDFS文件系统中根目录,如果使用的是HDFS文件系统, 可简写为/

  • Master节点的9000端口是NameNode的RPC服务地址

    HDFS上的文件是使用URI来定位的,前缀都是hdfs://localhost:9000,你可以把这个前缀赋给属性fs.default.name(属性可以在配置文件中指定,也可以在代码中指定),这样你就不用每次都写这个前缀了,比如以下2个命令是等价的:

    $ hdfs dfs -ls /

    $ hdfs dfs -ls hdfs://master:9000/


4.3 配置hdfs-site.xml

vi /opt/apps/hadoop/etc/hadoop/hdfs-site.xml

修改如下:

<configuration>
       <!-- secondarynamenode web端访问地址,同时也定义了2NN在slave2上 -->
       <property>
               <name>dfs.namenode.secondary.http-address</name>
               <value>slave2:9868</value>
       </property>

       <!-- 指定hdfs的副本数设置,默认为3,应小于或等于datanode的数量 -->
       <property>
               <name>dfs.replication</name>
               <value>3</value>
       </property>

       <!-- 指定namenode数据的存放目录路径和元数据存放位置 -->
       <property>
               <name>dfs.namenode.name.dir</name>
               <value>/opt/apps/hadoop/tmp/dfs/name</value>
       </property>

       <!-- 指定datanode数据的存放目录路径 -->
       <property>
               <name>dfs.datanode.data.dir</name>
               <value>/opt/apps/hadoop/tmp/dfs/data</value>
       </property>

       <!-- 指定了HDFS-http访问的地址与端口  -->
       <property>
               <name>dfs.http.address</name>
               <value>0.0.0.0:9870</value>
       </property>
       <!-- HDFS关闭权限检查功能,任何用户都可以访问HDFS中的任何文件或目录   -->
       <!-- HDFS会建议禁用root用户访问,不加下面的配置会报错   -->
       <property>
    <name>dfs.permissions</name>
    <value>false</value>
   </property>
</configuration>

解释:

dfs.replicationhdfs的副本数设置,默认为3,对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存3份副本。(这个数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的可靠性(系统故障时,也许会造成数据丢失)。

dfs.namenode.name.dir :namenode数据的存放位置,元数据存放位置

dfs.datanode.data.dir:datanode数据的存放位置,block块存放的位置

dfs.repliction:hdfs的副本数设置,默认为3

dfs.secondary.http.address:secondarynamenode对NameNode的备份,防止挂掉,应该和namenode存放在不同节点(slave1节点)


4.4 配置mapred-site.xml

该文件用于指定MapReduce使用的框架。

# 修改配置文件
vi  /opt/apps/hadoop/etc/hadoop/mapred-site.xml

修改如下:

<configuration>
   <!--指定MapReduce程序运行在YARN上【默认值local】-->
   <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
   </property>
   <!--设置jobhistory server服务器地址及对应端口,即指定JobHistory日志的存放位置 -->
   <property>
       <name>mapreduce.jobhistory.address</name>
       <value>master:10020</value>
   </property>
   <!--指定MR程序历史任务的外部监听页面-->
   <!--查看历史服务器已经运行完的Mapreduce作业记录的web地址,需要启动该服务才行-->
   <property>
       <name>mapreduce.jobhistory.webapp.address</name>
       <value>master:19888</value>
   </property>
   <!--确保在执行 MapReduce 作业时,AM、Map 和 Reduce 任务都能够找到所需的 Hadoop 类和资源-->
   <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>
</configuration>

配置解释:

mapreduce.framework.name:指定mapreduce程序运行框架为yarn方式

JobHistoryjobhistory用于查询每个job运行完以后的历史日志信息,是作为一台单独的服务器运行的。可以在namenode或者datanode上的任意一台启动即可,用来记录已经finished(结束)的mapreduce运行日志,日志信息存放于HDFS目录中,默认情况下没有开启此功能,需要在mapred-site.xml中配置并手动启动,本例是将JobHistory服务器配置在master中。

mapreduce.jobhistory.address:指定历史服务器的地址和端口

mapreduce.jobhistory.webapp.address:查看历史服务器已经运行完的Mapreduce作业记录的web地址,需要启动该服务才行

<!--知识点补充:-->
可以配置日志的存放路径:
<!--正在运行中的日志在HDFS上的存放路径-->
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/hadoop/history/done_intermediate</value>
</property>
<!--运行过的日志存放在HDFS上的存放路径-->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/hadoop/history/done</value>
</property>


4.5 配置yarn-site.xml

vi /opt/apps/hadoop/etc/hadoop/yarn-site.xml

修改如下:

<configuration>   
   <!-- 配置yarn的shuffle服务 -->
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
   </property>
   <!-- 配置YARN的ResourceManager的主机 -->
   <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>slave1</value>
   </property>
</configuration>

解释:

yamn nodemanager.aux-services 解释: NodeManager上运行的附属服务。需配置成mapreduce_ shuffle, 才可运行MapReduce 程序;这个属性用于指定在进行mapreduce作业时,yarn使用mapreduce_shuffle混洗技术

MapReduce中,shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理


4.6 配置hadoop-env.sh

指定运行各个 Hadoop 服务的特定用户身份,这样的配置对于安全性、权限管理、以及环境的一致性和可预测性很重要。

默认情况下,这些脚本通常不会指定特定的用户来运行服务;它们会以当前登录用户的身份来启动相应的服务。

vi /opt/apps/hadoop/etc/hadoop/hadoop-env.sh

修改如下:

#指定你的jdk路径
export JAVA_HOME=/opt/apps/jdk
# export JAVA_HOME=${JAVA_HOME}   # 注释此句
# 配置hadoop用户为root
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

hadoop执行启动脚本时候会加载这个hadoop-env.sh; 如果这里面配置了$JAVA_HOME会覆盖/etc/profile里面的$JAVA_HOME 先启动NameNode,然后再通过ssh启动slaves(也就是DataNode、NodeManager这些) ssh过去的时候如果配在/etc/profile,每次都得source一下~ 所以,Hadoop放在hadoop-env.sh里面,这样的话ssh远程执行的时候也不用source /etc/profile了。


4.7 配置yarn-env.sh

vi /opt/apps/hadoop/etc/hadoop/yarn-env.sh

修改如下:

# 指定你的jdk路径
export JAVA_HOME=/opt/apps/jdk


4.8 分发hadoop到slave节点

[root@master ~]# scp -r /opt/apps/hadoop root@slave1:/opt/apps/
[root@master ~]# scp -r /opt/apps/hadoop root@slave2:/opt/apps/


5. 启动集群

5.1 格式化namenode

master节点上执行如下命令:

hdfs namenode -format

首次启动Hadoop集群时,需要先在master节点执行名称节点的格式化 只需要格式化这一次,后面再启动Hadoop时,不要再次格式化名称节点


5.2 启动HDFS

master节点上执行如下命令:

start-dfs.sh     # 启动HDFS

注释: 此时如果在master上启动start-yarn.sh ,则可能在slave1上看不到resourcemanager进程,查看resourcemanager进程启动日志/usr/local/hadoop/logs/yarn-hadoop-resourcemanager-slave1.log,发现slave1:8031无法连接,故resourcemanager守护进程需要到slave1上启动

或者:直接在slave1上运行start-yarn.sh(可以同时启动resourcemanagerDatamanager


5.3 启动yarn

slave1节点上执行如下命令:

start-yarn.sh

注意: 1.NameNodeResourceManger如果不是同一台机器,不能在NameNode上启动yarn,应该在配置的ResouceManager所在的机器上启动yarn 2.如果在启动过程中,slave1本机不能启动NodeManager,可能是ssh localhost第1次访问自己需要验证密码,可以先尝试ssh localhost登录下本机,退出本机后再重新启动yarn。(或者用方法二单线程启动)

方法二: 1.在master上start-yarn.sh启动各节点NodeManager单点启动: 2.在slave1单点启动resourcemanageryarn-daemon.sh start resourcemanager  daemon/diːmən/守护进程


5.4 启动日志服务器

master节点上执行如下命令:

mr-jobhistory-daemon.sh start historyserver
# 当由于在启动hdfs和Yarn进程之后,jobhistoryserver进程并没有启动,需要手动启动。
# 启动后可在web端查看Job历史任务运行情况。


5.5 查看启动的集群进程

`master`节点上可以看到`NameNode``DataNode``NodeManager``JobHistoryServer`进程
[root@master ~]# jps
3552 NodeManager
2613 NameNode
14231 Jps
2876 DataNode
14124 JobHistoryServer

`Slave1`节点可以看到`DataNode``ResourceManager``NodeManager`进程
[root@slave1 ~]# jps
3106 ResourceManager
2581 DataNode
3254 NodeManager
17054 Jps

`Slave2`节点可以看到`DataNode``NodeManager``SecondrryNameNode`进程
[root@slave2 ~]# jps
2755 SecondaryNameNode
3162 NodeManager
17690 Jps
2527 DataNode


5.6 Web访问

# Web访问hdfs
http://192.168.36.100:9870
http://master:9870

# Web访问yarn
http://192.168.36.101:8088
http://slave1:8088

如果不成功,查看下面的错误坑点。


6. 关闭Hadoop集群

stop-dfs.sh                                   # 在master上执行
stop-yarn.sh                                  # 在slave1上执行
mr-jobhistory-daemon.sh stop historyserver    # 在master上执行


7. 错误坑点

7.1 解决浏览器不能访问Hadoop的9870、8088等端口

问题:在虚拟机启动hadoop集群后,在window浏览器无法访问http://master:9870http://master:8088等集群监控界面。

排查:

# 首先在windows里ping一下是否能通:
ping master
# Ping请求找不到主机 master。请检查该名称,然后重试。

ping 192.168.36.100   # ping IP地址,这里master的IP地址为192.168.36.100
# 若IP地址能ping通,则试一下在浏览器中将master换成IP地址访问一下

#如果能利用IP访问,则是因为在虚拟机外部的本地主机下由于未在windows中的hosts标注master的ip地址,所以直接输入master是无法访问的

解决:可以在Windows里面C:\Windows\System32\drivers\etc路径用管理员权限之后,编辑hosts文件,加入虚拟机各节点的hostname和IP地址。

192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2


7.2 在HDFS的WEB UI上查看日志文件,不能显示文本内容

在HDFS的WEB UI上查看日志文件的文本内容,出现下面的问题:Browse Directory :Couldn't preview the file ,也不能下载,File contents显示[object Object]。

image-20231201132834041

造成原因

windows下的C:\Windows\System32\drivers\etc\hosts 与 linux下的etc/hosts下的hadoop映射地址不一致

解决方法

编辑 C:\Windows\System32\drivers\etc\hosts
添加下面内容
192.168.36.100 master
192.168.36.101 slave1
192.168.36.102 slave2




7.2 格式化失败或数据节点无法启动

方法:1.先关闭所有守护进程

          2.删除所有节点(包括两个Slave节点)上的临时文件夹,重新格式化,再次启动

cd /opt/apps/hadoop
rm -rf tmp      # 分别删除master\slave1\slave2(在core.site.xml中指定的hadoop数据存储目录 )
rm -rf logs/*   # 分别删除master\slave1\slave2日志文件
hdfs namenode -format             # 在master节点上格式化namenode
start-dfs.sh                      # 启动HDFS的进程


8. 执行分布式实例

8.1 全分布运行官方wordcount案例

注:Wordcount是MapReduce的入门示例程序,相当于我们在学某个编程语言时写的Hello World示例一样。这个程序可以统计某个文件中,各个单词出现的次数。Wordcount程序自带的jar包已经放置在hadoop安装目录下的 /share/hadoop/mapreduce 文件夹中。

1.在 /usr/local 文件夹下面创建hadoop文件夹,然后在hadoop文件夹下继续创建wcinput文件夹

mkdir -p /usr/local/hadoop/wcinput

2.在wcinput文件下创建一个wc.input文件,并输入以下内容

[root@master wcinput]# touch wc.input

# 输入以下内容
hello hadoop
hello mapreduce
hello yarn

3.要使用 HDFS,首先需要在 HDFS 中创建用户目录:

hdfs dfs -mkdir -p /user/root

# hdfs dfs :是与 Hadoop 分布式文件系统(HDFS)交互的命令

下面两种方法相看刚才创建的目录:

(1)使用命令的方式

# 列出 HDFS 根目录下的文件和目录。
hdfs dfs -ls /

# 列出 HDFS 根目录下的所有子目录和文件,包括子目录中的内容。【-R 递归】
hdfs dfs -ls -R /

image-20220606103253142


(2)WEB方法 (点击Utilities-Browse the file system

image-20220609152921448


/usr/local/hadoop/wcinput/wc.input 复制到HDFS分布式文件系统中的 /user/hadoop/input 中。

  • 注意:在Hadoop中,通常每个用户的目录位于HDFS根目录下的 /user 目录中。每个用户的目录都以其用户名作为子目录的名称,因此每个用户的路径通常是 /user/<用户名>。因为我们使用的是 root用户,并且已在HDFS中创建相应的用户目录 /user/root ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/root/input

4.在HDFS下新建input目录(默认在user/root下创建):

hdfs dfs -mkdir input

5.将本地的wc.input上传到HDFS的input目录下:

hdfs dfs -put /usr/local/hadoop/wcinput/wc.input input

6.查看文件是否上传成功:    

hdfs dfs -ls -R /

7.Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,

因此若要再次执行下面的程序,需要删除 output 文件夹:

hdfs dfs -rm -r output    # 删除 output 文件夹

8.回到/usr/local/hadoop 下,执行程序

[root@master hadoop]#  cd /usr/local/hadoop

[root@master hadoop]# hadoop jar /opt/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output

image-20220605125946388


9.查看运行结果:

hdfs dfs -cat output/*

image-20220606115708172


10.也可以在web网页中下载文件查看

image-20220609152756527

注意:如果运行失败,尝试把hdfs中的input与ouput文件夹都删除


【错误坑点】

hadoop执行mapreduce操作时报找不到或无法加载主类 rg.apache.hadoop.mapreduce.v2.app.MRAppMaster的解决办法

原因: 因为在 yarn 执行MapReduce的时找不到 hadoop 的classpath


解决方法一:

  • 确保在执行 MapReduce 作业时,AM、Map 和 Reduce 任务都能够找到所需的 Hadoop 类和资源,以便成功运行作业。

  • 编辑MapReduce配置文件: mapred-site.xml

在配置项的后面添加如下信息:

    <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>
  • 后三个属性如果不设置,在运行Hadoop自带示例的词频统计时,会报错:Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster


解决方法二:

# 1.在master主机上运行hadoop classpath命令,复制以下返回的结果
/opt/apps/hadoop/etc/hadoop:/opt/apps/hadoop/share/hadoop/common/lib/*:/opt/apps/hadoop/share/hadoop/common/*:/opt/apps/hadoop/share/hadoop/hdfs:/opt/apps/hadoop/share/hadoop/hdfs/lib/*:/opt/apps/hadoop/share/hadoop/hdfs/*:/opt/apps/hadoop/share/hadoop/mapreduce/lib/*:/opt/apps/hadoop/share/hadoop/mapreduce/*:/opt/apps/hadoop/share/hadoop/yarn:/opt/apps/hadoop/share/hadoop/yarn/lib/*:/opt/apps/hadoop/share/hadoop/yarn/*

# 2.修改yarn-siet.xml文件,该文件在hadoop的安装目录/etc/hadoop 下

# 3.在yarn-siet.xml文件的configuration中添加以下配置
<property>
<name>yarn.application.classpath</name>
<value>
 // 粘贴第1步运行hadoop classpath后返回的信息
</value>
</property>

# 即
<property>
<name>yarn.application.classpath</name>
<value>
/opt/apps/hadoop/etc/hadoop:/opt/apps/hadoop/share/hadoop/common/lib/*:/opt/apps/hadoop/share/hadoop/common/*:/opt/apps/hadoop/share/hadoop/hdfs:/opt/apps/hadoop/share/hadoop/hdfs/lib/*:/opt/apps/hadoop/share/hadoop/hdfs/*:/opt/apps/hadoop/share/hadoop/mapreduce/lib/*:/opt/apps/hadoop/share/hadoop/mapreduce/*:/opt/apps/hadoop/share/hadoop/yarn:/opt/apps/hadoop/share/hadoop/yarn/lib/*:/opt/apps/hadoop/share/hadoop/yarn/*
</value>
</property>

# 4.然后在slave1和slave2节点都要重复上面的操作

# 5.重启hadoop,再次运行jar包


8.2 全分布运行官方 grep 案例

案例任务:是一个演示MapReduce的经典示例,用于在Hadoop集群上执行分布式文本搜索和过滤操作。这个任务的目标是从大量文本数据中查找与给定正则表达式模式匹配的文本行,并将匹配的行提取到输出文件中。

1.首先在 HDFS 中创建用户目录(上个实例创建就不需要再创建了):

hdfs dfs -mkdir -p /user/root

两种方法相看刚才创建的目录:

1)使用命令

hdfs dfs -ls /

image-20220606103253142


2)WEB方法 (点击Utilities-Browse the file system

image-20220609153541333


2.将 /opt/apps/hadoop/etc/hadoop/*.xml 复制到HDFS分布式文件系统中的 /user/root/input2 中。

注意:我们使用的是 root 用户,并且已在HDFS中创建相应的用户目录 /user/root ,因此在命令中就可以使用相对路径如 input2,其对应的绝对路径就是 /user/root/input2:

hdfs dfs -rm -r -f input2     # 递归删除指定的目录input2,包括目录内的所有文件和子目录。其中 -r 表示递归删除,-f 表示强制删除
hdfs dfs -mkdir input2    
hdfs dfs -put /opt/apps/hadoop/etc/hadoop/*.xml input2
hdfs dfs -rm -r output2    # 删除 output2 文件夹(Hadoop 运行程序时,输出目录不能存在,否则会提示错误 )

复制完成后,可以通过如下命令查看文件列表:

hdfs dfs -ls input2


3.运行 MapReduce 作业

[root@master hadoop]#  cd /usr/local/hadoop

# 运行以下命令
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input2 output2 'dfs[a-z.]+'

# 'dfs[a-z.]+'正则表达式:用于在文本中查找以 "dfs" 开头,后跟一个或多个小写字母或句点的文本片段。例如,它可以匹配 "dfsabc"、"dfs.efg"、"dfsxyz" 等。


4.查看运行结果的命令(查看的是位于 HDFS 中的输出结果):

hdfs dfs -cat output2/*

结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。

image-20220606111906809

我们也可以将运行结果取回到本地:

rm -r /usr/local/hadoop/output2                    # 先删除本地的output文件夹(如果存在)
hdfs dfs -get output2 /usr/local/hadoop/output2     # 将 HDFS 上的 output 文件夹拷贝到本机
cat /usr/local/hadoop/output2/*


常见问题:

Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

hdfs dfs -rm -r output    # 删除 output 文件夹


关闭Hadoop集群

最后,关闭Hadoop集群,需要在master节点执行如下命令:

stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver

至此,就顺利完成了Hadoop集群搭建。



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1