大数据 HadoopHA集群搭建

使用三台虚拟机搭建集群

角色分配

在这里插入图片描述
在这里插入图片描述
ZKFC ZookeeperFailoverController 作为ZK集群的客户端 用来监控NN的状态信息 每个运行NN的节点上必须有运行一个ZKFC

Journal Node 日志节点 HDFS 集群高可用的一种解决方案:做两个NameNode的数据同步。当Active NN的命名空间有任何修改时,告知大部分JNS进程,Standby NN 去读取JNS中的信息,并一直监控edits log的变化,把变化应用于自己的命名空间。standby NN可以确保集群出错时,命名空间的状态已经完全同步了。

HDFS 高可用

  • zk集群搭建成,保证可以正常运行

配置主机名与IP的映射关系

[root@HadoopNodeX ~]# vi /etc/hosts
192.168.197.11 HadoopNode01
192.168.197.12 HadoopNode02
192.168.197.13 HadoopNode03

关闭防火墙

[root@HadoopNode01 ~]# service iptables stop
[root@HadoopNode01 ~]# chkconfig iptables off

同步时钟

网络同步 比较精确

[root@HadoopNodeX ~]# yum install ntpdate -y
[root@HadoopNodeX ~]# ntpdate 0.asia.pool.ntp.org

配置SSH免密登录

#  首先在每个节点上执行此语句  生成公私钥
[root@HadoopNode01 ~]# ssh-keygen -t rsa

#  在上面三个节点上执行完成后 再进行互相的公钥的复制
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode01
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode02
[root@HadoopNodeX ~]# ssh-copy-id HadoopNode03

配置Java 环境

  • 下载jdk1.8安装包 解压到相关目录 推荐usr目录
[root@HadoopNode01 ~]# vi .bashrc

export JAVA_HOME=/home/java/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin

安装Hadoop

  • 下载hadoop2.9.2安装包 直接解压到相关的位置 配置环境变量即可
[root@HadoopNode01 ~]# vi .bashrc
export HADOOP_HOME=/usr/hadoop/hadoop-2.9.2
export PATH=$PATH::$HADOOP_HOME/sbin:$HADOOP_HOME/bin

配置core-site.xml

  • 位置 : /home/hadoop/hadoop-2.9.2/etc/hadoop/core-site.xml
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!-- ${user.name} 提取当前的用户名 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/hadoop-2.9.2/hadoop-${user.name}</value>
</property>
<property>
  <name>fs.trash.interval</name>
  <value>1</value>
</property>
<!-- 设置 hadoop 的机架脚本 -->
<property>
  <name>net.topology.script.file.name</name>
  <value>/home/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh</value>
</property>

创建机架脚本

  • 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh
shell 脚本
给当前脚本添加执行权限   : chmod u+x /home/hadoop/hadoop-2.9.2/etc/hadoop/rack.sh
while [ $# -gt 0 ] ; do
	nodeArg=$1
	exec</home/hadoop/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

创建机架映射文件

  • 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/topology.data
  • 在zk配置中 如果是单机模式 写上host:post即可
192.168.197.11 /rack1
192.168.197.12 /rack1
192.168.197.13 /rack2

配置hdfs-site.xml

  • 位置 :/usr/hadoop/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
<!--设置zookeeper服务地址-->
<property> 
    <name>ha.zookeeper.quorum</name>
    <value>HadoopNode01:2181,HadoopNode02:2181,HadoopNode03:2181</value>
</property>
<!--解析core-site.xml中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的RPC通信地址-->
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>HadoopNode01:9000</value>
</property>
<!--nn2的RPC通信地址-->
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>HadoopNode02:9000</value>
</property>
<!--指定NameNode元数据在JournalNode上的储存位置-->
<property>
    <name>dfs.namenode.shared.edits.dir</name>   
    <value>
	qjournal://HadoopNode01:8485;HadoopNode02:8485;HadoopNode03:8485/mycluster
	</value>
</property>
<!--开启NameNode的故障自动切换-->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!--配置失败 自动切换实现方式-->
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--脑裂的解决方案-->
<!--配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>
<!--使用隔离机制需要ssh免密登录-->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

配置 mapred-site.xml (MR计算需要)

 <property>	 	        		
	  <name>mapreduce.framework.name</name>
	  <value>yarn</value>
  </property>

配置 yarn-site.xml (MR计算需要)

 <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
  </property>
     <!--指定resourcemanager所对应的节点--> 
      <!--建议 namenode 不要和 resourcemanager放置在同一个点--> 
  <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>HadoopNode02</value>
 </property>

配置slaves (datanode同时又是nodemanager)

HadoopNode01
HadoopNode02
HadoopNode03

启动

  • 第一次启动|重新格式化
# 删除克隆机之前的hadoop文件 清空务必执行
[root@HadoopNodeX ~]# rm -rf /home/hadoop/hadoop-2.9.2/hadoop-root/
[root@HadoopNodeX ~]# rm -rf /home/hadoop/hadoop-2.9.2/logs/

# 启动 ZK 集群 保证ZK 集群可用
[root@HadoopNodeX zookeeper-3.4.6]# ./bin/zkServer.sh start ./conf/zook.cfg


# 启动JN 在每一台节点上 等待一会(20-30S)再执行下一步
[root@HadoopNodeX  ~]# hadoop-daemon.sh start journalnode

# 在01主节点上执行主的namenode的格式化
[root@HadoopNode01 ~]# hdfs namenode -format
# 在01主节点上启动 namenode
[root@HadoopNode01 ~]# hadoop-daemon.sh start namenode

# 在02 备节点上初始化standby namenode 下载active namenode 的元数据
[root@HadoopNode02 ~]# hdfs namenode -bootstrapStandby 

# 在02 备节点上启动 namenode
[root@HadoopNode02 ~]# hadoop-daemon.sh start namenode

# 在01|02 任意节点上执行 此命令 只执行一次 格式化 zkfc
[root@HadoopNode02 ~]# hdfs zkfc -formatZK

# 在01 节点上启动zkfc   主备节点启动失效恢复的控制  从而实现主备切换
[root@HadoopNode01 ~]# hadoop-daemon.sh start zkfc

# 在02 节点上启动zkfc  
[root@HadoopNode02 ~]# hadoop-daemon.sh start zkfc

# 在所有节点上启动datanode

[root@HadoopNodeX ~]# hadoop-daemon.sh start datanode

日常维护

  • 任意节点启动|关闭即可
[root@HadoopNode01 zookeeper-3.4.6]# stop-dfs.sh
[root@HadoopNode01 zookeeper-3.4.6]# start-dfs.sh
  • 在集群环境下,yarn启动的命令,需要在resourcemanager所在的节点执行
 sbin/start-yarn.sh 
 sbin/stop-yarn.sh
发布了24 篇原创文章 · 获赞 1 · 访问量 513

猜你喜欢

转载自blog.csdn.net/Mr_YXX/article/details/104594555