hadoopHA集群搭建

hadoopHA角色分配
had01had02had03had04had05
ZookeeperZookeeperZookeeper
NameNode(Active)NameNode(Standby)
ZKFCZKFC
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ResourceManager(Standby)ResourceManager(Active)
NodeMangerNodeMangerNodeManger
JobHistoryServer
WebProxyServer

ZKFC 作为一个ZK集群 的客户端 ,用来监控NN的状态信息,每个NN节点必须运行一个ZKFC

Journal Node 日志节点是HDFS 中一种高可用的解决方案,两个NN进行数据同步,会通过JN进行互相独立的通信。当active状态的NameNode的命名空间有任何修改,会告知大部分JN进程,standby状态的NameNode会读取JNS中变更信息,并一致监控edits log的变化,把变化应用与自己的命名空间,这样在active状态NameNode出现错误的时候,standby状态的NameNode能够立马替代其功能。

主机之间相互映射

每个主机都要配置

vim /etc/hosts

192.168.111.101 had01
192.168.111.102 had02      
192.168.111.103 had03
192.168.111.104 had04
192.168.111.105 had05
关闭防火墙

每个主机都要配置

# 关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
SSH免密登录

每个主机都要执行

ssh-keygen -t rsa

在had01主机上操作

ssh-copy-id localhost
scp /root/.ssh/* had02:/root/.ssh/
scp /root/.ssh/* had03:/root/.ssh/
scp /root/.ssh/* had04:/root/.ssh/
scp /root/.ssh/* had05:/root/.ssh/
搭建java环境

以下都是在had01主机上操作

安装jdk

tar -zxf jdk-8u201-linux-x64.tar.gz -C /usr/local
# 为方便配置环境,将jdk改名
cd /usr/local
mv jdk1.8.0_201/ java

配置环境变量

vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

使配置生效

source /etc/profile

测试

java -version

出现以下内容,即为搭建成功
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

将java文件夹和配置文件分发到其它主机

scp -r /usr/local/java/ root@had02:/usr/local/
scp -r /usr/local/java/ root@had03:/usr/local/
scp -r /usr/local/java/ root@had04:/usr/local/
scp -r /usr/local/java/ root@had05:/usr/local/
scp -r /etc/profile root@had02:/etc/
scp -r /etc/profile root@had03:/etc/
scp -r /etc/profile root@had04:/etc/
scp -r /etc/profile root@had05:/etc/

在 had02 ~ had05主机上执行

source /etc/profile
搭建hadoop集群

以下都是在had01主机上操作

安装hadoop

tar -zxf hadoop-2.9.2.tar.gz -C /usr/local
# 为方便配置环境,将文件夹改名
cd /usr/local
mv hadoop-2.9.2/ hadoop

配置hadoop环境变量

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

使环境变量生效

source /etc/profile

配置hadoop-env.sh

cd /usr/local/hadoop/etc/hadoop/
vim hadoop-env.sh
export JAVA_HOME=/usr/local/java

配置core-site.xml

cd /usr/local/hadoop/etc/hadoop/
vim core-site.xml
<!-- 指定hdfs的nameservices名称为mycluster,与hdfs-site.xml的HA配置相同 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://mycluster</value>
</property>
<!-- 指定缓存文件存储的路径 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/usr/local/hadoop/tmp/data</value>
</property>
<!-- 配置hdfs文件被永久删除前保留的时间(单位:分钟),默认值为0表明垃圾回收站功能关闭 -->
<property>
	<name>fs.trash.interval</name>
	<value>1440</value>
</property>
<!-- 配置HDFS WEB端使用的静态用户 -->
<property>
	<name>hadoop.http.staticuser.user</name>
	<value>hadoop</value>
</property>
<!-- 指定zookeeper地址,配置HA时需要 -->
<property>
	<name>ha.zookeeper.quorum</name>
	<value>had03:2181,had04:2181,had05:2181</value>
</property>
<!-- 设置机架脚本文件-->
<property>
	<name>net.topology.script.file.name</name>
	<value>/usr/local/hadoop/etc/hadoop/rack.sh</value>
</property>

创建机架脚本文件

touch /usr/local/hadoop/etc/hadoop/rack.sh

机架脚本文件内容

cd /usr/local/hadoop/etc/hadoop
vim rack.sh
while [ $# -gt 0 ] ; do
	nodeArg=$1
	exec</usr/hadoop-2.9.2/etc/hadoop/topology.data
	result=""
	while read line ; do
        ar=( $line )
        if [ "${ar[0]}" = "$nodeArg" ] ; then
        result="${ar[1]}"
        fi
    done
    shift
    if [ -z "$result" ] ; then
         echo -n "/default-rack"
    else
    	echo -n "$result "
    fi
done

机架脚本添加权限

chmod 771 /usr/local/hadoop/etc/hadoop/rack.sh

创建机架文件

touch /usr/local/hadoop/etc/hadoop/topology.data
vim /usr/local/hadoop/etc/hadoop/topology.data

机架文件内容

192.168.111.201 /rack01
192.168.111.202 /rack01
192.168.111.203 /rack02
192.168.111.204 /rack02
192.168.111.205 /rack02

配置hdfs-site.xml

cd /usr/local/hadoop/etc/hadoop/
vim hdfs-site.xml
<!-- 指定hdfs元数据存储的路径 -->
<property>
	<name>dfs.namenode.name.dir</name>
	<value>/usr/local/hadoop/data/namenode</value>
</property>
<!-- 指定hdfs数据存储的路径 -->
<property>
	<name>dfs.datanode.data.dir</name>
	<value>/usr/local/hadoop/data/datanode</value>
</property>
<!-- 设置副本因子数为3-->
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
<!-- 关闭权限验证 -->
<property>
	<name>dfs.permissions.enabled</name>
	<value>false</value>
</property>
<!-- 开启WebHDFS功能(基于REST的接口服务) -->
<property>
	<name>dfs.webhdfs.enabled</name>
	<value>true</value>
</property>
<!-- 自动故障转移-->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!-- 命名服务为mycluster-->
<property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
</property>
<!-- 指定mycluster的两个namenode的名称分别为nn1,nn2 -->
<property>
	<name>dfs.ha.namenodes.mycluster</name>
	<value>nn1,nn2</value>
</property>
<!-- 配置nn1,nn2的rpc通信端口 -->
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn1</name>
	<value>had01:9000</value>
</property>
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>had02:9000</value>
</property>
<!-- 配置nn1,nn2的http通信端口 -->
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>had01:50070</value>
</property>
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>had02:50070</value>
</property>
<!-- 指定namenode元数据存储在journalnode中的路径 -->
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://had03:8485;had04:8485;had05:8485/mycluster</value>
</property>

<!-- 指定journalnode日志文件存储的路径 -->
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/usr/local/tmp/journalnodelogs</value>
</property>
<!-- 设置故障转移的策略-->
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ssh主动防御-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>
<!--设置私钥的路径 -->
<!--hadoop用户-->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!--root用户-->
<!--<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property-->

配置yarn-site.xml

cd /usr/local/hadoop/etc/hadoop/
vim yarn-site.xml
<!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序 -->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!-- 配置Web Application Proxy安全代理(防止yarn被攻击) -->
<property>
	<name>yarn.web-proxy.address</name>
	<value>had02:8888</value>
</property>
<!-- 开启日志 -->
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
	<name>yarn.log-server.url</name>
	<value>http://had02:19888/jobhistory/logs</value>
</property>
<!-- 配置日志删除时间为7天,-1为禁用,单位为秒 -->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>
<!-- 修改日志目录 -->
<property>
	<name>yarn.nodemanager.remote-app-log-dir</name>
	<value>/usr/local/tmp/hadooplogs</value>
</property>

<!--配置nodemanager可用的资源内存 
	<property>
		<name>yarn.nodemanager.resource.memory-mb</name>
		<value>2048</value>
	</property>
	配置nodemanager可用的资源CPU 
	<property>
		<name>yarn.nodemanager.resource.cpu-vcores</name>
		<value>2</value>
	</property> 
-->
<!-- //以下为YARN HA的配置// -->
<!-- 开启YARN HA -->
<property>
	<name>yarn.resourcemanager.ha.enabled</name>
	<value>true</value>
</property>
<!-- 启用自动故障转移 -->
<property>
	<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>
<!-- 指定YARN HA的名称 -->
<property>
	<name>yarn.resourcemanager.cluster-id</name>
	<value>yarncluster</value>
</property>
<!-- 指定两个resourcemanager的名称 -->
<property>
	<name>yarn.resourcemanager.ha.rm-ids</name>
	<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
	<name>yarn.resourcemanager.hostname.rm1</name>
	<value>had02</value>
</property>
<property>
	<name>yarn.resourcemanager.hostname.rm2</name>
	<value>had01</value>
</property>
<!-- 配置YARN的http端口 -->
<property>
	<name>yarn.resourcemanager.webapp.address.rm1</name>
	<value>had02:8088</value>
</property>	
<property>
	<name>yarn.resourcemanager.webapp.address.rm2</name>
	<value>had01:8088</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
	<name>yarn.resourcemanager.zk-address</name>
	<value>had03:2181,had04:2181,had05:2181</value>
</property>
<!-- 配置zookeeper的存储位置 -->
<property>
	<name>yarn.resourcemanager.zk-state-store.parent-path</name>
	<value>/usr/local/zookeeper/data/rmstore</value>
</property>
<!-- 开启yarn resourcemanager restart -->
<property>
	<name>yarn.resourcemanager.recovery.enabled</name>
	<value>true</value>
</property>
<!-- 配置resourcemanager的状态存储到zookeeper中 -->
<property>
	<name>yarn.resourcemanager.store.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 开启yarn nodemanager restart -->
<property>
	<name>yarn.nodemanager.recovery.enabled</name>
	<value>true</value>
</property>
<!-- 配置nodemanager IPC的通信端口 -->
<property>
	<name>yarn.nodemanager.address</name>
	<value>0.0.0.0:45454</value>
</property>

配置mapred-site.xml

cd /usr/local/hadoop/etc/hadoop/
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<!-- 指定MapReduce计算框架使用YARN -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

<!-- 指定jobhistory server的rpc地址 -->
<property>
	<name>mapreduce.jobhistory.address</name>
	<value>had01:10020</value>
</property>

<!-- 指定jobhistory server的http地址 -->
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
	<value>had01:19888</value>
</property>

<!-- 开启uber模式(针对小作业的优化) -->
<property>
	<name>mapreduce.job.ubertask.enable</name>
	<value>true</value>
</property>

<!-- 配置启动uber模式的最大map数 -->
<property>
	<name>mapreduce.job.ubertask.maxmaps</name>
	<value>9</value>
</property>

<!-- 配置启动uber模式的最大reduce数 -->
<property>
	<name>mapreduce.job.ubertask.maxreduces</name>
	<value>5</value>
</property>

编辑slaves

slaves 内容是datanode,nodemanager的主机名

had03
had04
had05

将hadoop文件夹,和/etc/profile环境配置文件分发到其它主机

scp -r /usr/local/hadoop/ had02:/usr/local/
scp -r /usr/local/hadoop/ had03:/usr/local/
scp -r /usr/local/hadoop/ had04:/usr/local/
scp -r /usr/local/hadoop/ had05:/usr/local/
scp -r /etc/profile had02:/etc/
scp -r /etc/profile had03:/etc/
scp -r /etc/profile had04:/etc/
scp -r /etc/profile had05:/etc/

在 had02 ~ had05主机上执行

source /etc/profile
搭建zookeeper集群

以下都是在had03主机上操作

安装zookeeper

tar -zxf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local/
# 为方便配置环境,将文件夹改名
cd /usr/local
mv apache-zookeeper-3.6.3-bin/ zookeeper

修改zookeeper的配置文件

cd /usr/local/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 内容如下
# 客户端心跳时间(毫秒)
tickTime=2000
# 允许心跳间隔的最大时间
initLimit=10
# 同步时限
syncLimit=5
# 数据存储目录
dataDir=/usr/local/zookeeper/data
# 数据日志存储目录
dataLogDir=/usr/local/tmp/zookeeperlogs
# 端口号
clientPort=2181
# 集群节点和服务端口配置
server.1=node202:2888:3888
server.2=node203:2888:3888
server.3=node204:2888:3888
# 以下为优化配置
# 服务器最大连接数,默认为10,改为0表示无限制
maxClientCnxns=0
# 快照数
autopurge.snapRetainCount=3
# 快照清理时间,默认为0
autopurge.purgeInterval=1

配置zookeeper环境变量

vim /etc/profile

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

将zookeeper文件夹和/etc/profile环境配置文件分发到had04,had05主机

scp -r /usr/local/zookeeper/ had04:/usr/local/
scp -r /usr/local/zookeeper/ had05:/usr/local/
scp -r /etc/profile had04:/etc/
scp -r /etc/profile had05:/etc/

在 had03 ~ had05主机上执行

mkdir /usr/local/zookeeper/data
touch /usr/local/zookeeper/data/myid
source /etc/profile

myid文件内容

分别对应着zoo.cfg文件的 server.x

had03 myid文件内容 1
had04 myid文件内容 2
had05 myid文件内容 3
创建所需文件夹

所有主机执行

mkdir /usr/local/hadoop/tmp
mkdir /usr/local/hadoop/data
mkdir /usr/local/tmp
mkdir /usr/local/tmp/journalnodelogs
mkdir /usr/local/tmp/hadooplogs

had03 ~ had05执行

mkdir /usr/local/tmp/zookeeperlogs

至此,所有配置完成,初始化启动即可
以上只有root用户可用,想使用其它用户,还需以下操作

其它用户操作hadoop

每个主机执行

创建hadoop用户和hadoop用户组,并设置hadoop用户密码

useradd hadoop
passwd hadoop

为hadoop用户添加sudo权限

vi /etc/sudoers

在root用户下面一行加上hadoop ALL=(ALL) ALL,保存并退出(这里需要用wq!强制保存退出)

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)    ALL
hadoop    ALL=(ALL)    ALL

将hadoop文件夹的主:组设置成hadoop,/usr目录与/usr/local目录所属主:组均为root,默认权限为755,也就是说其他用户(hadoop)没有写入(w)权限。在这里将hadoop用户加入root组,然后将文件夹权限设置为775

gpasswd -a hadoop root
chmod 775 /usr
chmod 775 /usr/local
chown -R hadoop:hadoop /usr/local/hadoop

将zookeeper文件夹的主:组设置成hadoop

chown -R hadoop:hadoop /usr/local/zookeeper

每个主机都要执行

登录到hadoop用户,配置SSH免密登录

su hadoop
cd /home/hadoop
ssh-keygen -t rsa

在had01主机上操作

ssh-copy-id localhost
scp ~/.ssh/* had02:~/.ssh
scp ~/.ssh/* had03:~/.ssh
scp ~/.ssh/* had04:~/.ssh
scp ~/.ssh/* had05:~/.ssh
hadoop集群初始化

hadoop用户进行hadoop初始化,必须先用root用户,对hadoop集群相关文件夹授权

chown -R hadoop:hadoop /usr/local/tmp/zookeeperlogs
chown -R hadoop:hadoop /usr/local/tmp/hadooplogs
chown -R hadoop:hadoop /usr/local/tmp/journalnodelogs

had03 ~ had05 启动zookeeper

zkServer.sh start

在had01上格式化ZKFC

hdfs zkfc -formatZK

启动journalnode(分别在had03、had04和had05上执行)

hadoop-daemon.sh start journalnode

格式化HDFS(在had01上执行)

hdfs namenode -format

将格式化后had01节点hadoop工作目录中的元数据目录复制到had02节点

scp -r /usr/local/hadoop/data/ had02:/usr/local/hadoop/

初始化完毕后可关闭journalnode,zookeeper(分别在had03、had04和had05上执行)

hadoop-daemon.sh stop journalnode
zkServer.sh stop
Hadoop集群的启动

启动zookeeper集群(分别在had03、had04和had05上执行)

zkServer.sh start

启动HDFS(在had01上执行)

start-dfs.sh

启动YARN(在had02上执行)

start-yarn.sh

启动YARN的另一个ResourceManager(在had01执行,用于容灾)

yarn-daemon.sh start resourcemanager

启动YARN的安全代理(在had02执行)

yarn-daemon.sh start proxyserver

备注:proxyserver充当防火墙的角色,可以提高访问集群的安全性

启动YARN的历史任务服务(在had01执行)

mr-jobhistory-daemon.sh start historyserver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop High Availability (HA) 集群是为了提高Apache Hadoop集群的可靠性和可用性而设计的一种架构。它通过将关键服务(如NameNode和JobTracker)冗余部署,并在主节点故障时自动切换到备用节点,保证了数据处理任务的持续进行。下面是Hadoop HA集群搭建的基本步骤: 1. **安装并配置Hadoop**: - 安装Hadoop到两个或更多节点上,每个节点都是一个独立的Hadoop集群实例。 - 配置`core-site.xml`和`hdfs-site.xml`文件,设置集群的名称节点(NameNode)和数据节点(DataNodes)。 2. **启用HDFS HA**: - 在`hdfs-site.xml`中,设置`ha.fencing.methods`指定节点之间的心跳检测方法,例如SSH或JMX。 - 创建一个HDFS HA配置文件,如`core-site.xml.template`,并在实际集群中创建对应的配置文件。 3. **配置高可用NameNode**: - 设置`ha.zookeeper.quorum`为ZooKeeper集群地址,用于选举新的Active NameNode。 - 配置`dfs.nameservice.id`定义NameNode服务名。 - 在`hdfs-site.xml`中启用`dfs.ha.namenodes.<nameservice-id>`属性。 4. **设置Secondary NameNode**: - 在`hdfs-site.xml`中启用`dfs.ha.automatic-failover.enabled`,并配置`dfs.ha.automatic-failover.retry-interval`和`dfs.ha.automatic-failover.timeout`。 5. **配置ZooKeeper**: - 如果没有使用ZooKeeper,需要配置一个或多个ZooKeeper服务器作为NameNode服务选举的协调器。 6. **启动HDFS服务**: - 启动HDFS集群,包括两个NameNode(一个为主,一个为备)和足够的DataNodes。 7. **验证集群状态**: 使用`hdfs haadmin`命令检查集群状态、启动/关闭心跳检测和手动触发Failover。 8. **配置YARN HA**: 对于YARN资源管理器,类似地,需要配置ResourceManager HA(RMHA),并设置HA模式。 9. **测试和监控**: 确保服务可用,执行负载测试,并设置监控工具(如Hadoop Metrics2或Ganglia)来监控性能和异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值