1.配置HDFS HA (高可用)

前提条件

先搭建zk环境并启动:https://www.cnblogs.com/zhugq02/p/15759195.html

架构规划:

192.168.167.82 node2  nn\zk1\zkfc

192.168.167.83 node3  jn\zk2\dn

192.168.167.84 node4  jn\zk3\dn

192.168.167.85 node5  nn\jn\dn

一、环境初始化(所有节点)

1.关闭防火墙和iptables

systemctl stop firewalld && systemctl status firewalld
service iptables stop && service iptables status

2.同步时钟服务

ntpdate -u ntp.sjtu.edu.cn

3.免密码登录

两台namenode节点(node2\node5)互相免密设置

1>.先在node2执行
ssh-keygen -t rsa
ssh-copy-id -i node2
ssh-copy-id -i node5

2>.在node5上执行
ssh-keygen -t rsa
ssh-copy-id -i node2
ssh-copy-id -i node5

3>.完成后分别在node2和node5连接node2和node5验证免密设置是否成功
ssh node2
ssh node5

4.配置hosts文件

vi /etc/hosts
192.168.167.82 node2
192.168.167.83 node3
192.168.167.84 node4
192.168.167.85 node5

 二、软件部署

1.下载hadoop软件,并解压到/usr/local目录下

tar xf hadoop-2.10.0.tar.gz -C /usr/local/

2.下载java软件,并解压到/usr/local目录下

tar xf  jdk-8u231-linux-x64.tar.gz -C /usr/local/ && mv /usr/local/jdk-8u231-linux-x64 /usr/local/java_64

3.环境变量配置

#vi /etc/profile

export JAVA_HOME=/usr/local/java_64
export PATH=$PATH:$JAVA_HOME/bin

export HADOOP_HOME=/usr/local/hadoop-2.10.0
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使环境变量生效
# . /etc/profile

4.配置文件配置

进入配置文件目录:
# cd /usr/local/hadoop-2.10.0/etc/hadoop/
# vi core-site.xml

<configuration>
<!--指定hdfs的命名空间-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://qf</value>
</property>

<property>
    <name>dfs.nameservices</name>
    <value>qf</value>
</property>

<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop</value>
</property>
<property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
</property>

<!--指定zk的集群地址,用来协调namenode服务-->
<property>
    <name>ha.zookeeper.quorum</name>
    <value>node2:2181,node3:2181,node4:2181</value>
</property>

</configuration>

==========================================================================================
# vi hdfs-site.xml

<configuration>

<!--副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>

<!--块大小-->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>

<!--hdfs元数据存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/name</value>
</property>

<!--hdfs数据存储的位置-->
<property>
<name>dfs.datanode.name.dir</name>
<value>/opt/hadoop/data</value>
</property>

<!--指定hdfs的虚拟服务名-->
<property>
    <name>dfs.nameservices</name>
    <value>qf</value>
</property>

<!--指定hdfs虚拟服务名下的namenode的名字-->
<property>
    <name>dfs.ha.namenodes.qf</name>
    <value>node2,node5</value>
</property>

<!--指定namenode的内部通信地址-->
<property>
    <name>dfs.namenode.rpc-address.qf.node2</name>
    <value>node2:9000</value>
</property>

<property>
    <name>dfs.namenode.rpc-address.qf.node5</name>
    <value>node5:9000</value>
</property>

<!--指定namenode的web ui通信地址-->
<property>
    <name>dfs.namenode.http-address.qf.node2</name>
    <value>node2:50070</value>
</property>

<property>
    <name>dfs.namenode.http-address.qf.node5</name>
    <value>node5:50070</value>
</property>

<!--指定jouranlnode数据共享目录-->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://node3:8485;node4:8485;node5:8485/qf</value>
</property>

<!--指定jouranlnode本地共享目录-->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/journaldata</value>
</property>

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

<!--指定namenode失败进行自动切换的主类-->
<property>
    <name>dfs.client.failover.proxy.provider.qf</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!--防止多个namenode同active(脑裂),采用某种方式杀死其中一个-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>

<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>

</configuration>

=============================================================================================
vi yarn-site.xml

<configuration>
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
 </property>
# 该cluster-id不能与nameService相同
 <property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>qf1521</value>
 </property>
#指定2台Resource Manager (即Name Node )节点
 <property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>node2,node5</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.node2</name>
   <value>node2</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.node5</name>
   <value>node5</value>
 </property>
#指定zookeeper 节点
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>node2:2181,node3:2181,node4:2181</value>
 </property>

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

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

# mv  mapred-site.xml.template   mapred-site.xml
# vi mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5.配置hadoop启停脚本文件用户

1>. 在start-dfs.sh和stop-dfs.sh中头部加入如下代码:

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

2>. 在start-yarn.sh和stop-yarn.sh中头部加入如下代码:

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=root
YARN_NODEMANAGER_USER=root

6.启停应用服务

1>.启动journalnode

在node3\node4\node5启动journalnode服务,分别执行以下命令
hadoop-daemon.sh start journalnode

执行jps查看journalnode是否启动

2>.初始化namenode和zkfc并启动

在node2上执行如下命令:
hdfs namenode -format(首次启动执行)
hadoop-daemon.sh start namenode
hdfs zkfc -formatZK(首次启动执行)
hadoop-daemon.sh start zkfc
start-dfs.sh

在node5上执行如下命令:
hdfs namenode -bootstrapStandby(首次启动执行)
hadoop-daemon.sh start namenode
hadoop-daemon.sh start zkfc

注:Hadoop在执行start-dfs.sh 命令出现,“Error:JAVA_HOME is not set and could not be found ”这一错误提出解决办法。

vi /usr/local/hadoop-2.10.0/etc/hadoop/hadoop-env.sh
将语句      export JAVA_HOME=$JAVA_HOME     

修改为      export JAVA_HOME=/usr/local/java_64

保存后退出。

再次输入start-dfs.sh启动hadoop。

3>.测试

在浏览器地址栏输入 http://192.168.167.82:50070和http://192.168.167.85:50070查看谁是active谁是standby

 

我的机器是node2为active,node5为standby

所以在node2上杀死namenode进行,查看node5状态是否变为active

注:问题:hadoop HA自动切换不成功
配置好之后杀掉active的namenode,另一台服务器并没有变为active
解决办法:在nn节点上分别安装psmisc并重启服务器

# yum install psmisc 

7.使用Yarn来调度HDFS

1>.  先所有的Hadoop相关进程

# stop-dfs.sh

2>.  启动 yarn

单独启动yarn使用命令:
 # start-yarn.sh
 # stop-yarn.sh
启动所有Hadoop相关进程使用命令
# start-all.sh
#启动完成以后,另一台NameNode需要手动启动yarn
# start-yarn.sh

8. 访问 yarn

访问yarn的端口 http://node2:8088  http://node5:8088  可以看到:

posted @ 2022-01-03 17:49  zhuguoqing  阅读(219)  评论(0编辑  收藏  举报