本文描述如何安装配置 HBase 集群,并使用一个外置的 ZooKeeper 集群。
使用的软件版本:
CentOS 5.5, Sun JDK 1.6.0_22, ZooKeeper 3.2.2, Hadoop 0.20.2, HBase 0.20.6.
1. 操作系统准备
本文的实验环境共用到了三台机器,分别为:
hmc1.yunsong.net: 10.10.30.221
hmc2.yunsong.net: 10.10.30.222
hmc3.yunsong.net: 10.10.30.223
三台机器上运行的组件分配:
hmc1: zookeeper, hadoop namenode/jobtracker, hbase master
hmc2: zookeeper, hadoop datanode/tasktracker, hbase regionserver
hmc3: zookeeper, hadoop datanode/tasktracker, hbase regionserver
说明:本文只是一个实验环境。在生产环境中,推荐使用单独的机器运行 ZooKeeper 服务,不要把它与 Hadoop、HBase 的组件混在同台机器上运行。
每台机器安装一个最基本的 CentOS 就可以了,并:
- 禁用 firewall、SELinux、IPv6,以及无必要的服务
- 配置 /etc/hosts 或者 DNS,使得各台机器的 hostname 和 IP 地址可以解析
- 同步各台机器的时间,使之保持一致
- 配置 RSA keypair,使得各台机器间相互 SSH 无密码要求
2. 约定
当然可以使用 root 用户来运行所有服务,不过通常情况下应该使用一个普通用户来运行这些服务。本文的实验环境中,在每台机器上都有一个相同帐号,用户名是 huangys,宿主目录为 /home/huangys
部署目录结构为:
Sun JDK 安装在 /opt/sunjdk1.6.0_22
ZooKeeper 安装在 /home/huangys/zookeeper-3.2.2
Hadoop 安装在 /home/huangys/hadoop-0.20.2
HBase 安装在 /home/huangys/hbase-0.20.6
相关数据目录为:
ZooKeeper data 位于 /var/zookeeper/data
datalog 位于 /var/zookeeper/datalog
Hadoop 默认情况下将数据写在 /tmp 目录下,对于生产环境,建议指定到其他更安全可靠的目录。
3. ZooKeeper
建立数据目录:
# mkdir -p /var/zookeeper/{data,datalog}
修改权属(如有需要):
# chown -Rc huangys.huangys /var/zookeeper
解包:
$ tar zxvf zookeeper-3.2.2.tar.gz
指定 Java 环境:
$ cd zookeeper-3.2.2/conf
$ vi java.env
JAVA_HOME=/opt/sunjdk1.6.0_22
PATH=$PATH:$JAVA_HOME/bin
JVMFLAGS=-Xmx384M
配置:
$ vi zoo.cfg (确保有以下项)
maxClientCnxns=100
dataDir=/var/zookeeper/data
dataLogDir=/var/zookeeper/datalog
clientPort=2181
server.1=hmc1.yunsong.net:2888:3888
server.2=hmc2.yunsong.net:2888:3888
server.3=hmc3.yunsong.net:2888:3888
在每台机器上建立一个文件,文件名为 myid,内容是 zoo.cfg 中定义的 server 序号(如上的 1、2、3),存放于 /var/zookeeper/data 中:
$ cd /var/zookeeper/data
$ echo 1 > myid (在 hmc1 上)
$ echo 2 > myid (在 hmc2 上)
$ echo 3 > myid (在 hmc3 上)
启动:
$ bin/zkServer.sh start
停止:
$ bin/zkServer.sh stop
客户端连接并校验:
$ bin/zkCli.sh
4. Hadoop
解包:
$ tar zxvf hadoop-0.20.2.tar.gz
指明 Java 位置:
$ cd hadoop-0.20.2/conf
$ vi hadoop-env.sh (确保有以下项)
export JAVA_HOME=/opt/sunjdk1.6.0_22
export HADOOP_HEAPSIZE=1000
export HADOOP_SSH_OPTS=”-o StrickHostKeyChecking=no”
export HADOOP_PID_DIR=/var/run
指定主从节点:
$ vi masters
hmc1.yunsong.net
$ vi slaves
hmc2.yunsong.net
hmc3.yunsong.net
配置 core-site.xml:
$ vi core-site.xml
<property>
<name>fs.default.name</name>
<value>hdfs://hmc1.yunsong.net:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop</value>
</property>
配置 hdfs-site.xml:
$ vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
配置 mapred-site.xml:
$ vi mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>hmc1.yunsong.net:9001</value>
</property>
注:
1,Hadoop 默认将数据写在 /tmp 目录下,可以如上在 core-site.xml 重定义其总目录,也可以在 hdfs-site.xml 和 mapred-site.xml 中重定义分别改变相关数据目录。
2,在生产环境中,为了保证数据的冗余和可靠,可以指定多个目录、且这多个目录位于不同的物理磁盘上。
格式化 namenode:
登录到主节点 hmc1 上,并执行以下指令
$ cd hadoop-0.20.2
$ bin/hadoop namenode -format
启动 Hadoop 集群:
登录到主节点 hmc1 上,并执行以下指令
$ cd hadoop-0.20.2
$ bin/start-all.sh
停止 Hadoop 集群:
登录到主节点 hmc1 上,并执行以下指令
$ cd hadoop-0.20.2
$ bin/stop-all.sh
检查服务运行状态:
DFS: http://hmc1.yunsong.net:50070
MapReduce: http://hmc1.yunsong.net:50030
5. HBase
解包:
$ tar zxvf hbase-0.20.6.tar.gz
设置环境:
$ cd hbase-0.20.6/conf
$ vi hbase-env.sh (确保有以下项)
export JAVA_HOME=/opt/sunjdk1.6.0_22
export HBASE_HOME=/home/huangys/hbase-0.20.6
export HBASE_HEAPSIZE=1000
export HBASE_SSH_OPTS=”-o StrictHostKeyChecking=no”
export HBASE_PID_DIR=/var/run
export HBASE_MANAGES_ZK=false
指定从节点:
$ vi regionservers
hmc2.yunsong.net
hmc3.yunsong.net
配置:
$ vi hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://hmc1.yunsong.net:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>50</value>
</property>
<property>
<name>hbase.hregion.majorcompaction</name>
<value>3600000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hmc1.yunsong.net,hmc2.yunsong.net,hmc3.yunsong.net</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>90000</value>
</property>
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
</property>
<property>
<name>hbase.master.wait.on.regionservers.timeout</name>
<value>10</value>
</property>
因为 HBase 集群模式运行在 HDFS 上,所以 HBase 也需要知道 HDFS 的配置。最简单的做法就是把 Hadoop 的 hdfs-site.xml 做个字符链接到 HBase 的配置目录下:
$ cd hbase-0.20.6/conf
$ ln -s ../../hadoop-0.20.2/conf/hdfs-site.xml .
启动:
登录到主节点 hmc1 上,并执行以下指令
$ cd hbase-0.20.6
$ bin/start-hbase.sh
停止:
登录到主节点 hmc1 上,并执行以下指令
$ cd hbase-0.20.6
$ bin/stop-hbase.sh
检查服务运行状态:
HBase: http://hmc1.yunsong.net:60010