Hadoop 介绍及集群搭建
Hadoop 介绍及集群搭建第一章 Hadoop 介绍1.2 Hadoop 架构演变1.2.1 1.x版本架构模型介绍1.2.2 2.x版本的架构模型1.2.3 3.x 版本架构和模型介绍第二章 Hadoop 集群搭建2.1 环境准备2.2 Hadoop 安装包介绍2.3 集群配置规划2.4 Hadoop 配置2.4.1 修改 hadoop-env.sh2.4.2 修改 core-site.xml
Hadoop 介绍及集群搭建
第一章 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 集群配置规划
-
集群节点规划
主机\组件 node1 node2 node3 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.xml
与core-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.sh
、stop-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
的高可用 -
集群规划
node1 node2 node3 zookeeper zk zk zk HDFS JournalNode JournalNode JournalNode NameNode NameNode ZKFC ZKFC DataNode DataNode DataNode YARN ResourceManager ResourceManager NodeManager NodeManager NodeManager MapReduce JobHistoryServer
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

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)