Hadoop 介绍及集群搭建

本文详细介绍Hadoop集群的搭建过程,涵盖1.x至3.x版本架构演进,包括环境准备、安装包介绍、配置规划等内容。同时,深入探讨Hadoop高可用集群配置,涉及NameNode与ResourceManager的HA配置。

第一章 Hadoop 介绍

1.2 Hadoop 架构演变

1.2.1 1.x版本架构模型介绍
  • 架构说明

    DataNode 的数量一般和 TaskTracker 的数量对应
    在这里插入图片描述

  • 文件系统核心模块介绍

    ① NameNode(只有 1 个)

    集群当中的主节点,管理元数据(文件的大小,文件的位置,文件的权限),主要用于管理集群当中的各种数据

    ② SecondaryNameNode

    用于 Hadoop 当中辅助 NameNode 做元数据信息的辅助管理

    ③ DataNode

    集群当中的从节点,主要用于存储集群当中的各种数据

  • 数据计算核心模块介绍

    ① JobTracker(只有 1 个)

    接收用户的计算请求任务,并分配任务给从节点;负责资源的分配

    资源管理 和 任务调度

    ② TaskTracker

    负责执行主节点 JobTracke 分配的任务

  • 1.x 架构存在的问题

    ① 存在单点故障

    ② JobTracker 工作比较繁重,既要进行任务的分配,又要进行资源的分配,当计算任务比较多的时候,JobTracker 可能会存在宕机的风险

1.2.2 2.x版本的架构模型
  • 架构说明

    ① NameNode 与 ResourceManager 单节点架构模型

    在这里插入图片描述

    ② NameNode 高可用与 ResourceManager 单节点架构模型

    在这里插入图片描述

    ③ NameNode 单节点与 ResourceManager 高可用架构模型

    在这里插入图片描述

    ④ NameNode 与 ResourceManager 高可用架构模型

    在这里插入图片描述

  • 文件核心模块介绍(HDFS)

    ① NameNode

    集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现 HA 高可用

    ② JournalNode

    元数据信息管理进程,一般都是奇数个,通过将编辑日志复制到三个 JournalNodes 上,这种架构能够容忍系统中的任何一个节点的失败

    主要解决了 2 个 NameNode 中的原数据不同的问题,防止发生脑裂 ,当其中的某个 NameNode 在更新元数据的时候,JournalNode 会强制另一台备份的 NameNode 对更新后的元数据进行拉取和更新

    ③ DataNode

    从节点,用于数据的存储

  • 数据计算核心模块(YARN)

    ① ResourceManager

    Yarn平台的主节点,主要用于接收各种任务,通过两个,构建成高可用

    ② NodeManager

    Yarn平台的从节点,主要用于处理 ResourceManager 分配的任务

    ③ ApplicationMaster

    进程程序,主要负责任务的分配和向主节点申请资源,由 ResourceManager 在某一个 NodeManager 中启动

  • Hadoop 集群介绍

    HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起

    ① HDFS 集群

    负责海量数据的存储

    ② YARN 集群

    负责海量数据运算时的资源调度

  • MapReduce 介绍

    一个分布式运算编程框架,是应用程序开发包,由用户按照编程规范进行程序开发,后打包运行在HDFS集群上,并且受到YARN集群的资源调度管理

  • 1.x 结构 和 2.x 架构的主要区别

    Application Master 在每一个 NodeManager 节点上都存在,这样就会减轻 Yarn 中的 ResourceManager 负担, ResourceManager 只需要做资源分配就可以了

    YARN 把资源管理与任务调度的工作分离开来,减少了 MapReduce 中 Job Tracker 的压力

1.2.3 3.x 版本架构和模型介绍
  • Hadoop 3.x 新特性:通用型

    ① 精简 Hadoop 内核,包括剔除过期的 API 和实现,将默认组件实现替换成最高效的实现

    ② Classpath isolation:以防止不同版本jar包冲突

    ③ Shell脚本重构: Hadoop 3.0对Hadoop的管理脚本进行了重构,修复了大量bug,增加了新特性

  • Hadoop 3.x 新特性:HDFS

    ① HDFS支持数据的擦除编码,这使得HDFS在不降低可靠性的前提下,节省一半存储空间

    ② 多 NameNode 支持,即支持一个集群中,一个active、多个standby namenode部署方式

    注:多 ResourceManager 特性在hadoop 2.0中已经支持

  • Hadoop 3.x 新特性:MapReduce

    ① Tasknative优化:为MapReduce增加了C/C++的map output collector实现(包括Spill,Sort和IFile等),通过作业级别参数调整就可切换到该实现上。对于shuffle密集型应用,其性能可提高约30%

    ② MapReduce内存参数自动推断。在Hadoop 2.0中,为MapReduce作业设置内存参数非常繁琐,一旦设置不合理,则会使得内存资源浪费严重,在Hadoop3.0中避免了这种情况

  • Hadoop 3.x 新特性:HDFS纠删码

    在Hadoop3.X中,HDFS实现了Erasure Coding这个新功能。Erasure coding纠删码技术简称EC,是一种数据保护技术.最早用于通信行业中数据传输中的数据恢复,是一种编码容错技术

    它通过在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。在一定范围的数据出错情况下,通过纠删码技术都可以进行恢复

    hadoop-3.0之前,HDFS存储方式为每一份数据存储3份,这也使得存储利用率仅为1/3,hadoop-3.0引入纠删码技术(EC技术),实现1份数据+0.5份冗余校验数据存储方式

    与副本相比纠删码是一种更节省空间的数据持久化存储方法。标准编码(比如Reed-Solomon(10,4))会有1.4 倍的空间开销;然而HDFS副本则会有3倍的空间开销

第二章 Hadoop 集群搭建

2.1 环境准备

  • 环境介绍

    Hadoop 2.7.5 + 3 台云服务器

      公网ip          内网ip
    1.117.160.1    171.17.0.1
    1.117.160.2    171.17.0.2
    1.117.160.3    171.17.0.3
    
  • Hadoop 集群的部署方式

    ① Standalone mode(独立模式)

    独立模式又称为单机模式,仅1个机器运行1个java进程,主要用于调试

    ② Pseudo-Distributed mode(伪分布式模式)

    伪分布模式也是在1个机器上运行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分别启动单独的java进程,主要用于调试

    ③ Cluster mode(群集模式)

    使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上

  • 下载 Hadoop 安装包
    Hadoop官网

  • 编译 Hadoop 包

    Apache 给出的 Hadoop 的安装包没有提供带C程序访问的接口,所以我们在使用本地库(本地库可以用来做压缩,以及支持C程序等)的时候就会出问题,需要对 Hadoop 源码包进行重新编译

    ① 编译前

    在这里插入图片描述

    ② 编译后

    在这里插入图片描述

2.2 Hadoop 安装包介绍

  • 安装包 hadoop-2.7.5 解压后的目录结构介绍

    ① bin:Hadoop 最基本的管理脚本和使用脚本的目录,这些脚本是 sbin 目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop

    ② etc:Hadoop配置文件所在的目录,包括core-site,xml、hdfs-site.xml、mapred-site.xml等从Hadoop1.0继承而来的配置文件和yarn-site.xml等Hadoop2.0新增的配置文件

    ③ include:对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用 C++ 定义的,通常用于 C++ 程序访问HDFS 或者编写 MapReduce 程序

    ④ lib:该目录包含了Hadoop 对外提供的编程动态库和静态库,与 include 目录中的头文件结合使用

    ⑤ libexec:各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息

    ⑥ sbin:Hadoop 管理脚本所在的目录,主要包含 HDFS 和 YARN 中各类服务的启动/关闭脚本

    ⑦ share:Hadoop 各个模块编译后的jar包所在的目录,官方自带示例

2.3 集群配置规划

  • 集群节点规划

    主机\组件node1node2node3
    NameNode
    Secondary NameNode
    DataNode
    ResourceManager
    NodeManager
  • 域名映射及 hostname 修改
    为了方便管理集群,统一对集群中的 3 个节点做 hostname 修改及域名映射
    建议配置域名映射,否则在使用JAVA API 访问集群的时候会遇到以下错误
    外网无法访问云主机

    # 修改hostname,重启后生效
    vim /etc/hostname
    
    # 修改后 3 个节点的 hostname 分别为
    node1
    node2
    node3
    
    # 对 3 个节点分别做域名映射,在末尾添加
    vim /etc/hosts
    
    # 第 1 个节点的域名映射增加的内容,注意当前节点的为 内网ip
    171.17.0.1  node1
    171.17.0.2  node2
    171.17.0.3  node3
    
  • 开启 3 台服务器之间的免密登陆

    Hadoop 节点众多, 而且一般在主节点启动从节点, 这个时候就需要程序自动在主节点登录到从节点中, 如果不能免密就每次都要输入密码,操作比较繁琐,需要设置三台服务器之间 SSH 免密登陆
    可以参考这篇文章进行配置:Linux常用操作-SSH免密登陆

  • 开启时钟同步

    可以参考这篇文章进行配置:Linux常用操作-时钟同步

2.4 Hadoop 配置

  • 注意

    在不同的节点中修改配置文件时,如果需要配置成当前节点的 ip ,请配置为当前节点的 内网ip,其他服务器的 ip 配置为公网即可

    如果使用域名映射,则不需要对 ip 进行修改,操作会简单一些

2.4.1 修改 hadoop-env.sh
  • 3 个节点都配置

    # 修改为服务器的 JDK 路径
    export JAVA_HOME=/usr/lib/jdk1.8.0_172
    
2.4.2 修改 core-site.xml
  • core-site.xml 介绍

    hadoop 的核心配置文件,有默认的配置项 core-default.xml

    core-default.xmlcore-site.xml 的功能是一样的,如果在 core-site.xml 里没有配置的属性,则会自动会获取 core-default.xml里的相同属性的值

  • 配置修改

    <configuration>
      
       <property>
    		  <name>fs.defaultFS</name>
    		  <value>hdfs://node1:8020</value>
    	 </property>
      
       <!-- 配置Hadoop存储数据目录,默认/tmp/hadoop-${user.name} -->
    	 <property>
    		   <name>hadoop.tmp.dir</name>
    		   <value>/opt/software/hadoop-2.7.5/hadoopDatas/tempDatas</value>
    	</property>
      
       <!-- 缓冲区大小,实际工作中根据服务器性能动态调整: 根据自己的虚拟机的内存大小进行配置即可, 不要小于1GB, 最高配置为 4gb  -->
    	 <property>
    		   <name>io.file.buffer.size</name>
    		   <value>4096</value>
    	 </property>
    
    	 <!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
    	 <property>
    		   <name>fs.trash.interval</name>
    		   <value>10080</value>
    	 </property>
      
    </configuration>
    
2.4.3 修改 hdfs-site.xml
  • 文件介绍

    HDFS 的核心配置文件,主要配置 HDFS 相关参数,有默认的配置项 hdfs-default.xml

    hdfs-default.xml 与 hdfs-site.xml 的功能是一样的,如果在 hdfs-site.xml 里没有配置的属性,则会自动会获取 hdfs-default.xml 里的相同属性的值

  • 修改配置

    <configuration>
        <!-- 指定SecondaryNameNode的主机和端口 -->
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>node2:50090</value>
        </property>
        <!-- 指定namenode的页面访问地址和端口 -->
        <property>
            <name>dfs.namenode.http-address</name>
            <value>node1:50070</value>
        </property>
        <!-- 指定namenode元数据的存放位置 -->
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:///opt/software/hadoop-2.7.5/hadoopDatas/namenodeDatas</value>
        </property>
        <!--  定义datanode数据存储的节点位置 -->
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:///opt/software/hadoop-2.7.5/hadoopDatas/datanodeDatas</value>
        </property>
        <!-- 定义namenode的edits文件存放路径 -->
        <property>
            <name>dfs.namenode.edits.dir</name>
            <value>file:///opt/software/hadoop-2.7.5/hadoopDatas/nn/edits</value>
        </property>
    
        <!-- 配置检查点目录 -->
        <property>
            <name>dfs.namenode.checkpoint.dir</name>
            <value>file:///opt/software/hadoop-2.7.5/hadoopDatas/snn/name</value>
        </property>
    
        <property>
            <name>dfs.namenode.checkpoint.edits.dir</name>
            <value>file:///opt/software/hadoop-2.7.5/hadoopDatas/dfs/snn/edits</value>
        </property>
        <!-- 文件切片的副本个数-->
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
    
        <!-- 设置HDFS的文件权限-->
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
        <!-- 设置一个文件切片的大小:128M-->
        <property>
            <name>dfs.blocksize</name>
            <value>134217728</value>
        </property>
        <!-- 指定DataNode的节点配置文件 -->
        <property>
            <name>dfs.hosts</name>
            <value>/opt/software/hadoop-2.7.5/etc/hadoop/slaves</value>
        </property>
    </configuration>
    
2.4.4 修改 mapred-site.xml
  • 文件说明

    MapReduce 的核心配置文件,Hadoop 默认只有个模板文件 mapred-site.xml.template,需要使用该文件复制出来一份 mapred-site.xml 文件

    # 进入解压目录
    cd  /opt/software/hadoop-2.7.5/etc/hadoop
    
    # 创建mapred-site.xml
    cp mapred-site.xml.template mapred-site.xml
    
  • 文件修改

    <configuration>
        <!-- 指定分布式计算使用的框架是yarn -->
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    
        <!-- 开启MapReduce小任务模式 -->
        <property>
            <name>mapreduce.job.ubertask.enable</name>
            <value>true</value>
        </property>
    
        <!-- 设置历史任务的主机和端口 -->
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>node1:10020</value>
        </property>
    
        <!-- 设置网页访问历史任务的主机和端口 -->
        <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>node1:19888</value>
        </property>
    </configuration>
    
2.4.5 修改 mapred-env.sh
  • 文件介绍

    MapReduce 的环境配置文件

  • 文件修改

    # 将原文件的JAVA_HOME配置前边的注释去掉,然后按照以下方式修改
    export JAVA_HOME=/usr/lib/jdk1.8.0_172
    
2.4.6 修改 yarn-site.xml
  • 文件介绍

    YARN 的核心配置文件

  • 文件修改

    <configuration>
        <!-- 配置yarn主节点的位置 -->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>node1</value>
        </property>
    
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
    
        <!-- 开启日志聚合功能 -->
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
        </property>
        <!-- 设置聚合日志在hdfs上的保存时间 -->
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>604800</value>
        </property>
        <!-- 设置yarn集群的内存分配方案 -->
        <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>20480</value>
        </property>
        <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>2048</value>
        </property>
        <property>
            <name>yarn.nodemanager.vmem-pmem-ratio</name>
            <value>2.1</value>
        </property>
    </configuration>
    
2.4.7 修改 slves文件
  • 文件介绍

    slaves 文件里面记录的是集群主机名

  • 文件的作用

    ① 配合一键启动脚本如 start-dfs.shstop-yarn.sh 用来进行集群启动,这时候 slaves 文件里面的主机标记的就是从节点角色所在的机器

    ② 可以配合 hdfs-site.xml 里面 dfs.hosts 属性形成一种白名单机制

  • dfs.hosts 介绍

    dfs.hosts 指定一个文件,其中包含允许连接到 NameNode 的主机列表。必须指定文件的完整路径名,那么所有在 slaves 中的主机才可以加入的集群中。如果值为空,则允许所有主机

    在这里插入图片描述

  • 文件修改

    注意:不同的节点对应的 ip 需要使用对应的 内网ip,此处仅展示

    node1
    node2
    node3
    
2.4.8 创建数据目录
  • 创建 Hadoop 所需的文件目录

    三个节点的服务器都需要执行

    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/tempDatas
    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/namenodeDatas
    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/datanodeDatas
    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/nn/edits
    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/snn/name
    mkdir -p /opt/software/hadoop-2.7.5/hadoopDatas/dfs/snn/edits
    
2.4.9 配置 Hadoop 环境变量
  • 配置 Hadoop 环境变量

    # 打开 profile 文件
    vim  /etc/profile
    
    # 添加以下内容
    export HADOOP_HOME=/opt/software/hadoop-2.7.5
    export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    
    # 保存退出后,刷新环境变量
    source /etc/profile
    

2.5 Hadoop 集群启动方式

  • 集群启动前的准备

    首次启动 HDFS 时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的

    # 只需要在第一个节点执行即可
    hadoop namenode -format
    
  • 启动方式说明

    按照启动方式,一般有三种,第 3 种最方便

    ① 单个节点逐一启动

    以下脚本位于 /export/servers/hadoop-2.7.5/sbin 目录下,如果想要停止某个节点上某个角色,只需要把命令中的 start 改为stop 即可

    # 在第一个节点启动 HDFS NameNode
    hadoop-daemon.sh start namenode
    
    # 在 3 个节点的主机上,分别使用以下命令启动 HDFS DataNode
    hadoop-daemon.sh start datanode
    
    # 在 第 1 个节点的主机上使用以下命令启动 YARN ResourceManager
    yarn-daemon.sh  start resourcemanager
    
    # 在 3 个节点的主机上使用以下命令启动 YARN nodemanager
    yarn-daemon.sh start nodemanager
    systemctl disable firewalld.service
    

    ② 不同集群分别启动,只需要在第 1 个节点的服务器执行即可

    # 启动 HDFS
    start-dfs.sh
    
    # 启动 Yarn
    start-yarn.sh
    
    # 启动历史任务服务进程
    mr-jobhistory-daemon.sh start historyserver
    

    ③ 脚本一键启动,只需要在第 1 个节点的服务器执行即可

    # 启动整个集群
    start-all.sh
    
    # 停止整个集群
    stop-all.sh
    

2.6 集群页面访问

  • 页面访问

    Hadoop 集群启动并运行,可以通过web-ui进行集群查看

  • 访问 nodename

    # 访问 nodename 
    http://1.117.160.1:50070/ 
    
  • 访问 Yarn 集群页面

    # 访问 yarn 集群页面
    http://1.117.160.1:8088/cluster 
    
  • 访问 MapReduce 历史任务页面

    # 访问 历史任务页面
    http://1.117.160.1:19888/jobhistory
    

第三章 Hadoop 高可用搭建

3.1 HDFS的高可用介绍

  • HDFS的高可用介绍

    在 Hadoop 中,NameNode 所处的位置是非常重要的,整个 HDFS 文件系统的元数据信息都由 NameNode 来管理,NameNode 的可用性直接决定了Hadoop 的可用性,一旦 NameNode 进程不能工作了,就会影响整个集群的正常使用

    在这里插入图片描述

  • 高可用(HA)的集群配置

    在典型的 HA 集群中,两台独立的机器被配置为 NameNode。在工作集群中,NameNode 机器中的一个处于 Active 状态,另一个处于 Standby 状态。Active NameNode负责群集中的所有客户端操作,而 Standby 充当从服务器。Standby机器保持足够的状态以提供快速故障切换(如果需要)

  • 高可用集群组件介绍

    ① ZKFailoverController

    基于 Zookeeper 的故障转移控制器,它负责控制 NameNode 的主备切换,ZKFailoverController 会监测 NameNode 的健康状态,当发现 Active NameNode 出现异常时会通过 Zookeeper 进行一次新的选举,完成 Active 和 Standby 状态的切换

    主节点启动后,会在zookeeper中注册一个 hadoop-ha ,当节点宕机后,该文件就会消失。zookeeper监控到该文件不存在时,就会启动备用节点

    ② HealthMonitor

    周期性调用 NameNode 的 HAServiceProtocol RPC 接口(monitorHealth 和 getServiceStatus),监控 NameNode 的健康状态并向ZKFailoverController 反馈

    ③ ActiveStandbyElector

    接收 ZKFC 的选举请求,通过 Zookeeper 自动完成主备选举,选举完成后回调 ZKFailoverController 的主备切换方法对 NameNode进行 Active 和 Standby 状态的切换

    ④ DataNode

    NameNode 包含了 HDFS 的元数据信息和数据块信息(blockmap),其中数据块信息通过 DataNode 主动向 Active NameNode 和Standby NameNode 上报

    ⑤ 共享存储系统 (指的是Journal Node)

    共享存储系统负责存储HDFS的元数据(EditsLog),Active NameNode(写入)和 Standby NameNode(读取)通过共享存储系统实现元数据同步,在主备切换过程中,新的 Active NameNode 必须确保元数据同步完成才能对外提供服务

    在这里插入图片描述

3.2 集群配置规划

  • 高可用集群配置说明

    使用完全分布式,实现 namenode 高可用,ResourceManager 的高可用

  • 集群规划

    node1node2node3
    zookeeperzkzkzk
    HDFSJournalNodeJournalNodeJournalNode
    NameNodeNameNode
    ZKFCZKFC
    DataNodeDataNodeDataNode
    YARNResourceManagerResourceManager
    NodeManagerNodeManagerNodeManager
    MapReduceJobHistoryServer

3.3 配置文件修改

3.3.1 修改 core-site.xml
  • 3台机器配置相同

    <configuration>
       <!-- 指定NameNode的HA高可用的zk地址  -->
    	 <property>
    		   <name>ha.zookeeper.quorum</name>
    		   <value>node1:2181,node2:2181,node3:2181</value>
    	 </property>
       <!-- 指定HDFS访问的域名地址  -->
    	 <property>
    		   <name>fs.defaultFS</name>
    		   <value>hdfs://ns</value>
    	 </property>
      <!-- 临时文件存储目录  -->
    	<property>
    		  <name>hadoop.tmp.dir</name>
    		  <value>/opt/server/hadoop-2.7.5/data/tmp</value>
    	</property>
    	 <!-- 开启hdfs垃圾箱机制,指定垃圾箱中的文件七天之后就彻底删掉
    			单位为分钟
    	 -->
    	<property>
    		 <name>fs.trash.interval</name>
    		 <value>10080</value>
    	</property>
    </configuration>
    
3.3.2 修改 hdfs-site.xml
  • 3 台机器配置相同

    <configuration>
    <!--  指定命名空间  -->
    	<property>
    		<name>dfs.nameservices</name>
    		<value>ns</value>
    	</property>
    <!--  指定该命名空间下的两个机器作为我们的NameNode  -->
    	<property>
    		<name>dfs.ha.namenodes.ns</name>
    		<value>nn1,nn2</value>
    	</property>
    
    	<!-- 配置第一台服务器的namenode通信地址  -->
    	<property>
    		<name>dfs.namenode.rpc-address.ns.nn1</name>
    		<value>node1:8020</value>
    	</property>
    	<!--  配置第二台服务器的namenode通信地址  -->
    	<property>
    		<name>dfs.namenode.rpc-address.ns.nn2</name>
    		<value>node2:8020</value>
    	</property>
    	<!-- 所有从节点之间相互通信端口地址 -->
    	<property>
    		<name>dfs.namenode.servicerpc-address.ns.nn1</name>
    		<value>node1:8022</value>
    	</property>
    	<!-- 所有从节点之间相互通信端口地址 -->
    	<property>
    		<name>dfs.namenode.servicerpc-address.ns.nn2</name>
    		<value>node2:8022</value>
    	</property>
    	
    	<!-- 第一台服务器namenode的web访问地址  -->
    	<property>
    		<name>dfs.namenode.http-address.ns.nn1</name>
    		<value>node1:50070</value>
    	</property>
    	<!-- 第二台服务器namenode的web访问地址  -->
    	<property>
    		<name>dfs.namenode.http-address.ns.nn2</name>
    		<value>node2:50070</value>
    	</property>
    	
    	<!-- journalNode的访问地址,注意这个地址一定要配置 -->
    	<property>
    		<name>dfs.namenode.shared.edits.dir</name>
    		<value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
    	</property>
    	<!--  指定故障自动恢复使用的哪个java类 -->
    	<property>
    		<name>dfs.client.failover.proxy.provider.ns</name>
    		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    	</property>
    	
    	<!-- 故障转移使用的哪种通信机制 -->
    	<property>
    		<name>dfs.ha.fencing.methods</name>
    		<value>sshfence</value>
    	</property>
    	
    	<!-- 指定通信使用的公钥  -->
    	<property>
    		<name>dfs.ha.fencing.ssh.private-key-files</name>
    		<value>/root/.ssh/id_rsa</value>
    	</property>
    	<!-- journalNode数据存放地址  -->
    	<property>
    		<name>dfs.journalnode.edits.dir</name>
    		<value>/opt/server/hadoop-2.7.5/data/dfs/jn</value>
    	</property>
    	<!-- 启用自动故障恢复功能 -->
    	<property>
    		<name>dfs.ha.automatic-failover.enabled</name>
    		<value>true</value>
    	</property>
    	<!-- namenode产生的文件存放路径 -->
    	<property>
    		<name>dfs.namenode.name.dir</name>
    		<value>file:///opt/server/hadoop-2.7.5/data/dfs/nn/name</value>
    	</property>
    	<!-- edits产生的文件存放路径 -->
    	<property>
    		<name>dfs.namenode.edits.dir</name>
    		<value>file:///opt/server/hadoop-2.7.5/data/dfs/nn/edits</value>
    	</property>
    	<!-- dataNode文件存放路径 -->
    	<property>
    		<name>dfs.datanode.data.dir</name>
    		<value>file:///opt/server/hadoop-2.7.5/data/dfs/dn</value>
    	</property>
    	<!-- 关闭hdfs的文件权限 -->
    	<property>
    		<name>dfs.permissions</name>
    		<value>false</value>
    	</property>
    	<!-- 指定block文件块的大小 -->
    	<property>
    		<name>dfs.blocksize</name>
    		<value>134217728</value>
    	</property>
    </configuration>
    
3.3.3 修改 yarn-site.xml
  • 注意:node2 和 node3 节点的配置是不同的

    <configuration>
        <!-- Site specific YARN configuration properties -->
        <!-- 是否启用日志聚合.应用程序完成后,日志汇总收集每个容器的日志,这些日志移动到文件系统,例如HDFS. -->
        <!-- 用户可以通过配置"yarn.nodemanager.remote-app-log-dir"、"yarn.nodemanager.remote-app-log-dir-suffix"来确定日志移动到的位置 -->
        <!-- 用户可以通过应用程序时间服务器访问日志 -->
    
        <!-- 启用日志聚合功能,应用程序完成后,收集各个节点的日志到一起便于查看 -->
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
        </property>
    
    
        <!--开启resource manager HA,默认为false-->
        <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>
        <!-- 集群的Id,使用该值确保RM不会做为其它集群的active -->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>mycluster</value>
        </property>
        <!--配置resource manager  命名-->
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm1,rm2</value>
        </property>
        <!-- 配置第一台机器的resourceManager -->
        <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>node2</value>
        </property>
        <!-- 配置第二台机器的resourceManager -->
        <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>node3</value>
        </property>
    
        <!-- 配置第一台机器的resourceManager通信地址 -->
        <property>
            <name>yarn.resourcemanager.address.rm1</name>
            <value>node2:8032</value>
        </property>
        <property>
            <name>yarn.resourcemanager.scheduler.address.rm1</name>
            <value>node2:8030</value>
        </property>
        <property>
            <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
            <value>node2:8031</value>
        </property>
        <property>
            <name>yarn.resourcemanager.admin.address.rm1</name>
            <value>node2:8033</value>
        </property>
        <property>
            <name>yarn.resourcemanager.webapp.address.rm1</name>
            <value>node2:8088</value>
        </property>
    
        <!-- 配置第二台机器的resourceManager通信地址 -->
        <property>
            <name>yarn.resourcemanager.address.rm2</name>
            <value>node3:8032</value>
        </property>
        <property>
            <name>yarn.resourcemanager.scheduler.address.rm2</name>
            <value>node3:8030</value>
        </property>
        <property>
            <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
            <value>node3:8031</value>
        </property>
        <property>
            <name>yarn.resourcemanager.admin.address.rm2</name>
            <value>node3:8033</value>
        </property>
        <property>
            <name>yarn.resourcemanager.webapp.address.rm2</name>
            <value>node3:8088</value>
        </property>
    
    
        <!--开启resourcemanager自动恢复功能-->
        <property>
            <name>yarn.resourcemanager.recovery.enabled</name>
            <value>true</value>
        </property>
        <!--在node2上配置rm1,在node3上配置rm2,注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在YARN的另一个机器上一定要修改,其他机器上不配置此项-->
        <property>
            <name>yarn.resourcemanager.ha.id</name>
            <value>rm1</value>
            <description>If we want to launch more than one RM in single node, we need this configuration</description>
        </property>
    
        <!--用于持久存储的类。尝试开启-->
        <property>
            <name>yarn.resourcemanager.store.class</name>
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>node2:2181,node3:2181,node1:2181</value>
            <description>For multiple zk services, separate them with comma</description>
        </property>
        <!--开启resourcemanager故障自动切换,指定机器-->
        <property>
            <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
            <value>true</value>
            <description>Enable automatic failover; By default, it is enabled only when HA is enabled.</description>
        </property>
        <property>
            <name>yarn.client.failover-proxy-provider</name>
            <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
        </property>
        <!-- 允许分配给一个任务最大的CPU核数,默认是8 -->
        <property>
            <name>yarn.nodemanager.resource.cpu-vcores</name>
            <value>2</value>
        </property>
        <!-- 每个节点可用内存,单位MB -->
        <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>2048</value>
        </property>
        <!-- 单个任务可申请最少内存,默认1024MB -->
        <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>1024</value>
        </property>
        <!-- 单个任务可申请最大内存,默认8192MB -->
        <property>
            <name>yarn.scheduler.maximum-allocation-mb</name>
            <value>2048</value>
        </property>
        <!--多长时间聚合删除一次日志 此处-->
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>2592000</value><!--30 day-->
        </property>
        <!--时间在几秒钟内保留用户日志。只适用于如果日志聚合是禁用的-->
        <property>
            <name>yarn.nodemanager.log.retain-seconds</name>
            <value>604800</value><!--7 day-->
        </property>
        <!--指定文件压缩类型用于压缩汇总日志-->
        <property>
            <name>yarn.nodemanager.log-aggregation.compression-type</name>
            <value>gz</value>
        </property>
        <!-- nodemanager本地文件存储目录-->
        <property>
            <name>yarn.nodemanager.local-dirs</name>
            <value>/opt/server/hadoop-2.7.5/yarn/local</value>
        </property>
        <!-- resourceManager  保存最大的任务完成个数 -->
        <property>
            <name>yarn.resourcemanager.max-completed-applications</name>
            <value>1000</value>
        </property>
        <!-- 逗号隔开的服务列表,列表名称应该只包含a-zA-Z0-9_,不能以数字开始-->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
    
        <!--rm失联后重新链接的时间-->
        <property>
            <name>yarn.resourcemanager.connect.retry-interval.ms</name>
            <value>2000</value>
        </property>
    </configuration>
    
3.3.4 修改 mapred-site.xml
  • 3台机器相同

    <configuration>
    <!--指定运行mapreduce的环境是yarn -->
    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
    </property>
    <!-- MapReduce JobHistory Server IPC host:port -->
    <property>
            <name>mapreduce.jobhistory.address</name>
            <value>node3:10020</value>
    </property>
    <!-- MapReduce JobHistory Server Web UI host:port -->
    <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>node0:19888</value>
    </property>
    <!-- The directory where MapReduce stores control files.默认 ${hadoop.tmp.dir}/mapred/system -->
    <property>
            <name>mapreduce.jobtracker.system.dir</name>
            <value>/opt/server/hadoop-2.7.5/data/system/jobtracker</value>
    </property>
    <!-- The amount of memory to request from the scheduler for each map task. 默认 1024-->
    <property>
            <name>mapreduce.map.memory.mb</name>
            <value>1024</value>
    </property>
    <!-- <property>
                    <name>mapreduce.map.java.opts</name>
                    <value>-Xmx1024m</value>
            </property> -->
    <!-- The amount of memory to request from the scheduler for each reduce task. 默认 1024-->
    <property>
            <name>mapreduce.reduce.memory.mb</name>
            <value>1024</value>
    </property>
    <!-- <property>
                   <name>mapreduce.reduce.java.opts</name>
                   <value>-Xmx2048m</value>
            </property> -->
    <!-- 用于存储文件的缓存内存的总数量,以兆字节为单位。默认情况下,分配给每个合并流1MB,给个合并流应该寻求最小化。默认值100-->
    <property>
            <name>mapreduce.task.io.sort.mb</name>
            <value>100</value>
    </property>
     
    <!-- <property>
            <name>mapreduce.jobtracker.handler.count</name>
            <value>25</value>
            </property>-->
    <!-- 整理文件时用于合并的流的数量。这决定了打开的文件句柄的数量。默认值10-->
    <property>
            <name>mapreduce.task.io.sort.factor</name>
            <value>10</value>
    </property>
    <!-- 默认的并行传输量由reduce在copy(shuffle)阶段。默认值5-->
    <property>
            <name>mapreduce.reduce.shuffle.parallelcopies</name>
            <value>15</value>
    </property>
    <property>
            <name>yarn.app.mapreduce.am.command-opts</name>
            <value>-Xmx1024m</value>
    </property>
    <!-- MR AppMaster所需的内存总量。默认值1536-->
    <property>
            <name>yarn.app.mapreduce.am.resource.mb</name>
            <value>1536</value>
    </property>
    <!-- MapReduce存储中间数据文件的本地目录。目录不存在则被忽略。默认值${hadoop.tmp.dir}/mapred/local-->
    <property>
            <name>mapreduce.cluster.local.dir</name>
            <value>/opt/server/hadoop-2.7.5/data/system/local</value>
    </property>
    </configuration>
    
3.3.5 修改 slaves
  • 3 台机器全部配置

    node1
    node2
    node3
    
3.3.6 修改 hadoop-env.sh
  • 3 台机器全部配置

    export JAVA_HOME=/export/server/jdk1.8.0_241
    
3.3.7 单独修改node3
  • 单独修改 yarn-site.xml

    <property>       
    	<name>yarn.resourcemanager.ha.id</name>
    	<value>rm2</value>
       <description>If we want to launch more than one RM in single node, we need this configuration</description>
    </property>
    
3.3.8 安装进程管理程序
  • 分别在 3 台机器上执行以下命令

    主要用于主备切换时,结束部分主的程序

    yum -y install psmisc
    

3.4 集群启动

  • 启动 HDFS 过程

    # node1机器执行以下命令
    cd  /opt/server/hadoop-2.7.5
    
    # 初始化 zookeeper,它会自动新建 zookeeper 的管理目录
    bin/hdfs zkfc -formatZK
    
    # 表示一次性启动 3 台 journalnode
    sbin/hadoop-daemons.sh start journalnode
    bin/hdfs namenode -format
    
    # 对 nodename 进行初始化操作
    bin/hdfs namenode -initializeSharedEdits -force
    
    # 启动 dfs 集群
    sbin/start-dfs.sh
    
    # node2机器执行以下命令 
    cd  /opt/server/hadoop-2.7.5
    
    # 第一台虽然已经启动,但是没有设置它是备份机,所以不会启动,需要手动重新启动
    bin/hdfs namenode -bootstrapStandby
    sbin/hadoop-daemon.sh start namenode
    
  • 启动 yarn 过程

    # node2机器执行以下命令 	
    cd   /opt/server/hadoop-2.7.5
    sbin/start-yarn.sh
    
    # node3机器执行以下命令 
    cd   /export/servers/hadoop-2.7.5
    sbin/start-yarn.sh
    
  • 启动 ZKFC

    # 在 node1 和 node2 机器上面启动 zkfc 进程,因为已经启动股哟了,所以这两个命令可以不执行
    hadoop-daemo.sh start zkfc
    hadoop-daemo.sh start zkfc
    
  • 查看resourceManager状态

    # node2机器执行以下命令 
    cd   /opt/server/hadoop-2.7.5
    bin/yarn rmadmin -getServiceState rm1
    
    # node3机器执行以下命令 
    cd   /opt/server/hadoop-2.7.5
    bin/yarn rmadmin -getServiceState rm2
    
  • node3 启动 jobHistory

    # node3机器执行以下命令 
    cd /opt/server/hadoop-2.7.5
    sbin/mr-jobhistory-daemon.sh start historyserver
    

3.5 集群访问

  • hdfs状态查看

    # node1机器查看hdfs状态
    http://192.168.88.161:50070/dfshealth.html#tab-overview
    
    # node2机器查看hdfs状态
    http://192.168.88.162:50070/dfshealth.html#tab-overview
    
  • yarn集群访问查看

    http://192.168.88.163:8088/cluster
    
  • 历史任务浏览界面查看

    http://192.168.88.163:19888/jobhistory
    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值