Hadoop的HA高可用环境搭建

Posted 甜_tian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop的HA高可用环境搭建相关的知识,希望对你有一定的参考价值。

目录

准备工作

jdk

zookeeper

Hadoop

搭建过程中遇到的问题:


准备工作

1)修改主机名(建议把主机名改成hdp-1,hdp-2的形式,方便后续配置环境)

//查看主机名
hostname  

//修改主机名
vim /etc/sysconfig/network  

2)修改ip对应主机名

vim /etc/hosts 

//这里配置上所有节点的IP和对应的主机名,如下
192.168.11  hdp-1
192.168.12  hdp-2
192.168.13  hdp-3

3)关闭防火墙

//centos 6

service iptables status //查看防火墙的状态
service iptables stop //关闭防火墙

//centos 7

firewall-cmd --state //查看防火墙的状态
systemctl stop firewalld.service //关闭防火墙

4)配置ssh免密登录

//在三台机器上分别运行

ssh-keygen -t rsa     

会在/root/.ssh目录下生成如下密钥

先在第一台机器上运行

cat id_rsa.pub >> authorized_keys

此时生成一个authorized_keys文件,将另外两台服务器的id_rsa.pub复制进这个文件中

使用scp命令,将authorized_keys文件复制到另外两台服务器同样的目录下

scp authorized_keys hdp-2:/root/.ssh/
scp authorized_keys hdp-3:/root/.ssh/

三台机器上都运行以下命令,设置权限

chmod 600 authorized_keys 

最后用ssh + 主机名,进行ssh免密登录

5)同步三台主机时间

date //查看时间是否一致
yum install ntpdate
ntpdate cn.pool.ntp.org

jdk

1)官网https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html下载 jdk-8u181-linux-x64.tar.gz

2)解压 tar -zxvf  jdk-8u181-linux-x64.tar.gz

3)创建Java目录

mkdir /usr/local/java

4)把解压后的文件放入Java文件下

5)配置环境变量

vim /etc/profile
    //修改如下
    export JAVA_HOME= /usr/local/jdk1.8.0_181
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile

6)java -version 检测

zookeeper

1)https://downloads.apache.org/zookeeper/stable/  官网下载安装包,解压,放入相应目录,步骤如上

2)修改 /zookeeper/conf下的配置文件

//复制一个配置文件出来
cp zoo_sample.cfg zoo.cfg 

//修改复制出来的配置
vim zoo.cfg 
    
    //配置如下
    dataDir=/home/hadoop/app/zookeeper-3.4.5/tmp
    server.1=hdp-1:2888:3888 
    server.2=hdp-2:2888:3888 
    server.3=hdp-3:2888:3888 

mkdir tmp 

//设置本台机器的myid,另外两台分别是2和3
echo 1 > /usr/local/zookeeper-3.4.5/tmp/myid 

3)将配置好的zookeeper拷贝到其他节点,修改 myid

4)在三台机器上分别启动zk

cd /zookeeper-3.4.5/bin/ 
./zkServer.sh start //启动
./zkServer.sh status  //查看状态

或者可以使用shell脚本在一台机器上启动所有zk

vim /etc/init.d/zookeeper  //编写zookeeper脚本

脚本如下: 

#zk路径
ZK_PATH=/opt/zookeeper/zookeeper-3.4.11/

#java路径
export JAVA_HOME=/opt/java/jdk1.8.0_221/

case $1 in

         start) sh  $ZK_PATH/bin/zkServer.sh start;;

         stop)  sh  $ZK_PATH/bin/zkServer.sh stop;;

         status) sh  $ZK_PATH/bin/zkServer.sh status;;

         restart) sh $ZK_PATH/bin/zkServer.sh restart;;

         *)  echo "require start|stop|status|restart"  ;;

esac

把脚本注册为Service

chkconfig --add zookeeper

增加权限

chmod +x /etc/init.d/zookeeper

就可以用 service zookeeper在一台机器上启动服务了

Hadoop

1)官网https://hadoop.apache.org/releases.html下载安装包,步骤如上

2)配置环境变量

vim /etc/profile
    export HADOOP_HOME=/root/apps/hadoop-2.9.1
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile
hadoop version  //检测是否配置成功

3)修改Hadoop路径下/etc/hadoop下的配置文件

修改core-site.xml

<configuration> 

<!-- 指定hdfs的namenode --> 
<property> 
<name>fs.defaultFS</name> 
<value>hdfs://hdp-1</value> 
</property> 

<!-- 指定hadoop运行时产生文件的存储路径 --> 
<property> 
<name>hadoop.tmp.dir</name> 
<value>/usr/local/hadoop/tmp/</value> 
</property> 

<!-- 指定zookeeper地址 --> 
<property> 
<name>ha.zookeeper.quorum</name> 
<value>hdp-1:2181,hdp-2:2181,hdp-3:2181</value> 
</property> 

</configuration> 

修改hdfs-site.xml

<configuration>

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

<!-- hdp-1下面有两个NameNode,分别是nn1,nn2,注意这里的名字不可以和nameserivice的一样--> 
<property> 
<name>dfs.ha.namenodes.hdp-1</name> 
<value>nn1,nn2</value> 
</property> 

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

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

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

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

<!-- 指定NameNode的共享edits元数据在JournalNode上的存放位置 --> 
<property> 
<name>dfs.namenode.shared.edits.dir</name> 
<value>qjournal://hdp-1:8485;hdp-2:8485;hdp-3:8485/hdp-1</value> 
</property> 

<!-- 指定JournalNode在本地磁盘存放数据的位置 --> 
<property> 
<name>dfs.journalnode.edits.dir</name> 
<value>/usr/local/hadoop/journaldata</value> 
</property> 

    <!-- 开启NameNode失败自动切换 --> 
<property> 
<name>dfs.ha.automatic-failover.enabled</name> 
<value>true</value> 
</property> 

<!-- 配置失败自动切换实现方式 --> 
<property> 
<name>dfs.client.failover.proxy.provider.hdp-1</name> 
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxy	Provider</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> 

<!-- 设置namenode存放的路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/name</value>
</property>

<!-- 设置hdfs副本数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

<!-- 设置datanode存放的路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data</value>
</property>

<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->   
<property>  
<name>dfs.webhdfs.enabled</name>  
<value>true</value>  
</property>  

</configuration> 

修改mapred-site.xml

<configuration> 

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

</configuration>     

修改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>hdp-1</value> 
</property> 
<property> 
<name>yarn.resourcemanager.hostname.rm2</name> 
<value>hdp-2</value> 
</property> 

<!-- 指定zk集群地址 --> 
<property> 
<name>yarn.resourcemanager.zk-address</name> 
<value>hdp-1:2181,hdp-2:2181,hdp-3:2181</value> 
</property> 

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

修改hadoop下的workers(3.0以前为slaves

hdp-1
hdp-2
hdp-3

配置好后均同步到其他服务器

4)启动

有两种方式,一种全部启动,另一种单独启动所需进程

第一种:

//第一次启动需要格式化namenode,后续不用格式化
hdfs namenode -format

start-all.sh  //全部启动

第二种:

//严格按照顺序
//手动启动journalnode
cd /usr/local/hadoop
sbin/hadoop-daemon.sh start journalnode

//格式化namenode:
hdfs namenode -format

//格式化ZKFC:
hdfs zkfc -formatZK

//启动HDFS:
sbin/start-dfs.sh

//启动YARN:
sbin/start-yarn.sh

至此,Hadoop的HA配置完毕!

搭建过程中遇到的问题:

Hadoop启动时的权限问题:

在hadoop/sbin目录下,start-dfs.sh和stop-dfs.sh文件,添加下列参数

HDFS_DATANODE_USER=root

HADOOP_SECURE_DN_USER=hdfs

HDFS_NAMENODE_USER=root

HDFS_SECONDARYNAMENODE_USER=root

HDFS_JOURNALNODE_USER=root HDFS_ZKFC_USER=root

start-yarn.sh和stop-yarn.sh文件,添加下列参数:

YARN_RESOURCEMANAGER_USER=root

HADOOP_SECURE_DN_USER=yarn

YARN_NODEMANAGER_USER=root

JAVA_HOME配置好后,Hadoop启动仍报错,找不到java的问题:

在hadoop/etc/hadoop目录下,hadoop-env.sh添加

export JAVA_HOME = /usr/local/jdk1.8.0_181

以上操作完成后,均同步到其他服务器内!

 

以上是关于Hadoop的HA高可用环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop的HA高可用环境搭建

Hadoop的HA高可用环境搭建

Hadoop的HA高可用环境搭建

hadoop 集群HA高可用搭建以及问题解决方案

Hadoop HA高可用搭建流程

高可用 hadoop HA 搭建教程