摘要
由于HBase的数据是存放在HDFS上的,HBase依赖于Hadoop环境,搭建HBase集群环境前需要搭建好Hadoop集群环境,并且这里使用独立的Zookeeper进行集群管理,所以也需要单独安装Zookeeper。
整个安装步骤大致为以下几步:
- 环境介绍
- 基础环境配置
- Hadoop 安装
- Zookeeper 安装
- HBase 安装
一、环境介绍
1.1 软件准备
本次搭建使用的软件版本清单:
- Linux: CentOS 6 64bit
- Hadoop: hadoop-2.5.1
- Zookeeper: zookeeper-3.4.13
- HBase: hbase-1.2.8
软件下载地址: 访问中科大源 http://mirrors.ustc.edu.cn/ 获取所需安装镜像。
1.2 Host与服务
本次搭建使用的服务器列表及所需安装软件:
- server01(192.168.11.10): HDFS NameNode, HBase Master
- server02(192.168.11.11): Zookeeper, HDFS DataNode, HBase RegionServer
- server03(192.168.11.12): Zookeeper, HDFS DataNode, HBase RegionServer
- server04(192.168.11.13): Zookeeper, HDFS DataNode, HBase RegionServer
二、基础环境配置
*:表示每台机器都要配置
1. 创建新用户及用户组*
$ sudo groupadd hadoop # 创建hadoop用户组
$ sudo useradd -g hadoop hadoop # 在hadoop用户组中添加hadoop用户
$ sudo passwd hadoop # 给用户hadoop设置密码
$ sudo visudo # 将hadoop账号添加到sudo列表
hadoop ALL=(ALL) NOPASSWD:ALL
注意:以下操作在 hadoop 账号下进行, 使用 su - hadoop 切换到 hadoop 账号
2. 安装JDK*
$ yum install java-1.8.0-openjdk-devel # 安装jdk
$ rpm -qa | grep java # 查看安装了哪些包
$ rpm -ql # java包名 查看安装的位置
# 在 /etc/profile 文件中配置 Java 环境
$ sudo vim /etc/profile
JAVA_HOME=/etc/alternatives/jre_1.8.0_openjdk
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH JAVA_HOME CLASSPATH
3. 配置 host 文件*
确保所有主机都能正确的解析自己以及集群内其它所有主机的主机名。
$ sudo vim /etc/hosts # 设置hosts
192.168.11.10 server01
192.168.11.11 server02
192.168.11.12 server03
192.168.11.13 server04
4. 配置 SSH 无密登录*
Hadoop需要使用SSH协议,namenode使用SSH无密码登录并启动datanode进程,同样原理,datanode上也能使用SSH无密码登录到namenode(这样也能在datanode上进行启动或关闭hadoop)。 Namenode作为客户端,要实现无密码公钥认证,连接到服务器端datanode上时,需要在namenode上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到datanode上。当namenode通过ssh连接datanode时,datanode就会生成一个随机数并用namenode的公钥对随机数进行加密,并发送给namenode。Namenode收到加密数之后再用私钥进行解密,并将解密数回传给datanode,datanode确认解密数无误之后就允许namenode进行连接了,期间不需要用户输入密码。
在server01上建立hadoop用户的授信证书
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
# -t 表示生成算法 有两种rsa和dsa, -P 表示使用的密码,''表示无密码
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
# 将id_dsa.pub的内容追加到authorized_keys的内容后面
$ chmod 644 ~/.ssh/authorized_keys # 设置该文件的读写权限
在server02上建立hadoop用户的授信证书
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
# 使用 SCP 将server01的公钥追加到本机authorized_keys后面
$ sudo scp -r hadoop@server01:/home/hadoop/.ssh/id_dsa.pub /hoodap/home/.ssh/master_dsa.pub
$ cat ~/.ssh/master_dsa.pub >> ~/.ssh/authorized_keys
这样server01就可以通过ssh无密码登录server02机器,但是server02无法登录server01。想要server02可以登录到server01,则需要将server02的公钥追加到server01的authorized_keys中。
在server01上进行以下操作
$ sudo scp -r hadoop@server02:/home/hadoop/.ssh/id_dsa.pub /hoodap/home/.ssh/server02_dsa.pub
$ cat ~/.ssh/server02_dsa.pub >> ~/.ssh/authorized_keys
其他server的操作同上。
5. 配置打开文件的最大句柄数*
防止 HDFS too many open files 异常,本脚本设置为 32768
$ sudo vim /etc/security/limits.conf
* - nofile 32768 # 添加此行
6. 关闭 SELinux*
关闭 SELinux,使其状态为 disabled,启用时可能限制 SSH 免密登录。
$ sudo vim /etc/selinux/config # Selinux的配置文件位置
SELINUX=disabled
7. 关闭防火墙*
$ service iptables stop
$ chkconfig iptables off
8. 配置 NTP 服务*
# 下载ntp
$ sudo yum install ntp
# 设置为开机启动
$ chkconfig --add ntpd
$ chkconfig ntpd on
# 启动ntp
$ service ntpd start
9. 配置 swappiness*
使 vm.swappiness= 0,以避免使用swap分区。
$ cat /etc/sys/vm/swappiness # 查swappiness的值
$ sudo sysctl -p # 查swappiness的值
$ sudo vim /etc/sysctl.conf # 修改swappiness的值
vm.swappiness= 0
10. 禁用透明大页面压缩*
$ sudo vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
三、Hadoop安装
1. 上传 hadoop 安装文件到server01上,并解压
# 创建hadoop软件的安装目录
$ sudo mkdir /opt/hadoop
# 在 /opt/hadoop 目录下解压 hadoop 文件
$ sudo tar -zvxf hadoop-2.5.1.tar.gz
2. 修改 /etc/profile 文件*
$ sudo vim /etc/profile
HADOOP_HOME=/opt/hadoop/hadoop-2.5.1
CLASSPATH=$CLASSPATH:$HADOOP_HOME/src/core
HADOOP_PATH=$HADOOP_HOME/bin
PATH=$PATH:$CLASSPATH:$HADOOP_PATH:$HADOOP_HOME/bin:$HADOOP_HOME/src/core
HADOOP_CLASSPATH=$HADOOP_HOME/build
export PATH CLASSPATH HADOOP_HOME HADOOP_CLASSPATH HADOOP_PATH
$ source /etc/profile # 使配置文件生效
3. 修改Hadoop的配置文件
cd /opt/hadoop/hadoop-2.5.1/etc/hadoop/ 进入hadoop配置文件处
修改hadoop的以下5个配置文件 hadoop-env.sh、core-site.xml、mapred-site.xml、hdfs-site.xml、slaves。
- hadoop-env.sh
$ sudo vim hadoop-env.sh
export JAVA_HOME = /etc/alternative/jre_1.8.0_openjdk
- core-site.xml
$ sudo vim core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://server01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/hadoop-2.5.1/hadoop_tmp/hadoop_${user.name}</value>
</property>
</configuration>
- mapred-site.xml
在高版本的hadoop中并没有mapred-site.xml文件,但是有一个mapred-site.xml.template文件,可以把它复制一下。
$ sudo cp mapred-site.xml.template mapred-site.xml
$ sudo vim mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>server01:9001</value>
</property>
</configuration>
- hdfs-site.xml
$ sudo vim hdfs-site.xml
<configuration>
<property> // 文件块的副本数,一般不大于从机数
<name>dfs.replication</name>
<value>2</value>
</property>
<property> // hdfs的http访问位置
<name>dfs.http.address</name>
<value>server01:50070</value>
</property>
</configuration>
- slaves
$ sudo vim slaves
server02
server03
server04
4. 使用 SCP 将配置好的 hadoop 文件复制到其他节点上
将安装的/opt/hadoop/hadoop-2.5.1文件复制到其他节点上
# 复制到server02的home目录下
$ scp -r hadoop-2.5.1 hadoop@server02:~
$ sudo mv hadoop-2.5.1 /opt/hadoop
# 其他server同上
注意:在各个server上执行 sudo chown -R hadoop:hadoop /opt/hadoop/
设置读写权限(用于log的写入)
5. 格式化一个 namenode
在hadoop的安装目录下 ./bin/hdfs namenode -format
6. 启动 hadoop
./sbin/start-hdfs.sh
7. GUI 查看hadoop集群信息
默认地址:
NameNode:http://server01:50070
JobTracker: http://server01:50030
四、搭建Zookeeper集群
安装位置:server02,server03,server04
1. 上传 zookeeper 安装文件到server02上,并解压
# 创建zookeeper安装目录
$ sudo mkdir /opt/zookeeper
# 在 /opt/zookeeper 目录下解压文件
$ sudo tar -zvxf zookeeper-3.4.13
2. 配置zoo.cfg文件,将zoo_sample.cfg 文件复制一份
# 进入 /opt/zookeeper/zookeeper-3.4.13/conf 目录,修改zoo.cfg
$ sudo cp zoo_sample.cfg zoo.cfg
$ sudo vim zoo.cfg
#the number of milliseconds of each tick
tickTime=2000
#the number of ticks that the initial synchronization phase can take
initLimit=10
#the number of ticks that can pass between sending a request and getting an acknowledgement
syncLimit=5
#the directory where the snapshot is stored
// 修改存储快照文件目录
dataDir=/home/opt/zookeeper/zookeeper-3.4.13/zookeeper_datastore
#the port at which the client will connect
clientPort=2181
#maxClientCnxns=0
// 这里server.x中的x是一个数字,与myid文件中的id是一致的
server.1=server02:2888:3888
server.2=server03:2888:3888
server.3=server04:2888:3888
3. 创建 zookeeper_datastore 文件存放myid
$ sudo mkdir -p /opt/zookeeper/zookeeper-3.4.13/zookeeper_datastore
$ sudo vim /opt/zookeeper/zookeeper-3.4.13/zookeeper_datastore/myid
1
4. 修改 /etc/profile 配置文件
$ sudo vim /etc/profile
ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.13
PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH ZOOKEEPER_HOME
5. 将配置好的zookeeper文件分发到其他节点(server03,server04)
$ scp -r zookeeper-3.4.13 hadoop@server03:~
$ sudo mv zookeeper-3.4.13 /opt/zoookeeper
6. 修改其他server的myid
$ sudo vim /opt/zookeeper/zookeeper-3.4.13/zookeeper_datastore/myid
2
注意:在各个server上执行 sudo chown -R hadoop:hadoop /opt/zookeeper 设置读写权限(用于log的写入)
7. 启动每台server上的zookeeper
# 启动 zookeeper
$ /opt/zookeeper/zookeeper-3.4.13/bin/zkServer.sh start
# 启动 zookeeper 时可以查看启动信息
$ /opt/zookeeper/zookeeper-3.4.13/bin/zkServer.sh start-foreground
# 查看状态
$ /opt/zookeeper/zookeeper-3.4.13/bin/zkServer.sh status
五、HBase集群搭建
1. 上传 hbase 安装文件到server01上,并解压
# 创建 hbase 安装目录
$ sudo mkdir /opt/hbase
# 在 /opt/hbase 目录下安装文件
$ sudo tar -zvxf hbase-1.2.8-bin.tar.gz
2. 修改hbase的配置文件
在 /opt/hbase/hbase-1.2.8/conf 目录下,修改 hbase-env.sh、hbase-site.xml、regionservers。
- hbase-env.sh
$ sudo vim hbase-env.sh
export JAVA_HOME = /etc/alternative/jre_1.8.0_openjdk
export HBASE_MANAGES_ZK=false
- hbase-site.xml
$ sudo vim hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://server01:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>server02,server03,server04</value>
</property>
</configuration>
- regionservers
$ sudo vim regionservers
server02
server03
server04
3. 修改 /etc/profile 配置文件*
$ sudo vim /etc/profile
HBASE_HOME = /opt/hbase/hbase-1.2.8
PATH=$PATH:$HBASE_HOME
export HBASE_HOME PATH
4. 将安装文件 hbase-1.2.8 分发到其他节点
$ scp -r hbase-1.2.8 server02:~
# 移动到 /opt/hbase 目录下
$ sudo mv hbase-1.2.8 /opt/hbase
其他server操作同上。
注意:在各个server上执行 sudo chown -R hadoop:hadoop /opt/hbase 设置读写权限(用于log的写入)
5. 启动hbase
$ /opt/hbase/hbase-1.2.8/bin/start-hbase.sh
GUI 查看 hbase 集群信息
六、总结
HBase集群的搭建步骤比较固定且繁琐,在进行操作时务必认真仔细。此文档主要是在公司进行HBase集群搭建时进行的整理,并且在搭建过程中得到了导师@Kent的指导与帮助,特此感谢!