Hadoop HA集群的搭建

序言

准备五台虚拟机

hostname IP
master1 192.168. 2.66
master2 192.168.2.67
slave1 192.168.2.68
slave2 192.168.2.69
slave3 192.168.2.70

说明一下:用的什么用户安装hadoop,那这个用户就是hadoop的超级用户,本人直接用的root用户,如果朋友们想用其他的用户也可以自行创建

1、JDK的安装

搭建Hadoop HA,那么我们就先从安装JDK开始,如果朋友们没有资源,文章后面会有资源链接

1.1用xftp将jdk上传到master1当中,并解压jdk

解压命令为:
tar -zxvf jdk-8u191-linux-x64.tar.gz
我这里安装的路径是/usr/Software/Java/jdk1.8.0_191

1.2编辑环境变量

vi /etc/profile
具体参照:
	2、环境变量的配置

1.3检查jdk环境变量是否配置成功
在终端输入

java
或者
 java -version
有结果则说明成功

2、环境变量的配置

#Hadoop
export HADOOP_HOME=/usr/Software/Hadoop/hadoop-2.7.3

#Java
export JAVA_HOME=/usr/Software/Java/jdk1.8.0_191
export JRE_HOME=${
    
    JAVA_HOME}/jre
export CLASSPATH=.:${
    
    JAVA_HOME}/lib:${
    
    JRE_HOME}/lib

#Zookeeper
export ZOOKEEPER_HOME=/usr/Software/ZooKeeper/zookeeper-3.4.13

export PATH=${
    
    JAVA_HOME}/bin:${
    
    HADOOP_HOME}/bin:${
    
    HADOOP_HOME}/sbin:${
    
    ZOOKEEPER_HOME}/bin:$PATH

在这里插入图片描述
配置完环境变量后需初始化

source profile

3、映射主机名与IP地址

3.1修改主机名(其它四台虚拟机也是要修改为对应的hostname)

vi /etc/hostname

在这里插入图片描述

3.2修改hosts文件(每台虚拟机都要配置)

vi /etc/hosts

在这里插入图片描述

3.3ping主机名

ping主机名检测是否映射成功
ping master2
ping slave1
...

4、分发配置信息到各个虚拟机

将上面配置好的jdk文件的信息分发到各个虚拟机

for ip in {
    
    1..3}; do scp -r /usr/Software root@slave${
    
    ip}:/usr/ ; done
for ip in {
    
    1..3}; do scp -r /etc/profile root@slave${
    
    ip}:/etc/ ; done
......

5、配置SSH无秘钥连接

5.1生成秘钥

在虚拟机上,生成公钥、私钥(每一台虚拟机都要,为了实现各个虚拟机之间免密码登录)

像这种多个虚拟机都需要进行的操作,可以直接用XShell的一个功能来实现: 工具–>发送键输入到所有会话

ssh-keygen -t rsa -P ''

输入该命令需要让你填写保存的路径,一般默认为
/root/.ssh/id_rsa
在.ssh目录下会生成id_rsa(私钥) ,id_rsa.pub(公钥)
authorized_keys(存放远程免密码登录的公钥)

5.2将虚拟机的公钥信息导入master1的authorized_keys中

cat .ssh/id_rsa.pub >> .ssh/authorized_keys // 先将本机的公钥信息导入

for ip in {
    
    1..3}; do cat root@slave${
    
    ip}:/root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys ; done

cat root@master2:/root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

5.3将配置好的authorized_keys分发到各个虚拟机

for ip in {
    
    1..3}; do scp /root/.ssh/authorized_keys root@slave${
    
    ip}:/root/.ssh/ ; done

scp /root/.ssh/authorized_keys root@master2:/root/.ssh/

6、同步虚拟机的时间

每台虚拟机上都需要同步时间

任选一个服务器时间同步即可

ntpdate 0.asia.pool.ntp.org

ntpdate 1.asia.pool.ntp.org

ntpdate 2.asia.pool.ntp.org

ntpdate 3.asia.pool.ntp.org

7、安装zookeeper(安装在slave结点)

7.1用Xftp工具上传到slave1中

7.2解压 tar -zxvf zookeeper-3.4.13.tar.gz

我安装的路径为: /usr/Software/ZooKeeper/zookeeper-3.4.13

7.3修改文件

进入安装的zookeeper的conf目录下将 zoo_sample.cfg 修改为 zoo.cfg,执行命令:mv zoo_sample.cfg zoo.cfg
并且修改该文件,如下
在这里插入图片描述

7.4将配置好的zookeeper分发到其它的slave节点

for ip in 2 3; do scp -r /usr/Software/ZooKeeper root@slave${
    
    ip}:/usr/Software/ ; done

注意7.3步骤的dataDir的路径,需要在/tmp/下创建zookeeper目录,并在 zookeeper目录下创建文件myid,slave2,slave3也是一样,内容为分别为1 2 3(注意:文件里面别留空格或者换行)
在这里插入图片描述
7.5可以验证一下zookeeper是否安装成功
在slave虚拟机上启动zookeeper

zkServer.sh start //前提是已经在profile加上环境变量

jps

如果显示有QuorumPeerMain进程,则说明配置成功

8、安装Hadoop

前面说过了,这里再说一下,用什么用户安装hadoop,那么这个用户就是hadoop的超级用户,其他用户进行操作是有限制的

8.1解压安装包

先安装在master1上,后面可以通过scp命令拷贝到其他主机

我这装的是hadoop-2.7.3版本,3.0版本以上的有些默认端口号好像改变了

解压路径为:/usr/Software/Hadoop/hadoop-2.7.3

解压命令:

tar -zxvf hadoop-2.7.3.tar.gz

8.2修改配置文件

这步是最为关键的,需要修改的文件有5个
core-site.xml

hdfs-site.xml

mapred-site.xml
(如果没有这个文件,将该目录下名称为mapred-site.xml.template改名为mapred-site.xml)

yarn-site.xml

slaves

直接上代码

8.2.1修改core_site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master</value>
  </property>

  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>

<!-- 指定hadoop临时目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/Software/Hadoop/hadoop-2.7.3/tmp</value>
  </property>

<!--指定可以在任何IP访问-->
  <property>
    <name>hadoop.proxyuser.hduser.hosts</name>
    <value>*</value>
  </property>

<!--指定所有用户可以访问-->
  <property>
    <name>hadoop.proxyuser.hduser.groups</name>
    <value>*</value>
  </property>

<!-- 指定zookeeper地址 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>slave1:2181,slave2:2181,slave3:2181</value>
  </property>
</configuration>

8.2.2修改hdfs-site.xml

<configuration>
	<property>
    	<name>dfs.block.size</name>
        <value>67108864</value>
    </property>
        <!--指定hdfs的nameservice为master,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>master</value>
    </property>

<!-- master下面有两个NameNode,分别是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.master</name>
        <value>nn1,nn2</value>
    </property>

<!-- nn1的RPC通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.master.nn1</name>
    <value>master1:9000</value>
  </property>

<!-- nn1的http通信地址 -->
  <property>
    <name>dfs.namenode.http-address.master.nn1</name>
    <value>master1:50070</value>
  </property>

<!-- nn2的RPC通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.master.nn2</name>
    <value>master2:9000</value>
  </property>

<!-- nn2的http通信地址 -->
  <property>
    <name>dfs.namenode.http-address.master.nn2</name>
    <value>master2:50070</value>
  </property>

<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://slave1:8485;slave2:8485;slave3:8485/master</value>
  </property>

<!-- 配置失败自动切换实现方式 -->
  <property>
    <name>dfs.client.failover.proxy.provider.master</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

<!-- 配置隔离机制 -->
  <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>

<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/Software/Hadoop/hadoop-2.7.3/journal</value>
  </property>

<!--指定支持高可用自动切换机制-->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>

<!--指定namenode名称空间的存储地址-->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/Software/Hadoop/hadoop-2.7.3/name</value>
  </property>

 <!--指定datanode数据存储地址-->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/Software/Hadoop/hadoop-2.7.3/data</value>
  </property>

<!--指定数据冗余份数-->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>

<!--指定可以通过web访问hdfs目录-->
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>

<!--保证数据恢复 -->
  <property>
    <name>dfs.journalnode.http-address</name>
    <value>0.0.0.0:8480</value>
  </property>

  <property>
    <name>dfs.journalnode.rpc-address</name>
    <value>0.0.0.0:8485</value>
  </property>

    <property>
           <name>ha.zookeeper.quorum</name>                     
           <value>slave1:2181,slave2:2181,slave3:2181</value>
    </property>
</configuration>

8.2.3修改mapred-site.xml

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

        <!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>master1:10020</value>
        </property>

        <!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>master1:19888</value>
        </property>

</configuration>

8.2.4修改yarn-site.xml

<configuration>
  <property>
     <name>yarn.log-aggregation-enable</name>
     <value>true</value>
  </property>

<!--在HDFS上聚合的日志最长保留多少秒。3-->
  <property>
     <name>yarn.log-aggregation.retain-seconds</name>
     <value>259200</value>
  </property>

<!--rm失联后重新链接的时间-->
  <property>
     <name>yarn.resourcemanager.connect.retry-interval.ms</name>
     <value>2000</value>
  </property>

<!--开启resource manager HA,默认为false-->
  <property>
     <name>yarn.resourcemanager.ha.enabled</name>
     <value>true</value>
  </property>

<!--配置resource manager -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>

  <property>
    <name>ha.zookeeper.quorum</name>
    <value>slave1:2181,slave2:2181,slave3:2181</value>
  </property>

<!--开启故障自动切换-->
  <property>
     <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
     <value>true</value>
  </property>

  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>master1</value>
  </property>

  <property>
     <name>yarn.resourcemanager.hostname.rm2</name>
     <value>master2</value>
  </property>

<!--在master1上配置rm1,在master2上需要改为rm2-->
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm1</value>
  </property>

<!--开启自动恢复功能-->
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>

<!--配置与zookeeper的连接地址-->
  <property>
    <name>yarn.resourcemanager.zk-state-store.address</name>
    <value>slave1:2181,slave2:2181,slave3:2181</value>
  </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>slave1:2181,slave2:2181,slave3:2181</value>
  </property>

  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>master-yarn</value>
  </property>

<!--schelduler失联等待连接时间-->
  <property>
    <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
    <value>5000</value>
  </property>

<!--配置rm1-->
  <property>
    <name>yarn.resourcemanager.address.rm1</name>
    <value>master1:8132</value>
  </property>

  <property>
    <name>yarn.resourcemanager.scheduler.address.rm1</name>
    <value>master1:8130</value>
  </property>

  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>master1:8188</value>
  </property>

  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
    <value>master1:8131</value>
  </property>

  <property>
    <name>yarn.resourcemanager.admin.address.rm1</name>
    <value>master1:8033</value>
  </property>

  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm1</name>
    <value>master1:23142</value>
  </property>

<!--配置rm2-->
  <property>
    <name>yarn.resourcemanager.address.rm2</name>
    <value>master2:8132</value>
  </property>

  <property>
    <name>yarn.resourcemanager.scheduler.address.rm2</name>
    <value>master2:8130</value>
  </property>

  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>master2:8188</value>
  </property>

  <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
    <value>master2:8131</value>
  </property>

  <property>
    <name>yarn.resourcemanager.admin.address.rm2</name>
    <value>master2:8033</value>
  </property>

  <property>
    <name>yarn.resourcemanager.ha.admin.address.rm2</name>
    <value>master2:23142</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/usr/Software/Hadoop/yarn/local</value>
  </property>

  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/usr/Software/Hadoop/yarn/logs</value>
  </property>

  <property>
    <name>mapreduce.shuffle.port</name>
    <value>23080</value>
  </property>

<!--故障处理类-->
  <property>
    <name>yarn.client.failover-proxy-provider</name>
    <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
  </property>

  <property>
      <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
      <value>/yarn-leader-election</value>
  </property>

</configuration>

有个地方一定要注意:将文件拷贝到master2后这个地方要改

<!--在master1上配置rm1,在master2上需要改为rm2-->
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm2</value>
  </property>

8.2.5修改slaves

提醒一下:hadoop3.0以后slaves更名为workers,
slaves是namenode节点识别datanode节点位置的一个文件。

在文件中加上这三个节点信息

slave1
slave2
slave3

8.2.6将hadoop文件分发到各个节点

for ip in 1 2 3; do scp -r /usr/Software/Hadoop root@slave${
    
    ip}:/usr/Software/ ; done

scp -r /usr/Software/Hadoop root@master2:/usr/Software/

9、初始化集群

9.1启动zookeeper
用XShell的工具同时将slave(1,2,3)节点的zookeeper启动

zkServer.sh start

9.2初始化master1

hdfs zkfc -formatZK

9.3启动journalnode
在slave节点上同时启动

hadoop-daemon.sh start journalnode

9.4格式化master1的namenode

hadoop namenode -format

9.5在master1中启动namenode

hadoop-daemon.sh start namenode

9.6在master2中启动下面命令

// 把备namenode节点的目录格式化并把元数据从主namenode节点拷贝过来,并且这个命令不会把journalnode目录再格式化了
hdfs namenode -bootstrapStandby
// 启动备用的namenode
hadoop-daemon.sh start namenode

9.7开启zkfc

//两个namenode节点都要开启
// 为了观测namenode是否处于工作状态
hadoop-daemon.sh start zkfc 

9.8启动datanode

hadoop-daemons.sh start datanode //在slave上启动

hadoop-daemons.sh start datanode //在master1中启动

hadoop-daemon.sh start datanode //也可以在slave上一个个启动

9.9启动yarn

start-yarn.sh // 两个namenode上都要启动

9.10查看状态
进入虚拟机中的网页,输入
http://master1:50070
http://master1:8188

有信息说明配置成功

10、启动集群

第二次启动不需要再进行初始化了,按照下面的步骤来即可

启动zookeeper

zkServer.sh start

启动journalnode

hadoop-daemon.sh start journalnode

启动主namenode

hadoop-daemon.sh start namenode

启动备用namenode

hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode

启动zkfc

hadoop-daemon.sh start zkfc

启动datanode

hadoop-daemons.sh start datanode

启动yarn

start-yarn.sh

再说明一个问题,如果能够启动datanode,但是jps中没有显示,那么可以尝试一下这个解决方案:
解决方法是删除datanode结点的current目录下的文件,重启datanode的时候会重新生成该文件。

11、hadoop资源

链接地址:hadoop资源,各种安装包

结尾

终于是写到结尾了,希望能够帮助到朋友们。如果文章有写的不对,欢迎大佬来指正,毕竟对知识的了解从修改bug中获得到的会更加深入。

下一篇:shell脚本快速启动Hadoop HA集群

猜你喜欢

转载自blog.csdn.net/qq_42599616/article/details/105621120