hadoop高可用安装实践

宿主机配置:
宿主机:小黑 T450
CPU   :I5
内存  :16G
系统  :Windows 10 家庭版 64位
虚拟机:
Oracle VM VirtualBox:
VirtualBox-5.1.30.18389-Win.exe
系统准备:
CentOS-7-x86_64-Minimal-1708.iso
CentOS-7-x86_64-DVD-1708.iso

Linux系统安装:

CentOS-7-x86_64-Minimal-1708.iso            #最简化安装,为了节省系统资源

下载DVD版本,目的是从当yum的软件源,对于需要的如:vim ssh net-tools 软件,需要挂在本地源,安装

CentOS-7-x86_64-DVD-1708.iso

一 :安装hadoop前系统环境配置:

1>挂载yum软件源:

第一步:光驱加载ISO文件:CentOS-7-x86_64-DVD-1708.iso

操作如下

第二步:CentOS系统挂载

linux外部存储一般都挂载在/mnt目录下,这里我先建一个容纳此光驱的文件夹  cdrom:

-->cd /mnt
-->mkdir cdrome

然后把此光驱挂载到此文件夹下: 

-->mount /dev/cdrom /mnt/cdrom        #/dev/cdrom是光驱的默认路径

第三步:配置yum软件包源(使用上一步我们挂载的本地源)

/etc/yum.repos.d/目录下

删除

CentOS-Base.repo

CentOS-Debuginfo.repo

-->cd /etc/yum.repos.d
-->rm -f CentOS-Base.repo
-->rm -f CentOS-Debuginfo.repo

编辑CentOS-Media.repo,把源路径指定为挂载源路径,并开启使用

-->vi CentOS-Media.repo

-->baseurl:file:///mnt/cdrom/         #指定本地资源挂载路径
     enabled=1                                  #开启

2>安装以下软件

vim             #功能强大的本文编辑器

net-tools    #查看网络状态软件,例如查看ifconfig命令等

ssh             #远程安全登录或文件上传下载

提示:如果不知道哪个命令是哪个软件包提供的,可以这样查看:

-->yum provides ifconfig(具体命令)
或者
-->yum whatprovides ifconfig(具体命令)

------------------------------------------------------------

-->yum -y  install vim
-->yum -y  install net-tools
-->yum -y  install openssh*           #表示安装源里openssh开头的软件全部安装

3>修改Linux系统主机名称: 

-->vim /etc/hostname
-->hadoop-ha-01

4>配置Linux系统主机上网

(1)网卡设置为桥连

(2)设置网卡参数

-->cd /etc/sysconfig/network-scripts/    
-->ls                                                                      #查找ifcfg-eth*
-->vim ifcfg-eth3                                                  #打开文件编辑
-->onboot=yes                                                     #启用该网卡

(3)修改网关 

-->vim /etc/sysconfig/network
 NETWORKING=yes
 HOSTNAME=hadoop-ha-01                                #配置永久主机名
 GATEWAY=192.168.1.21                                      #这里设置网关,也就是那个虚拟网卡的ip

(4)修改DNS 

-->vim /etc/resolv.conf 
nameserver 192.168.1.1                                        #增加一个域名服务器

(5)配置防火墙                                      #这里先直接关闭 

-->systemctl stop firewalld.service          #停止firewall
-->systemctl disable firewalld.service      #禁止firewall开机启动

(6)网络配置好后,重启网络
 

-->service network restart

然后重启Linux系统
-->reboot

--------------------------------------------------------------------------------

二:以上准备好后,我们开始这手搭建集群

hadoop-ha集群规划图

主机名称 IP 软件 运行进程
hadoop-ha-01 192.168.1.21 JDK、HADOOP NameNode、DFSZKFailoverController(zkfc)
hadoop-ha-02 192.168.1.22 JDK、HADOOP NameNode、DFSZKFailoverController(zkfc)
hadoop-ha-03 192.168.1.23 JDK、HADOOP ResourceManager
hadoop-ha-04 192.168.1.24 JDK、HADOOP ResourceManager
hadoop-ha-05 192.168.1.25 JDK、HADOOP、Zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
hadoop-ha-06 192.168.1.26 JDK、HADOOP、Zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
hadoop-ha-07 192.168.1.27 JDK、HADOOP、Zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

说明:

hdfs 文件高可用配置  主从NameNode  主机  hadoop-ha-01、hadoop-ha-02

yarn管理系统高可用配置  主从ResourceManager  主机  hadoop-ha-03、hadoop-ha-04

因为yarn管理系统NodeManager节点管理器本身就是管理 MR程序在hdfs文件系统的DataNode上执行的,所以把他们配置到一起配置在剩下三台机器上

根据集群设计图,需要7台系统,所以根据hadoop-ha-01镜像,在虚拟机下搭建7个系统

注意:每个系统搭建好后需要修改下主机名称和IP如设计图
 

1>我这里用hadoop-ha-01来管理集群,所以这里我配置01可以免密访问集群中所有机器

(1)配置ssh免密登陆

-->ssh-keygen                        #生成密钥
-->ls /root/.ssh                       #查看生成密钥文件
结果:
id_rsa                   #私钥
id_rsa.pub            #公钥
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器        
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub  [email protected]         #把公钥拷贝到远端服务器

2>以上全部用ip访问特别难记也难写,这里我在hosts文件里配置下,ip与主机名的关联关系 

--vim /etc/hosts
192.168.1.21  hadoop-ha-01
192.168.1.22  hadoop-ha-02
192.168.1.23  hadoop-ha-03
192.168.1.24  hadoop-ha-04
192.168.1.25  hadoop-ha-05
192.168.1.26  hadoop-ha-06
192.168.1.27  hadoop-ha-07

然后发送到集群每个机器上
scp /etc/hosts   [email protected]:/etc/host
scp /etc/hosts   [email protected]:/etc/host
scp /etc/hosts   [email protected]:/etc/host
scp /etc/hosts   [email protected]:/etc/host
scp /etc/hosts   [email protected]:/etc/host
scp /etc/hosts   [email protected]:/etc/host

2>安装集群用到软件包

jdk-8u162-linux-x64.tar.gz

hadoop-2.6.5.tar.gz

zookeeper-3.3.6.tar.gz

以上包我都在宿主机下载好了,怎么发送到虚拟机上呢?我使用了FileZilla工具来做这件事

我准备把软件全部安装到/usr/app目录下,所以集群里所有机器全部新建app目录(这个可以提前搞) 

-->mkdir /usr/app

3>解压jdk 并且发送的集群所有机器上 

-->tar -zxvf jdk-8u162-linux-x64.tar.gz

4>在hadoop-ha-05上解压 zookeeper-3.3.6.tar.gz 

-->tar -zxvf  zookeeper-3.3.6.tar.gz

配置zookeeper: 

-->cd /root/app/zookeeper-3.3.6/conf/
-->cp zoo_sample.cfg zoo.cfg
-->vim zoo.cfg
dataDir=/root/app/zookeeper-3.3.6/tmp
#在最后添加:
server.1=hadoop-ha-05:2888:3888
server.2=hadoop-ha-06:2888:3888
server.3=hadoop-ha-07:2888:3888
#保存退出

然后创建一个tmp文件夹 

-->mkdir /root/app/zookeeper-3.3.6/tmp

#根据zzo.cfg配置文件server.*  在集群上建myid文件 

-->echo 1 > /root/app/zookeeper-3.3.6/tmp/myid        #这个文件名必须事myid

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

-->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-06:/root/app/
-->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-07:/root/app/
            
            注意:修改hdp-ha-06、hdp-ha-07对应/hadoop-ha-/zookeeper-3.3.6/tmp/myid内容
            hdp-ha-06:
                echo 2 > /root/app/zookeeper-3.3.6/tmp/myid
            hdp-ha-07:
                echo 3 > /root/app/zookeeper-3.3.6/tmp/myid

5>安装hadoop               #先在hadoop-ha-01上

解压:
-->tar -zxvf hadoop-2.6.5.tar.gz

#hadoop配置   hadoo-env.sh 

 export JAVA_HOME=/usr/app/jdk1.8.0_162

#hadoop配置   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>/usr/app/hadoop-2.6.5/tmp</value>
                    </property>
                    
                    <!-- 指定zookeeper地址 -->
                    <property>
                        <name>ha.zookeeper.quorum</name>
                        <value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value>
                    </property>
                </configuration>

#hadoop配置   hdfs-site.xml
 

<configuration>
                    <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
                    <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>hadoop-ha-01:9000</value>
                    </property>
                    <!-- nn1的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn1</name>
                        <value>hadoop-ha-01:50070</value>
                    </property>
                    <!-- nn2的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.ns1.nn2</name>
                        <value>hadoop-ha-02:9000</value>
                    </property>
                    <!-- nn2的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn2</name>
                        <value>hadoop-ha-02:50070</value>
                    </property>
                    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                    <property>
                        <name>dfs.namenode.shared.edits.dir</name>
                        <value>qjournal://hadoop-ha-05:8485;hadoop-ha-06:8485;hadoop-ha-07:8485/ns1</value>
                    </property>
                    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                    <property>
                        <name>dfs.journalnode.edits.dir</name>
                        <value>/usr/app/hadoop-2.6.5/journaldata</value>
                    </property>
                    <!-- 开启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>
                        <value>/root/.ssh/id_rsa</value>
                    </property>
                    <!-- 配置sshfence隔离机制超时时间 -->
                    <property>
                        <name>dfs.ha.fencing.ssh.connect-timeout</name>
                        <value>30000</value>
                    </property>
                </configuration>

#hadoop配置   mapred-site.xml

<configuration>
                    <!-- 指定mr框架为yarn方式 -->
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>

#hadoop配置   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>
                        <!-- 分别指定RM的地址 -->
                        <property>
                           <name>yarn.resourcemanager.hostname.rm1</name>
                           <value>hadoop-ha-03</value>
                        </property>
                        <property>
                           <name>yarn.resourcemanager.hostname.rm2</name>
                           <value>hadoop-ha-04</value>
                        </property>
                        <!-- 指定zk集群地址 -->
                        <property>
                           <name>yarn.resourcemanager.zk-address</name>
                           <value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value>
                        </property>
                        <property>
                           <name>yarn.nodemanager.aux-services</name>
                           <value>mapreduce_shuffle</value>
                        </property>
                </configuration>

#hadoop配置   slaves
修改slaves(slaves是指定子节点的位置,因为要在hadoop-ha-01上启动HDFS、在hadoop-ha-03启动yarn,所以hadoop-ha-01上的slaves文件指定的是datanode的位置,hadoop-ha-03上的slaves文件指定的是nodemanager的位置) 

hadoop-ha-05
hadoop-ha-06
hadoop-ha-07

最后把hadoop安装目录拷贝到集群每个机器上

slaves理论上事需要修改的!及

hadoop-ha-01上启动hdfs,所以需要知道datanode的位置,所以把启动datanode的节点放入hadoop-ha-01机器的slaves文件里

hadoop-ha-03上启动yarn,所以需要知道nodemanager的位置,所以把启动nodemanager的节点让如hadoop-ha-03机器的slaves文件里
-----------------------------------------------------------------
三:配置环境变量:
 

-->vim /etc/profile
#jdk的集群所有机器都需要配
export JAVA_HOME=/usr/app/jdk1.8.0_162
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

#hadoop的集群所有机器都需要配
export HADOOP_HOME=/usr/app/hadoop-2.6.5
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH  #在jdk基础上改

#zookeeper只在05/06/07上配置
export ZOOKEEPER_HOME=/usr/app/zookeeper-3.3.6
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH   #在jdk基础上改

四:搭建完成后,开始启动          #需要注意启动顺序

 

#启动zookeeper集群(分别在hadoop-ha-05、hadoop-ha-06、hadoop-ha-上启动zk)
zkServer.sh start
#查看状态:一个leader,两个follower
zkServer.sh status

#启动journalnode(分别在在hadoop-ha-05、hadoop-ha-06、hadoop-ha-07上执行)
hadoop-daemon.sh start journalnode
#运行jps命令检验,hdp-ha-05、hdp-ha-06、hdp-ha-07上多了JournalNode进程

#格式化HDFS
#在hadoop-ha-01上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/app/hadoop-2.6.5/tmp,然后将/usr/app/hadoop-2.6.5/tmp拷贝到hadoop-ha-02的/usr/app/hadoop-2.6.5/下。
scp -r tmp/ hadoop-ha-02:/root/app/hadoop-2.6.5/

#格式化ZKFC(在hdp-ha-01上执行即可)
hdfs zkfc -formatZK
        
#启动HDFS(在hdp-ha-01上执行)
start-dfs.sh


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

start-yarn.sh

猜你喜欢

转载自my.oschina.net/u/3420885/blog/1637805