作者:穿越 -- 教程来源于网络,回归于网络
前置准备
1 分析
Hadoop 2.0 里的 HA实现方式。作为了解, 如下图:
图片来源于网络
HA(High Available):高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。
ZK(Zookeeper):用作NN的高活框架
ZKFC(ZooKeeper FailoverController):ZooKeeper故障切换控制器
NN(nameNode):
DN(dataNode):
JN(Journal Node):两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信
基于上图分析,我们最少需要4台虚机(node1,node2,node3,node4)
NN:选择node1,node2(真实环境nameNode不能和dataNode在同一台虚机,这里演示减少虚机,node2既做nameNode也当 dataNode)
ZKFC:只能选择nameNode所在的虚机
ZK:这里我们选择node1,node2,node3(由于zk的投票机制,只能是大于1的奇数)
DN:选择node2,node3,node4
JN:选择node2,node3,node4
| NN | ZKFC | ZK | DN | JN |
Node1 | 1 | 1 | 1 |
|
|
Node2 | 1 | 1 | 1 | 1 | 1 |
Node3 |
|
| 1 | 1 | 1 |
Node4 |
|
|
| 1 | 1 |
2 使用VMware 安装 centos7 虚机
目标4台(node1,node2,node3,node4)
安装一台
克隆 3台
VMware步骤
选择虚机 --> 右键-->管理-->克隆-->下一步-->虚拟机中的当前状态-->链接克隆
一个虚拟机的克隆就是原始虚拟机全部状态的一个拷贝,或者说一个镜像。克隆的过程并不影响原始虚拟机,克隆的操作一但完成,克隆的虚拟机就可以脱离原始虚拟机独立存在,而且在克隆的虚拟机中和原始虚拟机中的操作是相对独立的,不相互影响。克隆过程中,VMware会生成和原始虚拟机不同的MAC地址和UUID,这就允许克隆的虚拟机和原始虚拟机在同一网络中出现,并且不会产生任何冲突。
克隆的两种方式
1. 链接克隆
链接克隆需要和原始虚拟机共享同一虚拟磁盘文件,不能脱离原始虚拟机独立运行(依赖原始机的配置文件)。但采用共享磁盘文件却大大缩短了创建克隆虚拟机的时间,同时还节省了宝贵的物理磁盘空间。通过链接克隆,可以轻松的为不同的任务创建一个独立的虚拟机。
2. 完整克隆
完整克隆是和原始虚拟机完全独立的一个拷贝,它不和原始虚拟机共享任何资源。 可以脱离原始虚拟机独立使用。
这里我们使用连接克隆
3 修改主机名
# 永久性修改主机名为node1
[root@bogon ~]#hostnamectl set-hostname node1
# 查看主机状态
[root@bogon ~]# hostnamectl status
# 重启服务
[root@bogon ~]# systemctl restart systemd-hostnamed
4 修改 hosts文件
>vim etc/hosts
5 打通免密登录
#生成.ssh目录和公钥/私钥对。
#-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
#~/.ssh/id_dsa生成的路径和文件名
>ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
#192.168.122.130上的操作
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.130
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.131
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.132
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.133
#192.168.122.131上的操作
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.130
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.131
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.132
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.133
#192.168.122.132上的操作
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.130
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.131
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.132
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.133
#192.168.122.133上的操作
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.130
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.131
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.132
>ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.122.133
4个节点都要打通,包括自己打通自己的虚机
6 配置Java 安装路径
查找 java 路径
一般情况下我们会用whereis java 去找,可以按以下步骤来找:
1.>which java #定位到java的可执行路径
2.>ls -lrt /usr/bin/java
3.>ls -lrt /etc/alternatives/java
这样就知道jdk的真实安装路径:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
配置 java 环境变量
>vi /etc/profile
exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
保存退出后,使用source 刷新配置文件
>source /etc/profile
安装 jps 工具
>yum install -y java-1.8.0-openjdk-devel.x86_64
7 永久性关闭防火墙
Zookeeper和 Hadoop启动都会被防火墙拦截,这里我们永久性的关闭所有虚机的防火墙
>firewall-cmd --state # 查看防火墙状态
>systemctl stop firewalld.service # 停止防火墙
>systemctl disable firewalld.service# 禁止firewall开机启动
>systemctl status firewalld.service # 查看防火墙状态
如果不停止防火墙,NN 格式化会报错如下错误:
Zookeeper启动会报
>/opt/zookeeper-3.4.11/bin/zkServer.shstatus
ZooKeeper JMX enabled by default
Using config:/opt/zookeeper-3.4.11/bin/../conf/zoo.cfg
Errorcontacting service. It is probably not running.
Zookeeper 集群搭建
下载最新稳定版本
下载地址
http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.11/
上传到node1 虚机的 opt目录,解压
>tar –zxvf zookeeper-3.4.11
配置文件在conf文件夹中,将zoo_sample.cfg改名为zoo.cfg,并对其做响应修改
>cd conf
拷贝配置文件
>cp -a zoo_sample.cfg zoo.cfg
1 修改zk 配置文件
>vim zoo.cfg
1 新添如下内容
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
说明:
# server.A=B:C:D
# A是一个数字,表示这是第几号服务器
# B是当前服务器的ID或者主机名
# C是Follower服务器与Leader服务器交换信息的端口
# D是当Leader挂掉时,重新选举Leader所使用的端口
2 客户端连接ZK服务器的端口
clientPort=2181 这里使用默认不用修改
3 指定ZK数据的目录
说明:请自行创建后在此处指定
dataDir=/opt/zkDataDir
2 创建 zk 工作目录
>mkdir /opt/zkDataDir
3 创建 zk 工作目录下的myid文件
注意:接下来需要在各个ZK节点的 dataDir目录下建立myid文件,各个ZK节点的myid文件内容不同 !!!
>cd /opt/zkDataDir
新建一个 myid 文件
>vi myid
里面输入一行,1 (步骤1里 server.x的数字x)
4 拷贝到其他 zk 节点
拷贝zookeeper数据目录到node2和node3 上
>scp -r zkDataDir/ root@node2:/opt/
>scp -r zkDataDir/ root@node3:/opt/
拷贝 zookeeper 目录到 node2 和node3
>scp -r zookeeper-3.4.11 root@node2:/opt/
>scp -r zookeeper-3.4.11 root@node3:/opt/
编辑 node2的myid内容为2,编辑 node3的myid内容为3
5 修改环境变量
>vi /etc/profile
在文件最后,unset 前添加zookeeper路径
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.11
export PATH=$JAVA_HOME/bin:$PATH:$ZOOKEEPER_HOME/bin
使配置生效
>source /etc/profile
拷贝到 node2 和node3
>scp /etc/profile root@node2:/etc/
>scp /etc/profile root@node3:/etc/
分别切换到node2 和node3 执行一下source命令
>source /etc/profile
6 启动三个zookeeper
分别启动node1, node2, node3
>/opt/zookeeper-3.4.11/bin/zkServer.sh start
查看各个ZK的从属关系:
>/opt/zookeeper-3.4.11/bin/zkServer.shstatus
注意:
哪个ZK节点会成为leader是随机的,第一次实验时node1成为了leader,第二次实验时node2成为了leader!
此时,在各个节点都可以查看到ZK进程:QuorumPeerMain
>jps
7 Zookeeper 错误
1.>/opt/zookeeper-3.4.11/bin/zkServer.shstatus
ZooKeeper JMX enabled by default
Using config:/opt/zookeeper-3.4.11/bin/../conf/zoo.cfg
Errorcontacting service. It is probably not running.
查看网络上的解决问题
http://www.blogjava.net/hello-yun/archive/2012/05/03/377250.html
我遇到的问题
Zookeeper启动不起来,重新设置一个zookeeper的dataDir
Hadoop 伪集群搭建
这里演示使用2.9
下载地址
http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz
上传到node1 虚机的 opt目录,解压
>tar –zxvf Hadoop-2.9.0.tar.gz
配置HDFS
1 修改 hadoop-env.sh
修改 hadoop-env.sh 里的Java home
>cd /opt/hadoop-2.9.0/etc/hadoop/
>vim hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
改成 jdk 绝对目录路径
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64
说明:参照前置准备里的方法查看jdk真实的绝对路径
2 执行 bin/hadoop检查
>cd /opt/hadoop-2.9.0
>bin/hadoop
有帮助信息,说明hadoop 安装的没问题。
如果报错,请百度自行解决后在进行下一步。
3 修改 hdfs-site.xml
>vim hdfs-site.xml
新添如下内容
<!-- 起个 name node集群名:dtns -->
<property>
<name>dfs.nameservices</name>
<value>dtns</value>
</property>
<!-- dtns集群里的namenode名:nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.dtns</name>
<value>nn1,nn2</value>
</property>
<!-- dtns集群nn1的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.dtns.nn1</name>
<value>node1:8020</value>
</property>
<!-- dtns集群nn2的rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.dtns.nn2</name>
<value>node2:8020</value>
</property>
<!-- dtns集群nn1的http地址 -->
<property>
<name>dfs.namenode.http-address.dtns.nn1</name>
<value>node1:50070</value>
</property>
<!-- dtns集群nn2的http地址 -->
<property>
<name>dfs.namenode.http-address.dtns.nn2</name>
<value>node2:50070</value>
</property>
<!-- JN 的主机地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/dtns</value>
</property>
<!-- JN 工作目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/jn/data</value>
</property>
<!-- 固定的,客户端通过这个类找active namenode-->
<property>
<name>dfs.client.failover.proxy.provider.dtns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ssh 配置 -->
<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_dsa</value>
</property>
<!-- 开启自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
4 修改 core-site.xml
>vim core-site.xml
添加如下配置
<!-- NN 入口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://dtns</value>
</property>
<!-- zookeeper 地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<!-- hadoop 临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadooptmp</value>
</property>
5 修改 slaves 配置 DD 节点
>cd /opt/hadoop-2.9.0/etc/hadoop
>vi slaves
新添 DataNode 内容如下
node2
node3
node4
6 拷贝hadoop的所有配置文件到其他节点
node2,node3,node4虚机,上传解压Hadoop
拷贝node1的配置到node2,node3,node4
>cd /opt/hadoop-2.9.0/etc/hadoop
>scp ./* root@node2:/opt/hadoop-2.9.0/etc/hadoop/
>scp ./* root@node3:/opt/hadoop-2.9.0/etc/hadoop/
>scp ./* root@node4:/opt/hadoop-2.9.0/etc/hadoop/
7 启动三个 JN (journalnode)
node2,node3,node4三个节点分别执行下面的启动命令
>cd /opt/hadoop-2.9.0/sbin
>./hadoop-daemon.sh start journalnode
8 格式化其中一个 NN
在两个 NN中随便选一个格式化,我们这里选择第一个node1执行
格式化指令
>cd /opt/hadoop-2.9.0/bin
>./hdfs namenode –format
成功后会产生元数据文件
/opt/hadooptmp
9 把格式化的NN元数据拷贝到其他NN节点
启动刚刚格式化的NN
>cd /opt/hadoop-2.9.0/sbin
>./hadoop-daemon.sh start namenode
要确保没有报错信息
使用专有的指令拷贝到其他NN
在没有格式化的 NN 上执行这里是 node2
>cd /opt/hadoop-2.9.0/bin
>./hdfs namenode –bootstrapStandby
查看生成的元数据
cd/opt/hadooptmp/
启动其他NN
>cd /opt/hadoop-2.9.0/sbin
>./hadoop-daemon.sh start namenode
10 初始化 ZKFC
在其中一个NN的节点上初始化zkfc
>cd /opt/hadoop-2.9.0/bin
>./hdfs zkfc -formatZK
11 启动 Hadoop服务
全面停止 dfs
先全面停止上述节点的服务
>cd /opt/hadoop-2.9.0/sbin
>./stop-dfs.sh
全面启动 dfs
>cd /opt/hadoop-2.9.0/sbin
>./start-dfs.sh
以上 zkfc 没有启动.启动失败
停止所有HDFS服务
>./stop-dfs.sh
格式化 zkfc
>cd /opt/hadoop-2.9.0/bin
> ./hdfs zkfc –formatZK
在启动所有HDFS服务
>cd /opt/hadoop-2.9.0/sbin
>./start-dfs.sh
12 浏览器访问
访问NN1 http://192.168.122.130:50070
如图所示
访问NN2 http://192.168.122.131:50070
有上图可以看出,谁先抢到锁,谁就是活动状态
13 上传文件
>cd opt/hadoop-2.9.0/bin/
创建上传目录 -P 路径上的目录
>./hdfs dfs -mkdir -p /opt/input
上传一个文件
>./hdfs dfs -put /opt/jdk-8u151-linux-x64.tar.gz /opt/input
查看上传的文件
14 我遇到的错误
重启虚机后,启动hadoop集群 DFSZKFailoverController启动不起来
解决方法
重新初始化ZKFC
配置MR
1 生成 mapred-site.xml
>cd /opt/hadoop-2.9.0/etc/hadoop
>cp -a mapred-site.xml.templatemapred-site.xml
2 修改 mapred-site.xml
<!-- 固定配法,使用 yarn框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3 修改 yarn-site.xml
>vim yarn-site.xml
<!-- RM 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</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>
4 拷贝配置文件 到其他节点
>cd /opt/hadoop-2.9.0/etc/hadoop
>scp ./* root@node2:/opt/hadoop-2.9.0/etc/hadoop/
>scp ./* root@node3:/opt/hadoop-2.9.0/etc/hadoop/
>scp ./* root@node4:/opt/hadoop-2.9.0/etc/hadoop/
5 全面停止 all
>cd /opt/hadoop-2.9.0/sbin
>./stop-all.sh
6 全面启动 all
>./start-all.sh
7 查看进程
>jps
由上图可以看出 nameNode少了 DFSZKFailoverController进程
,重新初始化ZKFC