从零开始搭建本地虚拟机HadoopHA + HbaseHA 完全分布式集群【超详细】
从零开始搭建本地虚拟机HadoopHA + HbaseHA 完全分布式集群注:本人主机 8G 运行内存目录: 一.工具介绍 二.Hadoop HA 概述 三.集群规划 四.虚拟机准备 五.集群环境准备 六.SSH免密 七.安装JDK 八.搭建 Zookeeper 集群 九.搭建 Hadoop HA集群 十.HDFS HA 测试 ...
从零开始搭建本地虚拟机HadoopHA + HbaseHA 完全分布式集群
注:本人主机 8G 运行内存
多台服务器搭建 Hadoop HA + Hbase HA 完全分布式集群可参考:https://blog.csdn.net/qq_43616898/article/details/104674407
目录:
一.工具介绍
二.Hadoop HA 概述
三.集群规划
四.虚拟机准备
五.集群环境准备
六.SSH免密
七.安装JDK
八.搭建 Zookeeper 集群
九.搭建 Hadoop HA集群
十.HDFS HA 测试
十一.Yarn HA 测试
十二. 搭建 HBase HA集群
十三.Hbase HA 启动测试
十四.完结
一. 工具介绍
链接:https://pan.baidu.com/s/1rB8HoV2XD0cqeydpidK3hw
提取码:ce1y
SecureCRT: ssh 远程连接工具,类似于xshell
Filezilla: 文件上传工具,类似于xftp
VirtualBox: 和VMware 一样的虚拟机,因为VM比较耗内存,这里选择更加轻量一些的VirtualBox
centos7.ova: 准备好的虚拟电脑,直接导入即可
二. Hadoop HA 概述
1. Hadoop HA(High Availability 高可用) 概述:
同一个HDFS集群,运行两个互为主备的NameNode节点。一台Namenode为主节点,处于Active状态,一台NameNode为备节点,处于Standby状态。
其中只有Active NameNode对外提供读写服务,Standby NameNode会根据Active NameNode的状态变化,在必要时切换成Active状态,避免单点故障问题
2. Hadoop HA 架构图
ZKFC(ZookeeperFailoverController): ZKFC 与 NameNode 是一一对应, 是 NameNode的一个守护进程
作用: 负责和Zookeeper进行通常,并时刻检测NameNode 的健康状态
NameNode主备切换:
如果active 状态的NameNode 是健康的,zkfc 会与zookeeper 建立一个持久session, 并且active状态的NameNode 在Zookeeper 中记录了一个“锁”,这样可以防止其他NameNode 成为active 的NameNode
当active 状态的NameNode 出现状况时,zkfc 与Zookeeper 的持久会话就会丢失,同时zkfc 会通知Zookeeper 删除 “锁”,此时,其他的NameNode 会去抢夺"锁",切换到active 状态
防止脑裂(两个NameNode 同时对外提供服务):
为了防止脑裂的情况的发生,在stangby 状态的NameNode 切换之前,其对应的zkfc 会先向出状况的NameNode 远程发送自杀命令
三.集群规划
说明: 该集群所在虚拟主机桥接的无线网
主机名 | ip | 用户名 | 运行进程 | 安装软件 |
---|---|---|---|---|
hadoop01 | 192.168.1.5 | hadoop | NameNode、zkfc(DFSZKFailoverController) | jdk、hadoop |
hadoop02 | 192.168.1.6 | hadoop | NameNode、zkfc(DFSZKFailoverController) | jdk、hadoop |
hadoop03 | 192.168.1.7 | hadoop | ResourceManager 、HMaster | jdk、hadoop、hbase |
hadoop04 | 192.168.1.8 | hadoop | ResourceManager 、HMaster | jdk、hadoop、hbase |
hadoop05 | 192.168.1.11 | hadoop | DataNode、HRegionServer、NodeManager、JournalNode、QuorumPeerMain | jdk、hadoop、zookeeper、hbase |
hadoop06 | 192.168.1.12 | hadoop | DataNode、HRegionServer、NodeManager、JournalNode、QuorumPeerMain | jdk、hadoop、zookeeper、hbase |
hadoop07 | 192.168.1.13 | hadoop | DataNode、HRegionServer、NodeManager、JournalNode、QuorumPeerMain | jdk、hadoop、zookeeper、hbase |
Hdfs:
-
NameNode: 负责管理DataNode
-
DataNode: 用来存储上传到hdfs上的数据(数据会被切割成多个block,hdfs2.x 每一个block默认为128M)
-
zkfc: NameNode 的一个守护进程,负责监控NameNode健康状态,并于Zookeeper 通信
-
Journal: 负责 NameNode 间 edits(元数据操作日志) 的同步,依赖于Zookeeper 集群
一般与zookeeper部署在一起
Hbase:
-
HMaster: 不负责存储数据,管理regionServer 的运行状态,负责regionServer 的负载均衡
-
HRegionServer: 负责数据的存储,数据库中的数据会被分成多个Region, 最终数据会被存储到Hdfs上
一般与DataNode部署在一起
yarn:
-
ResourceManager: 负责调度 NodeManager
-
NodeManager: 为MapReduce 提供运算环境
一般与DataNode部署在一起
zookeeper:
- QuorumPeerMain: Zookeeper 主进程
四. 虚拟机准备
1. 安装 VirtualBox
因为 VMware 较为耗费内存,所以使用VirtualBox
直接点击下一步即可,别忘了选择安装目录
2. 配置VirtualBox
运行界面
设置虚拟电脑存储位置
【左上角】 管理–>全局设定–>常规–> 默认虚拟机位置
设置虚拟机与主机之间鼠标切换热键
【左上角】 管理–>全局设定–>热键–>虚拟电脑*
3. 导入虚拟电脑
【左上角】 管理–>导入虚拟电脑
1) 选中centos7.ova 文件所在
2) 修改虚拟电脑配置,并导入
- 因为 创建的虚拟电脑比较多,我这里选中分配512M 内存,根据自己情况而定
3) 网络配置
鼠标右键点击刚刚导入的虚拟电脑 设置—>网络—>网卡1—>桥接
4. 启动测试
双击虚拟电脑,或者点击虚拟电脑–>鼠标右键–>正常启动
用户: root 密码:123456
默认ip 为 192.168.1.4 【因为我的主机连接的是wifi】
5. 导入其他6台虚拟电脑
运行测试: 连开七台虚拟电脑,风扇在疯狂转动
6. 修改ip 地址
操作主机: hadoop01
vi /etc/sysconfig/network-scripts/ifcf-enp0s3
这是我主机无线局域网的网关,根据自己情况而定
GATEWAY="192.168.1.1"
保存退出,重启网络服务
systemctl restart network
网络测试:
7.以上述同样方法修改其他6台虚拟主机的ip
hadoop02 192.168.1.6
hadoop03 192.168.1.7
hadoop04 192.168.1.8
hadoop05 192.168.1.11
hadoop06 192.168.1.12
hadoop07 192.168.1.13
8. SecureCRT 远程连接
1) 解压
先创建一个文件夹SecureCRT,将压缩包中的内容解压到创建的文件夹即可
2)运行
点击运行即可
3)创建一个存储session 的目录
4) 创建连接
5) 七台主机ssh连接效果
6)secureCRT 输入中文,可能会有乱码
【菜单栏】 选项—> 会话选项
以后操作虚拟电脑就使用SeureCRT
五. 集群环境准备
1. 修改主机名
- 操作主机: hadoop01
vi /etc/hostname
wq #保存退出
- 退出root用户
exit
- 重新登录,主机名已经发生改变
2. 以上述方式修改其他六台虚拟电脑的主机的hostname
192.168.1.6 ---> hadoop02
192.168.1.7 ---> hadoop03
192.168.1.8 ---> hadoop04
192.168.1.11 --> hadoop05
192.168.1.12 --> hadoop06
192.168.1.13 --> hadoop07
3. 设置ip 映射
各个节点之间的远程登录是通过主机名进行登录
- 操作主机: hadoop01
vi /etc/hosts
192.168.1.5 hadoop01
192.168.1.6 hadoop02
192.168.1.7 hadoop03
192.168.1.8 hadoop04
192.168.1.11 hadoop05
192.168.1.12 hadoop06
192.168.1.13 hadoop07
- 网络测试:
4. 配置其他6台虚拟主机的ip映射
vi /etc/hosts
192.168.1.5 hadoop01
192.168.1.6 hadoop02
192.168.1.7 hadoop03
192.168.1.8 hadoop04
192.168.1.11 hadoop05
192.168.1.12 hadoop06
192.168.1.13 hadoop07
5. 创建hadoop 用户
以主机hadoop01 为例
6. 为其他6台虚拟主机创建 hadoop 用户
useradd hadoop
passwd hadoop
7. 为hadoop 用户赋予 root权限
以主机hadoop01 为例
vi /etc/sudoers
强制保存退出
wq!
8. 为其他6台虚拟主机的hadoop 用户赋予 root 权限
vi /etc/sudoers
#找到:
root ALL=(ALL) ALL
# 配置:用户名 ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
# 强制保存退出
wq!
以后登录只用 hadoop 用户
9. 目录结构
七台虚拟主机目录结构一样,提前创建好
10.文件上传
与secureCRT 一样,解压后,直接运行即可
将需要的文件上传到/home/hadoop/opt/install-package 目录下
注:
只上传到hadoop01 主机上即可,其他几台机子不用上传
六. SSH 免密
所有主机,以 hadoop 用户身份登录
1. 说明
Hdfs:
hdfs 启动时,NameNode1 首先启动成为 active 状态,它会远程登录NameNode2所在的主机,并启动NameNode2, 接着它会远程登录 DataNode 所在主机,并启动DataNode
所以: hadoop01 需要远程登录 hadoop02, hadoop05,hadoop06, hadoop07
hadoop02 需要远程登录 hadoop01, hadoop05,hadoop06, hadoop07 (主备切换时)
yarn:
yarn 启动时,ResourceManager1 会远程登录NodeManager所在的主机,并启动 NodeManager
但是 ResourceManager1 不会去启动 ResourceManager2(需要手动启动)
所以: hadoop03 需要远程登录 hadoop05,hadoop06, hadoop07
hadoop04 需要远程登录 hadoop05,hadoop06, hadoop07 (主备切换时)
Hbase:
Hbase 启动时,HMaster1 会远程登录HRegionServer 所在的主机,并启动 HRegionServer ,但是 HMaster1 不会去启动 HMaster2(需要手动启动)
所以: hadoop03 需要远程登录 hadoop05,hadoop06, hadoop07
hadoop04 需要远程登录 hadoop05,hadoop06, hadoop07 (主备切换时)
为了传输数据方便,这里将会把七台机器全都互相配置了免密登录(7x7=49 次)
再次强调,登录的是hadoop 用户
我为所有的 hadoop 用户建立的连接进行了重命名
2. 生成密钥
一路回车,不用输入密码
ssh-keygen -t rsa
家目录下会多出来一个 .ssh 文件
3. 分发公钥
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
ssh-copy-id hadoop04
ssh-copy-id hadoop05
ssh-copy-id hadoop06
ssh-copy-id hadoop07
4.免密ssh 远程登录测试
5. 为其他6台虚拟主机做以上相同操作
1) 生成密钥
2) 分发密钥
3)远程登录测试
七 安装JDK
1. 解压JDK
- 操作主机—hadoop01
cd /home/hadoop/opt/install-package/
tar -zxvf jdk-linux-8u211-x64.tar.gz -C ../jdk/
2. JDK 目录结构
3. 配置环境变量
sudo vi /etc/profile
文件末尾添加
export JAVA_HOME=/home/hadoop/opt/jdk/jdk1.8.0_211
export PATH=$PATH:$JAVA_HOME/bin
wq #保存退出
# 使配置生效
source /etc/profile
4. 将jdk 从 hadoop01 拷贝给其他六台机子
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop02:/home/hadoop/opt/install-package/
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop03:/home/hadoop/opt/install-package/
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop04:/home/hadoop/opt/install-package/
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop05:/home/hadoop/opt/install-package/
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop06:/home/hadoop/opt/install-package/
scp -r /home/hadoop/opt/install-package/jdk-linux-8u211-x64.tar.gz hadoop07:/home/hadoop/opt/install-package/
5.其他六台虚拟主机同样进行jdk 的配置
1) 解压jdk
2)配置jdk环境变量
八. 搭建 Zookeeper 集群
将zookeeper 分别部署在 hadoop05, hadoop06, hadoop07
1. 将zookeeper 压缩包从hadoop01 拷贝到 hadoop05
目录结构,之前我们已经提前建好了
- 操作主机: hadoop01
cd /home/hadoop/opt/install-package/
scp -r zookeeper-3.4.10.tar.gz hadoop05:/home/hadoop/opt/install-package/
2. 解压zookeeper
- 操作主机: hadoop05
cd /home/hadoop/opt/install-package/
tar -zxvf zookeeper-3.4.10.tar.gz -C ../zookeeper/
3. zookeeper 目录结构
4. 修改配置名
cd /home/hadoop/opt/zookeeper/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cfg
5. 修改配置文件
vi zoo.cfg
# 数据存放目录**
dataDir=/home/hadoop/opt/zookeeper/zookeeper-3.4.10/zkData
#server.id=主机名:2888:3888
#2888:3888 leader 选举的通信端口 id 号随意设置,必须要是唯一的
server.1=0.0.0.0:2888:3888
server.2=hadoop06:2888:3888
server.3=hadoop07:2888:3888
wq # 保存退出
6. 创建 zkData 目录
mkdir /home/hadoop/opt/zookeeper/zookeeper-3.4.10/zkData
7. 修改zookeeper 日志存放路径
cd /home/hadoop/opt/zookeeper/zookeeper-3.4.10/bin
vi zkEnv.sh
ZOO_LOG_DIR="/home/hadoop/opt/zookeeper/zookeeper-3.4.10/logs"
wq # 保存退出
8. 将配置好的zookeeper 发送给其他两台机器
scp -r /home/hadoop/opt/zookeeper/zookeeper-3.4.10 hadoop06:/home/hadoop/opt/zookeeper
scp -r /home/hadoop/opt/zookeeper/zookeeper-3.4.10 hadoop07:/home/hadoop/opt/zookeeper
9. 修改其他两台zookeeper节点的zoo.cfg 配置文件
- 操作主机: hadoop06
vi /home/hadoop/opt/zookeeper/zookeeper-3.4.10/conf/zoo.cfg
server.1=hadoop05:2888:3888
server.2=0.0.0.0:2888:3888
server.3=hadoop07:2888:3888
- 操作主机: hadoop07
vi /home/hadoop/opt/zookeeper/zookeeper-3.4.10/conf/zoo.cfg
server.1=hadoop05:2888:3888
server.2=hadoop06:2888:3888
server.3=0.0.0.0:2888:3888
10. 创建zookeeper 对应的id 文件
此id 就是我们上面配置的
- 操作主机: hadoop05
cd /home/hadoop/opt/zookeeper/zookeeper-3.4.10/zkData
echo 1 > myid
- 操作主机: hadoop06
cd /home/hadoop/opt/zookeeper/zookeeper-3.4.10/zkData
echo 2 > myid
- 操作主机: hadoop07
cd /home/hadoop/opt/zookeeper/zookeeper-3.4.10/zkData
echo 3 > myid
11. 配置环境变量–三台虚拟主机都要配置
sudo vi /etc/profile
文件末尾添加
export ZOOKEEPER_HOME=/home/hadoop/opt/zookeeper/zookeeper-3.4.10/
export PATH=$PATH:$ZOOKEEPER_HOME/bin
wq #保存退出
# 使配置生效
source /etc/profile
12. zookeeper 集群启动测试
- 集群启动
# hadoop05
zkServer.sh start
# hadoop06
zkServer.sh start
# hadoop07
zkServer.sh start
- 集群状态查看:
#hadoop05
zkServer.sh status
#hadoop06
zkServer.sh status
#hadoop07
zkServer.sh status
说明:
-
zookeeper 集群中的节点有两种身份: fllower 和 leader, 谁是fllower和谁是leader 不是固定的,是通过内部选举机制确定的
-
zookeeper 主进程: QuorumPeerMain
注意:
zookeeper 集群必须启动至少超过半数的节点,集群才能正常工作
- eg: 这里有三台节点,至少启动两台
13. 客户端连接测试
- 操作主机: hadoop05
zkCli.sh
# 查看帮助文档
help
# 退出客户端
quit
14. 关闭zookeeper 集群
- 操作主机: hadoop05
zkServer.sh stop
- 操作主机: hadoop06
zkServer.sh stop
- 操作主机: hadoop07
zkServer.sh stop
九 . 搭建Hadoop HA集群
1. 解压
- 操作主机: hadoop01
cd /home/hadoop/opt/install-package/
tar -zxvf hadoop-2.7.2.tar.gz -C ../hadoop/
2. 修改配置文件— hadoop-env.sh
cd /home/hadoop/opt/hadoop/hadoop-2.7.2/etc/hadoop
vi hadoop-env.sh
# 修改JAVA_HOME
export JAVA_HOME=/home/hadoop/opt/jdk/jdk1.8.0_211
wq # 保存退出
3. 修改配置文件—core-site.xml
替换原有的configuration 标签
vi core-site.xml
core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 (每一个nameservice 下有多个namenode) -->
<!-- 可能存在多个 nameserice, 访问的时候通过 nameserve的 名字访问 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop工作目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/opt/hadoop/hadoop-2.7.2/tmp</value>
</property>
<!-- 指定zookeeper地址 主机名:端口号-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value>
</property>
<!-- 客户端连接重试次数。 -->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
</property>
<!-- 两次重新建立连接之间的时间间隔,单位为毫秒。 -->
<property>
<name>ipc.client.connect.retry.interval</name>
<value>5000</value>
</property>
</configuration>
wq #保存退出
4. 修改配置文件—hdfs-site.xml
vi hdfs-site.xml
hdfs-site.xml
<configuration>
<!--生成副本数量: 我这里有三台 datanode, 生成3-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- JournalNode用来存放元数据,依赖于zookeeper -->
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop05:8485;hadoop06:8485;hadoop07:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放edits数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/opt/hadoop/hadoop-2.7.2/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 true: 开启-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式,使用的 hadoop 内部的类 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法-->
<!-- 配置防止脑裂的机制(即出现两个 namenode 同时对外提供服务的情况)-->
<!-- sshfence:远程登录杀死出现状况的 namenode-->
<!-- 如果远程ssh登录的端口号不是 22 sshfence(用户名:端口号) -->
<!-- shell: 远程登录超时等无响应的后续解决方案(自定义脚本)-->
<!-- shell(/bin/true): 因为没有定义脚本,返回true直接切换-->
<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>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 单位:ms 30000ms == 30s-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
wq # 保存退出
5. 修改配置文件— mapred-site.xml.template
- 修改配置名
mv mapred-site.xml.template mapred-site.xml
- 修改配置文件
vi mapred-site.xml
mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
wq # 保存退出
6. 修改配置文件—yarn-site.xml
vi yarn-site.xml
yarn-site.xml
<configuration>
<!-- 是否开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的集群id: 这里有两个 resourcemanager,设置一个组id(自定义)-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 设置resourcemanager分组下的 RM的名字(自定义) -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定RM1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop03</value>
</property>
<!-- 指定RM2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop04</value>
</property>
<!-- 指定zookeeper集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value>
</property>
<!-- reducer取数据的方式是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
wq # 保存退出
7. 修改配置文件—slaves
作用: slaves 主要用来指明从节点所在位置
-
Namenode读取slaves 获取 Datanode 所在主机的地址
-
Resourcemanager 读取 slaves 获取NodeManager 所在主机的地址
所以,slaves 该如何,配置要根据自己的实际情况而定,这里DataNode 和 NodeManager 都在同一台主机
vi slaves
把文件内之前存在的内容删除
hadoop05
hadoop06
hadoop07
wq # 保存退出
8. 将配置好的hadoop 分发给其他几台主机
cd /home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop02:/home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop03:/home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop04:/home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop05:/home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop06:/home/hadoop/opt/hadoop/
scp -r hadoop-2.7.2/ hadoop07:/home/hadoop/opt/hadoop/
9. 配置环境变量–七台机子都配置
说明: 配置环境变量只是为了方便执行hadoop 相关的命令,不配置也行,不过每次执行命令都要进入到bin目录
sudo vi /etc/profile
文件末尾添加
export HADOOP_HOME=/home/hadoop/opt/hadoop/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
wq #保存退出
# 使配置生效
source /etc/profile
十. HDFS HA 启动测试
务必严格按照下面顺序启动
1. 启动zookeeper 集群
-
操作主机: hadoop05, hadoop06, hadoop07
-
如果启动过了(能会报端口被占用的异常),确保 QuorumPeerMain 进程正常运行就行
# hadoop05
zkServer.sh start
# hadoop06
zkServer.sh start
# hadoop07
zkServer.sh start
集群状态查看:
# hadoop05
[hadoop@hadoop05 opt]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[hadoop@hadoop05 opt]$ jps
2310 Jps
2236 QuorumPeerMain
# hadoop06
[hadoop@hadoop06 hadoop]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
jps
Mode: leader
[hadoop@hadoop06 hadoop]$ jps
2256 Jps
2197 QuorumPeerMain
# hadoop07
[hadoop@hadoop07 hadoop]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/opt/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[hadoop@hadoop07 hadoop]$ jps
2185 QuorumPeerMain
2238 Jps
2. 启动journalNode
- 操作主机: hadoop05, hadoop06, hadoop07
只有hadoop集群第一次启动时需要该操作, 以后hdfs启动时journalNode会自动启动
# hadoop05
hadoop-daemon.sh start journalnode
# hadoop06
hadoop-daemon.sh start journalnode
# hadoop07
hadoop-daemon.sh start journalnode
集群状态查看:
# hadoop05
[hadoop@hadoop05 opt]$ hadoop-daemon.sh start journalnode
starting journalnode, logging to /home/hadoop/opt/hadoop/hadoop-2.7.2/logs/hadoop-hadoop-journalnode-hadoop05.out
[hadoop@hadoop05 opt]$ jps
2384 Jps
2236 QuorumPeerMain
2335 JournalNode
# hadoop06
[hadoop@hadoop06 hadoop]$ hadoop-daemon.sh start journalnode
starting journalnode, logging to /home/hadoop/opt/hadoop/hadoop-2.7.2/logs/hadoop-hadoop-journalnode-hadoop06.out
[hadoop@hadoop06 hadoop]$ jps
2197 QuorumPeerMain
2281 JournalNode
2330 Jps
# hadoop07
[hadoop@hadoop07 hadoop]$ hadoop-daemon.sh start journalnode
starting journalnode, logging to /home/hadoop/opt/hadoop/hadoop-2.7.2/logs/hadoop-hadoop-journalnode-hadoop07.out
[hadoop@hadoop07 hadoop]$ jps
2263 JournalNode
2312 Jps
2185 QuorumPeerMain
3. 格式化HDFS
- 操作主机: hadoop01
hdfs namenode -format
4. 将hadoop.tmp.dir配置生成的文件拷贝给另外一个NameNode
-
操作主机: cluster01
-
确保两个Namenode的初始fsimage 一致
cd /home/hadoop/opt/hadoop/hadoop-2.7.2
scp -r tmp hadoop02:/home/hadoop/opt/hadoop/hadoop-2.7.2/
5. 格式化 ZKFC
- 操作主机: cluster01
hdfs zkfc -formatZK
6. 启动HDFS
- 操作主机: cluster01
start-dfs.sh
7. 报错(如果你没有此错误可跳过)
现在集群已经起来了,因为hadoop01 的NameNode出现了状况, hadoop02 的NameNode变成了Active 状态,可以在主机浏览器输入 192.168.1.6:50070 查看,也可以在hadoop05,hadoop06,hadoop07,输入jps查看进程
集群已经启动,hadoop02, hadoop05,06,07 进程都无异常,但是hadoop01没有NameNode进程
1) 查看日志
cd /home/hadoop/opt/hadoop/hadoop-2.7.2/logs/
cat hadoop-hadoop-namenode-hadoop01.log
2) 日志上说,tmp 目录不存在,果然tmp 目录消失了(一脸懵逼)
3) 解决办法: 将tmp 目录从hadoop02拷贝一份给hadoop01
- 操作主机: hadoop02
[hadoop@hadoop02 hadoop-2.7.2]$ jps
2256 NameNode
2352 DFSZKFailoverController
2419 Jps
# 关闭集群
stop-dfs.sh
cd /home/hadoop/opt/hadoop/hadoop-2.7.2
scp -r tmp hadoop01:/home/hadoop/opt/hadoop/hadoop-2.7.2/
重新启动hdfs
- 操作主机: hadoop01
start-dfs.sh
集群状态查看:
# hadoop01
[hadoop@hadoop01 hadoop-2.7.2]$ jps
3411 Jps
3064 NameNode
3342 DFSZKFailoverController
# hadoop02
[hadoop@hadoop02 hadoop-2.7.2]$ jps
3010 Jps
2934 DFSZKFailoverController
2830 NameNode
# hadoop05
[hadoop@hadoop05 opt]$ jps
2756 JournalNode
2820 Jps
2663 DataNode
2236 QuorumPeerMain
# hadoop06
[hadoop@hadoop06 hadoop]$ jps
2197 QuorumPeerMain
2681 JournalNode
2745 Jps
2588 DataNode
# hadoop07
[hadoop@hadoop07 hadoop-2.7.2]$ jps
2712 JournalNode
2776 Jps
2185 QuorumPeerMain
2619 DataNode
所有进程成功启动
总结:集群出现问题,就找相对应的日志进行查看
8. http 访问
- 端口:50070
9. hdfs HA 测试
初始 hadoop01 NameNode 为Active, hadoop02 NameNode 为 standby
1) 操作: 关闭hadoop01 正在运行的 NameNode
- 操作主机:hadoop01
hadoop-daemon.sh stop namenode
2) 再次访问 NameNode1 已经无法访问了,NameNode2 成为了Active状态
3) 再次启动NameNode1
- 操作主机: hadoop01
hadoop-daemon.sh start namenode
再次访问,NameNode1 已经变为了standby 状态
说明: 两台NameNode, 同一时间只有一台为Active状态对外提供服务,另外一台为Standby,Active出问题,StandBy 就会变为Active 继续对外提供服务,排除了单点故障,实现了高可用(HA)
10. 文件上传测试
- 操作主机: hadoop01
操作: 创建一个文件上传到 Hdfs 上
cd /home/hadoop/opt/hadoop
mkdir my-test-data
cd my-test-data
echo hello > test.txt
[hadoop@hadoop01 my-test-data]$ cat test.txt
hello
将test.txt 上传到 fdfs 的根目录下 / 相当于 hdfs://hadoop01:9000/
hadoop fs -put test.txt /
找到处于active 状态的那台NameNode 进行查看
上传到hdfs 上的文件会被分成多个Block(自己设置的副本数量),每一个Block默认为128M(hadoop2.x)
其他命令
[hadoop@hadoop01 my-test-data]$ hadoop fs -help
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
十一.Yarn HA 启动测试
1. 启动Zookeeper 集群
之前已经启动过了
2.启动yarn
- 操作主机: hadoop03
start-yarn.sh start
因为ResourceManager1 不会去远程启动ResourceManager2, 需要我们手动启动
- 操作主机: hadoop04
yarn-daemon.sh start resourcemanager
集群状态查看:
# hadoo03
[hadoop@hadoop03 install-package]$ jps
2277 ResourceManager
2538 Jps
# hadoo04
[hadoop@hadoop04 install-package]$ jps
2344 Jps
2315 ResourceManager
# hadoo05
[hadoop@hadoop05 opt]$ jps
2937 NodeManager
2236 QuorumPeerMain
3036 Jps
# hadoo06
[hadoop@hadoop06 hadoop]$ jps
2962 Jps
2197 QuorumPeerMain
2863 NodeManager
# hadoo07
[hadoop@hadoop07 hadoop-2.7.2]$ jps
2993 Jps
2185 QuorumPeerMain
2893 NodeManager
3. http 访问
- 端口: 8088
4. yarn HA 测试
- 初始 hadoop03 ResourceManager为Active, hadoop04 ResourceManager为 standby
1) 操作: 关闭hadoop03 正在运行的 ResourceManager
- 操作主机:hadoop03
yarn-daemon.sh stop resourcemanager
2) 再次访问 ResourceManager1已经无法访问了,ResourceManager2成为了Active状态
3) 再次启动ResourceManager01
- 操作主机: hadoop03
yarn-daemon.sh start resourcemanager
[hadoop@hadoop03 install-package]$ jps
2736 Jps
2681 ResourceManager
- 再次访问,Resourcemanager1已经变为了standby 状态
5. MapReduce 测试
操作主机:hadoop03
cd /home/hadoop/opt/hadoop/hadoop-2.7.2/share/hadoop/mapreduce
求pi 的值 : 1个规模组,每个组内有1个计算样例
hadoop jar hadoop-mapreduce-examples-2.7.2.jar pi 1 1
说明:
-
该运算模型,规模越大,结果越精确, 我这里开的比较小,所以结果差的比较远
-
因为MapReduce 运算比较耗费内存,如果开的样例过大可能会报错
eg: Stack trace: ExitCodeException exitCode=1:
-
进行mapReduce 运算的主机 会产生一个 RunJar 的进程
6. 关闭 hdfs 和 yarn
至此,Hadoop HA 集群算是搭建完毕了
- 操作主机: hadoop01
stop-dfs.sh
- 操作主机: hadoop03
stop-yarn.sh
- 操作主机: hadoop04
yarn-daemon.sh stop resourcemanager
十二.搭建HBase HA 集群
说明: 这里将Hbase 部署在 hadoop03, hadoop04,本来Hbase 也是应该部署到另外两台主机上去的,但是我的主机资源有限,如果你的主机配置较好的的话,可以另外导入两台虚拟电脑,同样可以按照以下步骤进行操作
1. 将Hbase压缩包,从hadoop01 拷贝到 hadoop03
- 操作主机: hadoop01
cd /home/hadoop/opt/install-package
scp -r hbase-1.3.1-bin.tar.gz hadoop03:/home/hadoop/opt/install-package
2. 解压
- 操作主机:hadoop03
cd /home/hadoop/opt/install-package
tar -zxvf hbase-1.3.1-bin.tar.gz -C ../hbase/
3. 修改配置文件–hbase-env.sh
vi hbase-env.sh
1)修改JAVA_HOME
JAVA_HOME=/home/hadoop/opt/jdk/jdk1.8.0_211
2) 不使用hbase提供的zookeeper
export HBASE_MANAGES_ZK=false
3) 如果使用的是JDK8+ 需要注释掉以下两句
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
wq # 保存退出
4. 修改配置文件–hbase-site.xml
vi hbase-site.xml
hbase-site.xml
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value>
</property>
<!-- HMaster 与 HRegionServer 最大时间差 -->
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>
</configuration>
wq # 保存退出
5. 修改配置文件–regionservers
与hadoop 中的slaves 文件一样,这里用来指定RegionServer 所在主机的ip
vi regionservers
清除原有的内容
hadoop05
hadoop06
hadoop07
6. 指明 hadoop 信息
hbase 的分布式存储依赖于hadoop,上面通过hbase-site.xml 的
hbase.rootdir
属性指明了hbase在hdfs上的存储位置,但是hbase并不知道hadoop的访问路径,将hadoop 的 core-site.xml, hdfs-site.xml 拷贝一份放到hbase的conf目录下
- 操作主机: hadoop01
cd /home/hadoop/opt/hadoop/hadoop-2.7.2/etc/hadoop
scp -r core-site.xml hadoop03:/home/hadoop/opt/hbase/hbase-1.3.1/conf
scp -r hdfs-site.xml hadoop03:/home/hadoop/opt/hbase/hbase-1.3.1/conf
7. 将配置好的hbase 分发给其他几台主机
cd /home/hadoop/opt/hbase
scp -r hbase-1.3.1/ hadoop04:/home/hadoop/opt/hbase/
scp -r hbase-1.3.1/ hadoop05:/home/hadoop/opt/hbase/
scp -r hbase-1.3.1/ hadoop06:/home/hadoop/opt/hbase/
scp -r hbase-1.3.1/ hadoop07:/home/hadoop/opt/hbase/
8. 配置环境变量
- 五台机子都要配置
sudo vi /etc/profile
文件末尾添加
export HBASE_HOME=/home/hadoop/opt/hbase/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin
wq #保存退出
# 使配置生效
source /etc/profile
十三.Hbase HA 启动测试
1. 启动zookeeper
之前没有关闭就不用启动了
2. 启动hdfs
- 操作主机 hadoop01
start-dfs.sh
[hadoop@hadoop01 hadoop-2.7.2]$ jps
5764 DFSZKFailoverController
5837 Jps
5486 NameNode
3. 启动HMaster1
- 操作主机: hadoop03
start-hbase.sh
4. 启动HMaster2
- 操作主机: hadoop04
hbase-daemon.sh start master
集群状态查看:
# hadoop03
[hadoop@hadoop03 hbase]$ jps
3318 HMaster
3495 Jps
# hadoop04
[hadoop@hadoop04 bin]$ jps
2810 HMaster
2956 Jps
# hadoop05
[hadoop@hadoop05 zookeeper-3.4.10]$ jps
3761 QuorumPeerMain
4307 Jps
4039 JournalNode
3944 DataNode
4142 HRegionServer
# hadoop06
[hadoop@hadoop06 bin]$ jps
3795 HRegionServer
3415 QuorumPeerMain
3976 Jps
3690 JournalNode
3595 DataNode
# hadoop07
[hadoop@hadoop07 zookeeper-3.4.10]$ jps
3536 QuorumPeerMain
3827 JournalNode
3732 DataNode
3931 HRegionServer
4108 Jps
5. http 访问
- 端口号: 16010
6. hbase HA 测试
初始 hadoop03 HMaster为Active, hadoop04 HMaster为 Backup
1) 操作: 关闭hadoop03 正在运行的 HMaster
- 操作主机:hadoop03
hbase-daemon.sh stop master
[hadoop@hadoop03 hbase]$ jps
3713 Jps
2) 再次访问 HMaster1 已经无法访问了,HMaster2成为了Active状态
3) 重新启动HMaster1
- 操作主机: hadoop03
hbase-daemon.sh start master
[hadoop@hadoop03 hbase]$ jps
3833 Jps
3754 HMaster
- 此时 HMaster1 已经变为 Backup 状态, HMaster2 变为了 Active状态
7. 数据存储测试
- 操作主机: hadoop03
hbase shell
# 创建表 user, 有一个列族: info, 数据最多保持最近的三个版本
create 'user', {NAME => 'info', VERSIONS => '3'}
# 向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
# 获取user表中row key为rk0001的所有信息
get 'user', 'rk0001'
8. hdfs 上查看 hbase 存储的数据
十四. 完结
停止集群:停止HBase—>停止Hadoop —>停止ZooKeeper集群
启动集群:启动 ZooKeeper集群—>启动 Hadoop—>启动 HBase
大数据真心玩不起,刚刚搭建完集群,内存就用完了,java IDE 打开都成问题,更别说MapReduce 进行数据运算了,无奈~,不过好在,咱是搞javaEE的
# hadoop03
hbase-daemons.sh stop master
# hadoop04
stop-hbase.sh
hbase-daemons.sh stop regionserver
# hadoop01
stop-dfs.sh
# hadoop05
zkServer.sh stop
# hadoop06
zkServer.sh stop
# hadoop07
zkServer.sh stop
sudo shutdown -h now
【附录】
组件 | 节点 | 默认端口 | 配置 | 用途说明 |
---|---|---|---|---|
HDFS | DataNode | 50010 | dfs.datanode.address | datanode服务端口,用于数据传输 |
HDFS | DataNode | 50075 | dfs.datanode.http.address | http服务的端口 |
DFS | DataNode | 50475 | dfs.datanode.https.address | https服务的端口 |
HDFS | DataNode | 50020 | dfs.datanode.ipc.address | ipc服务的端口 |
HDFS | NameNode | 50070 | dfs.namenode.http-address | http服务的端口 |
HDFS | NameNode | 50470 | dfs.namenode.https-address | https服务的端口 |
HDFS | NameNode | 8020 | fs.defaultFS | 接收Client连接的RPC端口,用于获取文件系统metadata信息。 |
HDFS | journalnode | 8485 | dfs.journalnode.rpc-address | RPC服务 |
HDFS | journalnode | 8480 | dfs.journalnode.http-address | HTTP服务 |
HDFS | ZKFC | 8019 | dfs.ha.zkfc.port | ZooKeeper FailoverController,用于NN HA |
YARN | ResourceManager | 8032 | yarn.resourcemanager.address | RM的applications manager(ASM)端口 |
YARN | ResourceManager | 8030 | yarn.resourcemanager.scheduler.address | scheduler组件的IPC端口 |
YARN | ResourceManager | 8031 | yarn.resourcemanager.resource-tracker.address | IPC |
YARN | ResourceManager | 8033 | yarn.resourcemanager.admin.address | IPC |
YARN | ResourceManager | 8088 | yarn.resourcemanager.webapp.address | http服务端口 |
YARN | NodeManager | 8040 | yarn.nodemanager.localizer.address | localizer IPC |
YARN | NodeManager | 8042 | yarn.nodemanager.webapp.address | http服务端口 |
YARN | NodeManager | 8041 | yarn.nodemanager.address | NM中container manager的端口 |
YARN | JobHistory Server | 10020 | mapreduce.jobhistory.address | IPC |
YARN | JobHistory Server | 19888 | mapreduce.jobhistory.webapp.address | http服务端口 |
HBase | Master | 16000 | hbase.master.port | IPC |
HBase | Master | 16010 | hbase.master.info.port | http服务端口 |
HBase | RegionServer | 60020 | hbase.regionserver.port | IPC |
HBase | RegionServer | 60030 | hbase.regionserver.info.port | http服务端口 |
HBase | HQuorumPeer | 2181 | hbase.zookeeper.property.clientPort | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
HBase | HQuorumPeer | 2888 | hbase.zookeeper.peerport | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
HBase | HQuorumPeer | 3888 | hbase.zookeeper.leaderport | HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。 |
Hive | Metastore | 9083 | /etc/default/hive-metastore中export PORT=来更新默认端口 | |
Hive | HiveServer | 10000 | /etc/hive/conf/hive-env.sh中export HIVE_SERVER2_THRIFT_PORT=来更新默认端口 | |
ZooKeeper | Server | 2181 | /etc/zookeeper/conf/zoo.cfg中clientPort= | 对客户端提供服务的端口 |
ZooKeeper | Server | 2888 | /etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],标蓝部分 | follower用来连接到leader,只在leader上监听该端口。 |
ZooKeeper | Server | 3888 | /etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],标蓝部分 | 用于leader选举的。只在electionAlg是1,2或3(默认)时需要。 |
更多推荐
所有评论(0)