# Hadoop HBase ZooKeeper分布式集群环境搭建 |
---|
## 一、环境说明 |
#### 1.1 主机情况 |
集群环境至少需要3个节点(也就是3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面举例说明,配置节点IP分配如下: |
四个节点均使用CentOS 7.6系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoop、hbase、zookeeper目录结构。 |
注1: 可以通过编辑/etc/sysconfig/network文件来修改 hostname 。 |
master01 |
```shell |
[root@master01 ~]# cat /etc/sysconfig/network |
# Created by anaconda |
HOSTNAME=master01 |
[root@master01 ~]# |
``` |
slave01,slave02,slave03同理修改为各自的hostname |
```shell |
[root@slave01 ~]# cat /etc/sysconfig/network |
# Created by anaconda |
HOSTNAME=slave01 |
[root@slave01 ~]# |
``` |
注2: 也可以通过编辑/etc/hostname文件来修改 hostname 。 |
```shell |
[root@master01 ~]# cat /etc/hostname |
master01 |
[root@master01 ~]# |
``` |
slave01 |
```shell |
[root@slave01 ~]# cat /etc/hostname |
slave01 |
[root@master01 ~]# |
``` |
#### 1.2 关闭防火墙 |
首先需要检查和关闭防火墙: |
1. 关闭防火墙。在hadoop集群环境(linux系统)中最好关闭防火墙,不然会出现很多问题,例如namenode找不到datanode等。如果不关闭防火墙,客户端使用API操作HDFS以及ZooKeeper,可能就会出现下面常见的两种异常: |
- 使用API操作HDFS时会出现异常:java.net.NoRouteToHostException: No route to host |
- 使用API操作ZK时会出现异常:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for xxxx |
2. 输入关闭防火墙命令: |
``` |
$ systemctl status firewalld |
$ systemctl stop firewalld |
$ systemctl disable firewalld |
``` |
3. 修改禁用selinux,修改内容如下: |
```bash |
$ vim /etc/selinux/config |
# SELINUX=enforcing |
# SELINUXTYPE=targeted |
SELINUX=disable |
``` |
修改好之后需要执行reboot命令重启,使更改生效。 |
#### 1.3 时间统一 |
Hbase需要时间统一,否则会报错。 |
```bash |
``` |
## 二、准备工作 |
### 2.1 安装JDK |
在四台机器上配置JDK环境,使用yum命令直接安装: |
```shell |
$ yum install java -y |
``` |
使用yum命令安装的Java,可以使用如下命令查看对应的Java版本: |
```bash |
$ java -version |
openjdk version "1.8.0_242" |
OpenJDK Runtime Environment (build 1.8.0_242-b08) |
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode) |
``` |
因为后续需要用到jps命令,所以还需要安装对应版本工具包: |
```shell |
$ yum list openjdk-dev |
已加载插件:fastestmirror |
Loading mirror speeds from cached hostfile |
* base: mirrors.aliyun.com |
* extras: mirrors.aliyun.com |
* updates: mirrors.aliyun.com |
已安装的软件包 |
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.242.b08-0.el7_7 @updates |
可安装的软件包 |
java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3 base |
java-1.7.0-openjdk-devel.x86_64 1:1.7.0.251-2.6.21.0.el7_7 updates |
java-1.8.0-openjdk-devel.i686 1:1.8.0.242.b08-0.el7_7 updates |
java-1.8.0-openjdk-devel-debug.i686 1:1.8.0.242.b08-0.el7_7 updates |
java-1.8.0-openjdk-devel-debug.x86_64 1:1.8.0.242.b08-0.el7_7 updates |
java-11-openjdk-devel.i686 1:11.0.6.10-1.el7_7 updates |
java-11-openjdk-devel.x86_64 1:11.0.6.10-1.el7_7 updates |
java-11-openjdk-devel-debug.i686 1:11.0.6.10-1.el7_7 updates |
java-11-openjdk-devel-debug.x86_64 1:11.0.6.10-1.el7_7 updates |
``` |
下载对应版本的工具包: |
```bash |
$ yum install java-1.8.0-openjdk-devel.i686 -y |
``` |
使用命令查看Java虚拟机的路径: |
```bash |
$ find / -name java |
/etc/alternatives/java |
/var/lib/alternatives/java |
/usr/bin/java |
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java |
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/bin/java |
/usr/lib/jvm/java |
/usr/lib/jvm-exports/java |
``` |
注3:不通版本的Java或centos可能存在差异,可以通过ll命令进入查看对应的Java执行文件最终软链接到的目录。 |
```bash |
$ ll /usr/bin/ |
lrwxrwxrwx. 1 root root 22 2月 19 13:32 java -> /etc/alternatives/java |
lrwxrwxrwx. 1 root root 23 2月 19 18:29 javac -> /etc/alternatives/javac |
lrwxrwxrwx. 1 root root 25 2月 19 18:29 javadoc -> /etc/alternatives/javadoc |
lrwxrwxrwx. 1 root root 23 2月 19 18:29 javah -> /etc/alternatives/javah |
lrwxrwxrwx. 1 root root 23 2月 19 18:29 javap -> /etc/alternatives/javap |
``` |
```bash |
$ ll /etc/alternatives/java |
lrwxrwxrwx. 1 root root 73 2月 19 13:32 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java |
``` |
最终可以看到目录是在/usr/lib/jvm/下面。 |
修改配置文件 vim /etc/profile: |
```sh |
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64 |
export JRE_HOME=$JAVA_HOME/jre |
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH |
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH |
``` |
然后重新加载配置文件使之生效: |
```bash |
$ source /etc/profile |
``` |
### 2.2 添加Hosts映射关系 |
分别在三个节点上添加hosts映射关系: |
```bash |
$ vim /etc/hosts |
``` |
添加的内容如下: |
```asciiarmor |
192.168.7.100 master01 |
192.168.7.101 slave01 |
192.168.7.102 slave02 |
192.168.7.103 slave03 |
``` |
### 2.3 集群之间SSH无密码登陆 |
CentOS默认安装了ssh,如果没有你需要先安装ssh 。 |
集群环境的使用必须通过ssh无密码登陆来执行,本机登陆本机必须无密码登陆,主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制。 |
2.3.1 设置master无密码自登陆 |
主要有三步:①生成公钥和私钥、②导入公钥到认证文件、③更改权限 |
```bash |
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa |
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys |
$ chmod 700 ~/.ssh && chmod 600 ~/.ssh/* |
``` |
测试,第一次登录可能需要yes确认,之后就可以直接登录了: |
```bash |
[root@master01 ~]# ssh localhost |
The authenticity of host 'localhost (::1)' can't be established. |
ECDSA key fingerprint is SHA256:IxO75zoM/DP/8/wl9ephcpGbTn7kK4tVBD92XxRrugE. |
ECDSA key fingerprint is MD5:d6:e3:11:07:13:92:d4:9f:3a:d9:46:0f:d5:c1:04:81. |
Are you sure you want to continue connecting (yes/no)? yes |
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts. |
Last login: Thu Feb 20 21:44:05 2020 from 192.168.7.1 |
[root@master01 ~]# |
``` |
对于 slave01 和 slave02,slave03进行无密码自登陆设置,操作同上。 |
2.3.2 设置主机->从机的无密码登录 |
```bash |
$ cat ~/.ssh/id_rsa.pub |
$ cat ~/.ssh/id_rsa.pub |
$ cat ~/.ssh/id_rsa.pub |
``` |
测试: |
```bash |
[root@master01 ~]# ssh slave01 |
Last login: Fri Feb 21 08:08:39 2020 from slave01 |
[root@master01 ~]# ssh slave02 |
Last login: Thu Feb 20 15:12:09 2020 from 192.168.7.1 |
``` |
2.3.3 设置从机->主机的无密码登录 |
分别在slave1、slave2上执行: |
```bash |
$ cat ~/.ssh/id_rsa.pub |
``` |
## 三、Hadoop集群安装配置 |
这里会将hadoop、hbase、zookeeper的安装包都解压到/usr/local/文件夹下,并重命名为hadoop、hbase、zookeeper。 |
### 3.1 修改hadoop配置 |
配置文件都在~/usr/local/hadoop/etc/hadoop目录下 |
```bash |
$ cd /usr/local/hadoop/etc/hadoop |
``` |
使用vim给各配置文件添加如下内容,比如vim core-site.xml。 |
3.1.1 core-site.xml |
```xml |
``` |
如果没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。 |
3.1.2 hadoop-env.sh |
```sh |
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre |
export HADOOP_HOME=/usr/local/hadoop |
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop |
``` |
如下配置也需要添加,否则会出现warn或error提示。 |
```sh |
export HDFS_NAMENODE_USER=root |
export HDFS_DATANODE_USER=root |
export HDFS_SECONDARYNAMENODE_USER=root |
export YARN_RESOURCEMANAGER_USER=root |
export YARN_NODEMANAGER_USER=root |
export HDFS_JOURNALNODE_USER=root |
export HDFS_ZKFC_USER=root |
``` |
3.1.3 hdfs-site.xml |
```xml |
``` |
3.1.4 mapred-site.xml |
```xml |
``` |
3.1.5 yarn-site.xml |
```xml |
``` |
注意:yarn.nodemanager.vmem-check-enabled是忽略虚拟内存的检查,如果安装在虚拟机上,这个配置很有用,配上去之后后续操作不容易出问题。如果是在实体机上,并且内存够多,可以将这个配置去掉。 |
3.1.6 修改masters文件 |
```bash |
$ vim masters |
master01 |
``` |
3.1.6 修改workers文件 |
注意:Hadoop 3.x版本把之前版本的slaves文件改成了workers了。 |
``` |
slave01 |
slave02 |
slave03 |
``` |
注意:三台机器上都进行相同的配置,都放在相同的路径下。 |
使用scp命令进行从本地到远程(或远程到本地)的文件拷贝操作: |
```bash |
scp -r /usr/local/hadoop slave01:/usr/local/ |
scp -r /usr/local/hadoop slave02:/usr/local/ |
scp -r /usr/local/hadoop slave03:/usr/local/ |
``` |
3.1.7 修改start-yarn.sh stop-yarn文件 |
```bash |
$ cd /usr/local/hadoop/sbin |
``` |
```bash |
$ vim start-yarn.sh |
``` |
```bash |
$ vim stop-yarn.sh |
``` |
在文件最上面的空白处添加下面的内容,否则还是会有warn或error提示 |
```bash |
## @description usage info |
## @audience private |
## @stability evolving |
## @replaceable no |
YARN_RESOURCEMANAGER_USER=root |
HDFS_DATANODE_SECURE_USER=yarn |
YARN_NODEMANAGER_USER=root |
``` |
3.1.8 修改start-yarn.sh stop-yarn文件 |
```bash |
$ vim start-dfs.sh |
``` |
```bash |
$ vim stop-dfs.sh |
``` |
在文件最上面的空白处添加下面的内容,否则还是会有warn或error提示 |
```sh |
# Licensed to the Apache Software Foundation (ASF) under one or more |
# contributor license agreements. See the NOTICE file distributed with |
TANODE_USER=root |
HDFS_DATANODE_SECURE_USER=hdfs |
HDFS_NAMENODE_USER=root |
HDFS_SECONDARYNAMENODE_USER=root |
``` |
### 3.2 启动hadoop集群 |
3.2.1 添加Hadoop目录到环境变量 |
```bash |
$ vim /etc/profile |
export HADOOP_HOME=/usr/local/hadoop |
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin |
``` |
使更改立即生效: |
```bash |
source /etc/profile |
``` |
3.2.2 启动前格式化操作 |
```bash |
$ hdfs namenode -format |
# 另外一台备用节点上执行 |
$ hdfs namenode -bootstrapStandby |
``` |
格式化namenode,第一次启动服务前执行的操作,以后不需要执行。 |
3.2.3 然后启动hadoop |
```bash |
$ sbin/start-all.sh |
``` |
通过jps命令能看到除jps外有5个进程: |
```bash |
$ jps |
4866 NodeManager |
4370 NameNode |
4899 Jps |
4648 SecondaryNameNode |
4779 ResourceManager |
4460 DataNode |
``` |
如果没有看到对应的节点,比如DataNode节点,可以单独再执行命令进行启动: |
```bash |
$ hdfs --daemon start datanode |
``` |
发生这种原因的具体原因还未知,需要做进一步排查。 |
## 四、ZooKeeper集群安装配置 |
解压zookeeper-3.4.14.tar.gz并重命名为zookeeper。 |
### 4.1 修改配置文件zoo.cfg |
进入/usr/local/zookeeper/conf目录并拷贝zoo_sample.cfg文件为zoo.cfg |
```bash |
$ cp zoo_sample.cfg zoo.cfg |
``` |
同时存在两个.cfg文件可能会冲突,所以需要删除zoo_sample.cfg文件: |
```bash |
$ rm -rf zoo_sample.cfg |
``` |
编辑如下: |
```bash |
$ vim zoo.cfg |
dataDir=/home/hadoop/zookeeper/data |
server.1=192.168.7.100:2888:3888 |
server.2=192.168.7.101:2888:3888 |
server.3=192.168.7.102:2888:3888 |
server.3=192.168.7.103:2888:3888 |
``` |
说明: |
``` |
#server.1 这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里 |
#IP为集群里的IP地址,第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口, |
集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888 |
#tickTime: |
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。 |
#initLimit: |
这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper |
服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime) |
长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒 |
#syncLimit: |
这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5*2000=10秒 |
#dataDir: |
快照日志的存储路径 |
#dataLogDir: |
事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多 |
#clientPort: |
这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。修改他的端口改大点 |
———————————————— |
版权声明:本文为CSDN博主「不知道取啥昵称」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 |
原文链接:https://blog.csdn.net/winy_lm/article/details/81906723 |
``` |
### 4.2 新建并编辑myid文件 |
在dataDir目录下新建myid文件,输入对应的数字,例如server.1对应的是master01这台机器,那么在master01中的myid文件输入1: |
```bash |
$ mkdir /usr/local/zookeeper/data |
$ echo "1" > /usr/local/zookeeper/data/myid |
``` |
同样使用scp命令进行远程复制: |
```bash |
$ scp -r /usr/local/zookeeper slave01:/usr/local/ |
$ scp -r /usr/local/zookeeper slave02:/usr/local/ |
$ scp -r /usr/local/zookeeper slave03:/usr/local/ |
``` |
修改每台机器上的myid文件,slave01对应的是server.2,所以myid改为2。 |
### 4.3 启动ZooKeeper集群 |
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本: |
```bash |
$ ~/usr/local/zookeeper/bin/zkServer.sh start |
``` |
如果启动报类似异常:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888 是可以忽略的,因为该服务启动时会尝试连接所有节点,而其他节点尚未启动。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。其他结点可能也出现类似问题,属于正常。 |
## 五、HBase集群安装配置 |
解压hbase-2.0.2-bin.tar.gz并重命名为hbase。 |
### 5.1 hbase-env.sh |
```bash |
$ vim /opt/hbase/conf/hbase-env.sh |
``` |
```bash |
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre |
# 改为false,不使用hbase自带的zookeeper,使用外部的 |
export HBASE_MANAGES_ZK=false |
# 有人添加了如下配置,本人没有添加 |
# export HBASE_CLASSPATH=/usr/local/hbase/etc/hadoop/ |
``` |
### 5.2 hbase-site.xml |
```xml |
``` |
切记上面的hbase.unsafe.stream.capability.enforce属性,一定不要忘了添加,否则后续启动HBase会报IllegalStateException异常,这里目的是禁止检查流功能~ |
### 5.3 更改 regionservers |
在 regionservers 文件中添加slave列表: |
``` |
slave01 |
slave02 |
slave03 |
``` |
此处设置备用的master,保证主master宕机后,直接可把slave节点切换为master。保证集群的正常使用。 |
```bash |
$ vim /usr/local/hbase/conf/backup-masters |
slave01 |
``` |
5.4 分发并同步安装包 |
将整个hbase安装目录都拷贝到所有slave服务器: |
```bash |
$ scp -r /home/hadoop/hbase slave1:/home/hadoop |
$ scp -r /home/hadoop/hbase slave2:/home/hadoop |
``` |
### 六、再次修改配置文件 |
将zookeeper,hbase等加入环境变量,这样可以全局使用命令,不需要带安装目录。 |
```sh |
$ vim /etc/profile |
export HADOOP_HOME=/usr/local/hadoop |
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin |
export HBASE_HOME=/usr/local/hbase |
export PATH=$HBASE_HOME/bin:$PATH |
export ZOOKEEPER_HOME=/usr/local/zookeeper |
export PATH=$PATH:$ZOOKEEPER_HOME/bin |
``` |
生效: |
```bash |
$ source /etc/profile |
``` |
### 七、启动集群 |
7.1. 启动ZooKeeper |
```bash |
$ /usr/local/zookeeper/zkServer.sh start |
``` |
如有报错,请查看上面的3.2.3 |
7.2. 启动hadoop |
```bash |
$ /usr/local/hadoop/sbin/start-all.sh |
``` |
7.3. 启动hbase |
```bash |
$ /usr/local/hbase/bin/start-base.sh |
``` |
注意:如果启动报错,可以先去各slave节点单独启动,最后再启动master节点,slave节点启动命令。 |
```bash |
[root@slave01 bin]# pwd |
/usr/local/hbase/bin |
[root@slave01 bin]# ./hbase-daemon.sh start regionserver |
``` |
master启动命令: |
```bash |
[root@master01 bin]# ./hbase-daemon.sh start master |
``` |
如果出现下面的问题: |
``` |
ERROR: KeeperErrorCode = NoNode for /hbase/meta-region-server |
ERROR: KeeperErrorCode = NoNode for /hbase/master |
``` |
```bash |
$ hadoop dfs -rm -r /hbase |
``` |
如果还有报错,请继续下面的操作: |
```bash |
检查配置,检查zookeeper是否正常 |
解决:删除zookeeper下的/hbase -rm -r /hbase |
删除hbase.zookeeper.property.dataDir 默认为/tmp/habse-{hostname} |
删除hdfs中的hbase |
``` |
4. 启动后,master上进程列表** |
```bash |
[root@master01 local]# jps |
1541 NameNode |
1829 SecondaryNameNode # hadoop进程 |
57846 Jps |
2473 DataNode |
2554 QuorumPeerMain |
4283 HMaster |
2095 ResourceManager |
``` |
slave进程 |
```bash |
[root@slave01 local]# jps |
1232 DataNode |
1346 NodeManager |
1927 HRegionServer |
1469 QuorumPeerMain |
6877 Jps |
``` |
5. 进入hbase shell进行验证 |
``` |
[root@master01 local]# hbase shell |
SLF4J: Class path contains multiple SLF4J bindings. |
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] |
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] |
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. |
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] |
HBase Shell |
Use "help" to get list of supported commands. |
Use "exit" to quit this interactive shell. |
Version 2.0.2, r1cfab033e779df840d5612a85277f42a6a4e8172, Tue Aug 28 20:50:40 PDT 2018 |
Took 0.0022 seconds |
hbase(main):001:0> |
# 查看状态 |
hbase(main):001:0> status |
1 active master, 0 backup masters, 3 servers, 0 dead, 1.6667 average load |
Took 0.5841 seconds |
hbase(main):002:0> |
``` |
Hadoop HBase ZooKeeper分布式集群环境搭建
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
一步一步教你搭建Hadoop分布式集群
旨在说明如何部署hadoop伪分布式集群和完全分布式集群
hadoop vim Hadoop -
分布式数据库 HBase实践
07 手机云服务数据存储
数据存储 云服务 -
搭建Hadoop分布式集群------测试Hadoop分布式集群环境
验证hadoop集群构建成功Step_1:通过Master节点格式化集群的文件系统:Step_2:启动hadoop集群:Step_3:停止Hadoop集群:此
启动hadoop服务 hadoop dfs hadoop集群运行wordcount 处理hadoop没有数据节点问题