大数据配置hadoop(一)
- 搭建Hadoop的高可用模式
- 准备3台虚拟机:master,slave1,slave2
- 了解什么是高可用
什么的高可用
HA(High Available), 高可用,是保证业务连续性的有效解决方案, 通常通过设置备用节点的方式实现;
一般分为执行业务的称为活动节点(Active),和作为活动节点的一个备份的备用节点(Standby), 当活动节点出现问题, 导致正在运行的业务不能正常运行时, 备用节点此时就会侦测到, 并立即接替活动节点来执行业务, 从而实现业务的不中断或短暂中断.
NameNode HA
在 Active NN 和 Standby NN 之间设置一个共享的存储日志的地方, Active NN把 edit Log 写到这个共享的存储日志的地方, Standby NN 去读取日志然后执行,这样 Active 和 Standby NN 内存中的 HDFS 元数据保持着同步。一旦发生主从切换 Standby NN 可以尽快接管 Active NN 的工作
hadoop2.x 之后, Clouera 提出了 QJM/Qurom Journal Manager,这是一个基于 Paxos 算法(分布式一致性算法) 实现的 HDFS HA 方案,它给出了一种较好的解决思路和方案,QJM 主要优势如下:
不需要配置额外的高共享存储,降低了复杂度和维护成本。
消除 spof(单点故障)。
系统鲁棒性(Robust)的程度可配置、可扩展。
基本原理就是用 2N+1 台 JournalNode 存储 EditLog,每次写数据操作有>=N+1返回成功时即认为该次写成功,数据不会丢失了。
关闭防火墙
sudo systemectl stop firewalld 临时关闭
sudo systemectl disable firewalld 禁止防火墙自启
reboot 重启虚拟机
sudo systemctl staus firewalld 查看防火墙状态
获取ip地址
- 必须将每台的ip地址写入hosts文件,设置为静态ip地址
- 在每台输入命令ip a 找到虚拟机ip地址
将三台ip 输入/etc/hosts
(注:先将文件清空,否则hdfs开启时,会找不到主机)
3.设置主机名
vim /etc/hosts 打开hosts
主机ip 主机名1
主机ip 主机名2
主机ip 主机名3
(注:主机ip对应的主机名)
配置SSH为免密码登录
- 先下在ssh的压缩包。
yum install openssh*
- 修改配置文件
vim/etc/ssh/sshd_comfig 打开文件
将上图的PermitRootLogin,RSAAuthentication,PubkeyAuthentication的设置打开。
3. 启动ssh的服务:
systemctl start sshd.service 启动
sercvice sshd restart 重启
(注:每台虚拟机都要实行123步骤!)
4. 配置免密码登录
ssh-keygen -t rsa (私钥变公钥)
需要将每台机器的公钥复制到每台机器(下面命令,需要在每台机器上执行)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@主机名1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@主机名2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@主机名3
测试是否连接成功
ssh 主机名1
ssh 主机名2
ssh 主机名3
连接xshell和xftp将hadoop、JDK、Zookeeper导入到 主机名1 /home/中
** 解压haoop、jdk、zookeeper**
tar zxf hadoop-2.8.5.tar.gz -C /usr/local/src
tar zxf jdk-8u231-linux-x64.tar.gz -C /usr/local/src
tar zxf zookeeper-1.2.4.tar.gz -C /usr/local/src
重命名 hadoop 、jdk 、zookeeper
mv hadoop-2.8.5/ hadoop
mv jdk1.8.0_231/ java
mv zookeeper-1.2.4 /zookeeper
配置环境变量
vim /etc/profile 打开配置文件
PATH=$PATH:$HOME/bin
export HADOOP_HOME=/usr/local/src/hadoop
export SPARK_HOME=/usr/local/src/spark
export JAVA_HOME=/usr/local/src/jdk
export ZOOKEEPER_HOME=/usr/local/src/zookeeper
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
export PATH=$SPARK_HOME/bin:$PATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$ZOOKEEPER_HOME/bin:$PATH
更新环境
source /etc/profile
验证
hdfs
zkServer.sh
java -version
配置 Zookeepr
cd /usr/local/src/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
配置hadoop文件
cd /usr/local/src/hadoop/etc/hadoop 移动到这个目录下
- hadoop-env.sh (vim hadoop-env.sh)
export JAVA_HOME=/usr/local/src/java
- hdfs-site.xml (vim hdfs-site.xml)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns(逻辑名)下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>bigdata1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>bigdata1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>bigdata2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>bigdata2:50070</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata1:8485;bigdata2:8485;bigdata3:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/src/hadoop/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</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>
- core-site.xml (vim core-site.xml)
<configuration>
<!-- 指定hdfs的nameservice为ns-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/src/hadoop/data</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata1:2181,bigdata2:2181,bigdata3:2181</value>
</property>
</configuration>
- mapred-site.xml (vim mapred-site.xml)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata1:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/usr/local/src/hadoop/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/usr/local/src/hadoop/mr-history/done</value>
</property>
</configuration>
- yarn-site.xml (vim 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>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>salve1</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,salve1:2181,salve2:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
-
slave:配置所有的从节点的主机名 (vim slave)
主机名2
主机名3
复制Hadoop、Zookeeper、JDK、profile
cd /usr/local/src/
scp -r hadoop/ zookeeper/ jdk/ 主机名2:/usr/local/src/
scp -r hadoop/ zookeeper/ jdk/ 主机名1:/usr/local/src/
scp /etc/profile 主机名2:/etc/
scp /etc/profile 主机名1:/etc/
配置Zookeeper的myid
[root@主机名1 src]# mkdir zookeeper/data
[root@主机名1 src]# echo 1 > zookeeper/data/myid
[root@主机名1src]# ssh bigdata2
Last login: Sat Nov 2 13:58:05 2019 from 192.168.2.119
[root@主机名2 ~]# cd /usr/local/src/
[root@主机名2 src]# mkdir zookeeper/data
[root@主机名2src]# echo 2 > zookeeper/data/myid
[root@主机名2 src]# ssh bigdata3
Last login: Sat Nov 2 13:46:38 2019 from 192.168.2.119
[root@主机名3 ~]# cd /usr/local/src/
[root@主机名3 src]# mkdir zookeeper/data
[root@主机名3 src]# echo 3 > zookeeper/data/myid
[root@主机名3 src]# 登出
Connection to slave2 closed.
[root@bigdata2 src]# 登出
Connection to slave1 closed.
启动Zookeeper
[root@主机名1 src]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@主机名1 src]# ssh bigdata2
Last login: Sat Nov 2 14:31:36 2019 from master
[root@主机名2~]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@主机名2 ~]# ssh bigdata3
Last login: Sat Nov 2 14:32:40 2019 from slave1
[root@主机名2 ~]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@主机名3 ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@主机名3 ~]# 登出
Connection to slave2 closed.
[root@bigdata3 ~]# 登出
Connection to slave1 closed.
[root@bigdata1 src]#
启动所有的journalnode
每一个机子输入
hadoop-daemon.sh start journalnode
和上面的操作一样
格式化并启动两个namenode
主机一
hdfs namenode -format
hadoop-daemon.sh start namenode
主机二
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
格式化ZKFC(在主NameNode)格式化主机一
hdfs zkfc -formatZK
** 启动集群的HDFS和YARN(在主NameNode),并查看jps进程**
start-dfs.sh
start-yarn.sh
查结果
[root@主机一~]# jps
17408 JournalNode
18545 Jps
17526 NameNode
10410 QuorumPeerMain
18060 DFSZKFailoverController
18156 ResourceManager
18268 NodeManager
17789 DataNode
到这里 hadoop ha 已经配置完成,如果有不足的地方,请提出建议我会改正。谢谢!