ha集群的安装部署

HA的运作机制

(1)hadoop-ha集群运作机制介绍

所谓HA,即高可用(7*24小时不中断服务)

实现高可用最关键的是消除单点故障

hadoop-ha严格来说应该分成各个组件的HA机制

 

(2)HDFS的HA机制

通过双namenode消除单点故障

双namenode协调工作的要点:

    A、元数据管理方式需要改变:

        内存中各自保存一份元数据,Edits日志只能有一份,只有Active状态的namenode节点可以做写操作,两个namenode都可以读取         edits,共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)

    B、需要一个状态管理功能模块,实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在的        namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象        的发生


l  上述过程的图示:

wKiom1aJItCy5sgLAACTfk3sdTg876.png

集群部署节点角色的规划(10节点):

#

server01  namenode   zkfc    > start-dfs.sh     (192.168.0.193 H193)

server02  namenode   zkfc                                (192.168.0.194 H194)

server03  resourcemanager      >start-yarn.sh    (192.168.0.195 H195)

server04  resourcemanager                                   (192.168.0.196 H196)  

#做运算

server05  datanode   nodemanager                      (192.168.0.196 H197)  

server06  datanode   nodemanager                      (192.168.0.196 H198)  

server07  datanode   nodemanager                       (192.168.0.196 H199)  

 #做日志管理

server08  journal node      zookeeper        (192.168.0.200 H200)

server09  journal node      zookeeper        (192.168.0.201 H201)

server10  journal node      zookeeper        (192.168.0.202 H202)


1、环境准备

a/linux系统准备

 hostname配置主机名字

                vi /etc/sysconfig/network               

    执行命令 service network restart

 验证:  ifconfig


    hosts映射配置

               vi /etc/hosts


    ip地址配置

      vi /etc/sysconfig/network-scripts/ifcfg-eth0      

                    vi /etc/resolv.conf#需和ifcfg-eth0中的一样 从启会更新

                   rm -rf /etc/udev/rules.d/70-persistent-net.rules#删除从新启动机器从新生成mack和ifcfg-eht0一样否则会出问题

                   shutdown -r now   


    防火墙关闭                

   执行命令 service iptables stop

验证: service iptables status


init启动级别修改

    Linux系统有7个运行级别(runlevel)

    运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

    运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

    运行级别2:多用户状态(没有NFS)

    运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

    运行级别4:系统未使用,保留

    运行级别5:X11控制台,登陆后进入图形GUI模式

    运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

      vi /etc/inittab#修改为3即可


sudoers加入hadoop用户


    添加用户

        首先用adduser命令添加一个普通用户,命令如下:

        adduser hadoop//添加一个名为tommy的用户

        passwd hadoop//修改密码

        Changing password for user tommy.

        New UNIX password:     //在这里输入新密码

        Retype new UNIX password:  //再次输入新密码

        passwd: all authentication tokens updated successfully.

    赋予root权限

        修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:

        root    ALL=(ALL)     ALL

        hadoop ALL=(ALL)     ALL

        修改完毕,现在可以用hadoop帐号登录,然后用命令 su - ,即可获得root权限进行操作

    

                      1创建账户,命令 useradd 用户名,如:useradd zhangsan
                      2修改密码,命令 passwd 用户名,如:passwd zhangsan
                      3设置允许远程登录,linux一般都通过ssh远程连接,修改/etc/ssh/sshd_config文件
                      在结尾处添加 AllowUsers 用户名,如 AllowUsers zhangsan
                      保存,退出
                      4重启ssh服务,service sshd restart
                      5测试用新建的用户名远程连接测试。


2.ssh免密登陆配置

   ssh-keygen  -t  rsa (四个回车)

    执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

    

    将公钥拷贝到要免登陆的机器上

    ssh-copy-id 到某太服务器的IP或IP绑定的名称

    比如 ssh-copy-id 192.168.0.204或aaa


 3.java环境的配置

   上传jdk,解压,修改/etc/profile

 

 4./etc/zookeeper集群的部署

    分布式服务中指定哪些节点安装了zookeeper就在哪些节点进行配置

        server08  journal node      zookeeper        (192.168.0.200 H200)

        server09  journal node      zookeeper        (192.168.0.201 H201)

        server10  journal node      zookeeper        (192.168.0.202 H202)

  1. 上传zookeeper解压

  2. 修改zookeeper conf目录下的zoo_xx.cfg名字为zoo.cfg

    1. 修改数据目录dataDir=/opt/zookeeper-3.4.6/data

    2. 在该文件下加入

      server.1=H200:2888:3888

      server.2=H201:2888:3888

      server.3=H202:2888:3888

  3. 创建/opt/zookeeper-3.4.6/data目录

  4. 执行 echo 1 > data/myid指定该节点服务器的唯一标示ID

    集成几台zk就需要给每台zk创建myid并指定编号 1 2 3一次排下去

5.安装配置hadoop集群

5.1解压

    tar -zxvf hadoop-2.4.1.tar.gz -C /home/hadoop2


5.2配置HDFS(hadoop2.0所有的配置文件都在hadoop目录中的/etc/hadoop下)

    #将hadoop添加到环境变量中

    vim /etc/profile

    export JAVA_HOME=/opt/jdk1.7.0_55

    export HADOOP_HOME=/opt/hadoop-2.4.1

    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin    

    #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下

    cd /opt/hadoop-2.4.1/etc/hadoop


    5.2.1修改hadoo-env.sh

        export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55            

     5.2.2修改core-site.xml

            

              <configuration>
	               <!-- 指定hdfs的nameservice为ns1 -->
					<property>
						<name>fs.defaultFS</name>
						<value>hdfs://ns1/</value>
					</property>
					
					<!-- 指定hadoop临时目录 -->
					<property>
						<name>hadoop.tmp.dir</name>
						<value>/opt/hadoop-2.4.1/tmp</value>
					</property>
					
					<!-- 指定zookeeper地址 -->
					<property>
						<name>ha.zookeeper.quorum</name>
						<value>H200:2181,H201:2181,H202:2181</value>
					</property>
				</configuration>


解释这种用法但不在这次集群范围内

=======================================================================================================================

<property>
						<name>dfs.nameservices</name>
						<value>ns1</value>
					</property>
					或写成
					<property>
						<name>dfs.nameservices</name>
						<value>ns1,ns2</value>
					</property>

这里配置的值可以是单个或多个每一值管理了一组namenode节点,每一组nameNode存储的元数据不同但是dataNode存储的数据则是ns1和ns2共同使用, 比如你通过ns1存储的文件 通过ns2则是找不到的.如下图

wKiom1aKis6zV6hXAACRSrmjhYs013.png

=======================================================================================================================


    5.2.3修改hdfs-site.xml

<configuration>
	<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的	fs.defaultFS属性保持一致 -->
	<property>
		<name>dfs.nameservices</name>
		<value>ns1</value>
	</property>
	<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
	<property>
		<name>dfs.ha.namenodes.ns1</name>
		<value>nn1,nn2</value>
	</property>
	<!-- nn1的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.ns1.nn1</name>
		<value>H193:9000</value>
	</property>
	<!-- nn1的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.ns1.nn1</name>
		<value>H193:50070</value>
	</property>
	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.ns1.nn2</name>
		<value>H194:9000</value>
	</property>
	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.ns1.nn2</name>
		<value>H194:50070</value>
	</property>
	<!-- 指定NameNode的edit元数据在JournalNode上的存放位置 /ns1表示:ns1管理的一组nameNode共享在qjournal指定的目录下-->
	<property>
		<!--ns1下管理的一组namenode节点共享的Edit放在qjournal哪里-->
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://H200:8485;H201:8485;H202:8485/ns1</value>
	</property>
	<!-- 指定JournalNode在本地磁盘存放edit数据的位置 -->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/hadoop2/journaldata</value>
	</property>

	<!-- 配置zkfc:开启NameNode失败自动切换 -->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	<!-- 配置失败自动切换实现方式 -->
	<property>
		<name>dfs.client.failover.proxy.provider.ns1</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
			sshfence
			shell(/bin/true)
		</value>
	</property>
	<!-- 使用sshfence隔离机制时需要ssh免登陆(不然它怎么登陆那服务器进行切换呀) -->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<!--按说这是里/home/hadoop没错但是我的用户权限设置了但是还是没有权限所以我使用root用户-->
		<value>/home/hadoop/.ssh/id_rsa</value>
	</property>
	<!-- 配置sshfence隔离机制超时时间 -->
	<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>30000</value>
	</property>
</configuration>


5.2.4修改mapred-site.xml

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


5.2.5修改yarn-site.xml

<configuration>
	<!-- 开启RM高可用 服务器死掉是否自动切换到另一台 -->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<!-- 指定RM的cluster id -->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>yrc</value>
	</property>
	<!-- 指定RM的名字 -->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<!-- 分别指定rm1和rm2的地址 -->
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>H195</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>H196</value>
	</property>
	<!-- 指定zk集群地址 -->
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>H200:2181,H201:2181,H202:2181</value>
	</property>	
	<!--让nodeManager提供mapreduce的shuffle服务-->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
</configuration>


5.2.6修改slaves(slaves是指定子节点的位置,因为要在H193上启动HDFS、在H195启动yarn,所以H193上的slaves文件指定的是datanode的位置,H195上的slaves文件指定的是nodemanager的位置)

    H197

H198

H199

5.2.7配置免密码登陆

#首先要配置H193到H193---到H199的免密码登陆

#在H193上生产一对钥匙

ssh-keygen -t rsa

#将公钥拷贝到其他节点,包括自己

ssh-coyp-id H193到9


#配置H195H199的免密码登陆

#在H195上生产一对钥匙

ssh-keygen -t rsa

将公钥拷贝到其他节点

ssh-coyp-id H195到H199


#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置H194H193的免登陆

H194上生产一对钥匙

ssh-keygen -t rsa

ssh-coyp-id -i H193


5.3将配置好的hadoop拷贝到其他节点


###注意:严格按照下面的步骤

2.5启动zookeeper集群(分别在H200、H201、H202上启动zk)cd /opt/zookeeper-3.4.5/bin/

./zkServer.sh start

#查看状态:一个leader,两个follower

./zkServer.sh status


2.6手动启动journalnode(分别在在H200、H201、H202上执行)

sbin/hadoop-daemon.sh start journalnode

#运行jps命令检验,H200、H201、H202上多了JournalNode进程


2.7格式化HDFS

#在H193上执行命令:

hdfs namenode -format

#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件curent,这里我配置的是/weekend/hadoop-2.4.1/tmp,然后将/weekend/hadoop-2.4.1/tmp拷贝到H194的/weekend/hadoop-2.4.1/下。

scp -r tmp/ weekend02:/home/hadoop/app/hadoop-2.4.1/

##也可以这样,建议hdfs namenode -bootstrapStandby


2.8格式化ZKFC(在H193上执行即可) ZKFC让想知道两个namenode节点的状态和感知 是需要依赖于zk

所以zkfc需要向zk中注册一个根节点

/opt/hadoop2/bin 目录下

执行

hdfs zkfc -formatZK

格式化是 hdfs zkfc -formatZK  会在

./clCi.ch start 启动


  ls /查看 格式化后建立的节点,该节点是zk会用到这个节点的父节点


zk里面将来要用到的父节点建好 该节点记录主服务器的IP和名称

2.9启动HDFS(在H193上执行)

sbin/start-dfs.sh


出现代表成功

H194: namenode running as process 1597. Stop it first.
H193: starting namenode, logging to /opt/hadoop2/logs/hadoop-hadoop-namenode-H193.out
H197: datanode running as process 1521. Stop it first.
H198: datanode running as process 1521. Stop it first.
H199: datanode running as process 1528. Stop it first.
Starting journal nodes [H200 H201 H202]
H202: journalnode running as process 1604. Stop it first.
H201: journalnode running as process 1590. Stop it first.
H200: journalnode running as process 1772. Stop it first.
Starting ZK Failover Controllers on NN hosts [H193 H194]
H193: starting zkfc, logging to /opt/hadoop2/logs/hadoop-hadoop-zkfc-H193.out
H194: starting zkfc, logging to /opt/hadoop2/logs/hadoop-hadoop-zkfc-H194.out


可通过jps查看分布式服务器上启动了哪些分布式的进程



2.10启动YARN(#####注意#####:是在weekend03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)

sbin/start-yarn.sh 

需要手动启动分布式服务器上的start-yarn.sh 分别需要在H195 H196上手动启动.

注意:启动一台后 另一台使用

sbin/yarn-daemon.sh start resourcemanager

 

这样就可以了

启动分别启动本地resourceManger节点和关联的nodeManager节点 成功显示

starting yarn daemons
starting resourcemanager, logging to /opt/hadoop2/logs/yarn-hadoop-resourcemanager-H195.out
H198: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H198.out
H197: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H197.out
H199: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H199.out

到此,hadoop-2.4.1配置完毕,可以统计浏览器访问:

http://192.168.0.193:50070

NameNode  'H193:9000' (active)

http://192.168.0.194:50070

NameNode H194:9000' (standby)


完成...

测试集群

测试1:将从服务器kill掉 查看是否会实现主从切换

在194服务上执行kill -9 xx

然后刷新页面 

kill掉后从新启动执行

sbin/hadoop-daemon.sh start namenode


原理:

2985 NameNode

3461 Jps

3293 DFSZKFailoverController

当kill掉NameNode节点的时候

DFSZKFailoverController监控到状态会自动切换


http://192.168.0.193:50070/

wKiom1aQ6aSR_j8JAAA-mw-euCk109.png

http://192.168.0.194:50070/

wKioL1aQ6faToxlBAAA-XVLOg8s209.png


测试2:直接停掉服务器查看是否会主从切换从新启动

sbin/opt/hadoop2/hadoop-daemonsh start zkfc
sbin/opt/hadoop2/hadoop-daemonsh start namenode


测试3:在上传文件过程中 kill掉active 查看文件是否能上传成功


wKiom1aQ9lyyUlIgAAEaBMfqlq4913.png

wKioL1aQ9onBVcM6AAGWCa6eAG4654.png


测试集群工作状态的一些指令 :

bin/hdfs dfsadmin -report          查看hdfs的各节点状态信息

bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态

sbin/hadoop-daemon.sh start namenode       单独启动一个namenode进程

./hadoop-daemon.sh start zkfc           单独启动一个zkfc进程

本文出自 “为了手指那个方向” 博客,谢绝转载!

你可能感兴趣的:(it)