VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群—整合Zookeeper和Hbase


VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群—整合Zookeeper和Hbase

 

这篇是接着上一篇hadoop集群搭建进行的,在hadoop-1.2.1基础之上安装zookeeper-3.4.5和hbase-0.94.20。

上一篇: VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群


安装zookeeper和hbase

 

1.        环境说明

使用VMWare创建5台Ubuntu虚拟机,环境详细信息如下:

虚拟机

操作系统

JDK

Hadoop

Zookeeper

Hbase

VMWare Workstation 9

ubuntu-12.10-server-amd64

jdk-7u51-linux-x64

hadoop-1.2.1

zookeeper-3.4.5

hbase-0.94.20

 

主机名

IP地址

虚拟机名

节点内容

master

192.168.1.30

Ubuntu64-Master

namenode, Jobtracker, zookeeper

secondary

192.168.1.39

Ubuntu64-Secondary

secondarynamenode, zookeeper, hmaster

slaver1

192.168.1.31

Ubuntu64-slaver1

datanode, tasktracker, zookeeper, regionserver

slaver2

192.168.1.32

Ubuntu64-slaver2

datanode, tasktracker, zookeeper, regionserver

slaver3

192.168.1.33

Ubuntu64-slaver3

datanode, tasktracker, zookeeper, regionserver

虚拟机搭建hadoop集群可以参考文档:VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群。

hbase自带zookeeper,还是想把zookeeper独立出来,方便进行控制。因为zookeeper集群是以宕机个数过半才会让整个集群宕机的,3个节点过半是2个,4个节点过半是2个,所以奇数个集群更佳,部署节点越多可靠性越高,所以我们部署5个节点。

 

 

2.        安装配置Zookeeper

部署Zookeeper

解zookeeper-3.4.5.tar.gz包到/home/hadoop/zookeeper-3.4.5

tar -zxvf zookeeper-3.4.5.tar.gz -C /home/hadoop/

 

配置环境变量

把hadoop设置到全局环境变量中

sudo vim /etc/profile

在最下面添加如下内容

export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.5

export PATH=$PATH:$ZOOKEEPER_HOME/bin

刷新环境变量

source /etc/profile

 

/bin/zkEnv.sh

ZOO_LOG_DIR=/home/hadoop/zookeeper_home/log

 

if [ "x${ZOO_LOG4J_PROP}" = "x" ]

then

    ZOO_LOG4J_PROP="INFO, CONSOLE, ROLLINGFILE"

fi

配置zookeeper日志的输出目录及日志输出通道,zookeeper默认只输出console日志,启动zookeeper就会在屏幕上输出一大堆的控制台信息,很不方便。

 

/conf/log4j.properties

# Define some default values that can be overridden by system properties

zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE

zookeeper.console.threshold=INFO

zookeeper.log.dir=/home/hadoop/zookeeper_home/log

zookeeper.log.file=zookeeper.log

zookeeper.log.threshold=DEBUG

zookeeper.tracelog.dir=/home/hadoop/zookeeper_home/logs

zookeeper.tracelog.file=zookeeper_trace.log

这里也同步调整一下。

 

/conf/zoo.cfg

zoo.cfg文件默认是没有的,把zoo_sample.cfg文件复制一份为zoo.cfg,然后修改相应配置项。

cp zoo_sample.cfg zoo.cfg

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/hadoop/zookeeper_home/data

dataLogDir=/home/hadoop/zookeeper_home/logs

 

# the port at which the clients will connect

clientPort=2181

 

server.0=master:2888:3888

server.1=slaver1:2888:3888

server.2=slaver2:2888:3888

server.3=slaver3:2888:3888

server.9=secondary:2888:3888

配置数据路径和日志路径,这些路径需要自己手工创建。

tickTime配置项为心跳时间(毫秒)

initLimit配置项为zookeeper的leader接受follower初始化连接的最长心跳时间数(换算为时间initLimit*tickTime),当leader在最长心跳时间数之内没有收到follower的回馈信息,则表示follower连接失败。

syncLimit配置项为zookeeper的leader和follower之间发送消息和请求应答的最长心跳时间数(换算为时间syncLimit*tickTime)

clientPort配置项为客户端连接端口

server.0=master:2888:3888配置项为master上zookeeper节点的连接信息。0表示服务器编号,master为服务器的主机名或ip地址,2888为leader与follower的通讯端口号,3888为leader宕机后重新选举leader的通讯端口号。

 

/zookeeper_home/data/myid

myid文件是zookeeper节点的标识号(参考/conf/zoo.cfg配置,master上面配置为0),在自己配置的zookeeper的data目录下创建myid文件,然后修改标识号(不同zookeeper节点myid的值不相同)。

cd /zookeeper_home/data

vim myid

以master为例修改内容为

0

 

分发Zookeeper副本

通过scp命令分发安装配置好的zookeeper,目录分发需要加-r参数

scp -r /home/hadoop/zookeeper-3.4.5 hadoop@slaver1: /home/hadoop/

 

分发myid副本

通过scp命令分发zookeeper的myid文件,然后根据服务器调整节点myid值

scp -r /home/hadoop/zookeeper_home hadoop@slaver1: /home/hadoop/

 

 

3.        安装配置Hbase

部署Hbase

hbase的hmaster部署在secondary服务器上,以secondary服务器为例,解hbase-0.94.20.tar.gz包到/home/hadoop/hbase-0.94.20

tar -zxvf hbase-0.94.20.tar.gz -C /home/hadoop/

 

配置环境变量

把hadoop设置到全局环境变量中

sudo vim /etc/profile

在最下面添加如下内容

export HBASE_HOME=/home/hadoop/hbase-0.94.20

export PATH=$PATH:$HBASE_HOME/bin

刷新环境变量

source /etc/profile

 

/conf/hbase-env.sh

# The java implementation to use.  Java 1.6 required.

export JAVA_HOME=/usr/lib/jdk1.7.0_51/

 

# Extra Java CLASSPATH elements.  Optional.配置为hadoop的conf目录

export HBASE_CLASSPATH=/home/hadoop-1.2.1/conf

 

# Where log files are stored.  $HBASE_HOME/logs by default.

export HBASE_LOG_DIR=/home/hadoop/hbase_home/log

 

# Tell HBase whether it should manage it's own instance of Zookeeper or not.

export HBASE_MANAGES_ZK=false

JAVA_HOME配置hbase的jdk目录;

HBASE_CLASSPATH变量配置的为hadoop的conf目录,hbase用来查找hadoop的hdfs配置信息;

HBASE_LOG_DIR为日志的输出目录;

HBASE_MANAGES_ZK 配置为false,那么hbase在启动的时候就不会启动自带的zookeeper,不会应用自带zookeeper进行协调管理,配置为true则会应用自带zookeeper。

自行手工创建日志输出目录。

 

/conf/log4j.properties

hbase.security.logger=INFO, console, DRFA

 

/conf/hbase-site.xml

<configuration>

    <property>

        <name>hbase.rootdir</name>

        <value>hdfs://master:9000/hbase</value>

        <description>HDFS中存储hbase数据的目录,注意主机名和端口号要与hadoop的core-site.xml中fs.default.name的对应</description>

    </property>

    <property>

        <name>hbase.cluster.distributed</name>

        <value>true</value>

        <description>hbase采用集群分布式</description>

    </property>

    <property>

        <name>hbase.zookeeper.quorum</name>

        <value>master,secondary,slaver1,slaver2,slaver3</value>

        <description>协调hbase的zookeeper节点主机,奇数个</description>

    </property>

    <property>

        <name>hbase.zookeeper.property.dataDir</name>

        <value>/home/hadoop/zookeeper_home/data</value>

        <description>zookeeper集群data目录Property from ZooKeeper's config zoo.cfg. The directory where the snapshot is stored.</description>

    </property>

    <property>

        <name>zookeeper.session.timeout</name>

        <value>60000</value>

        <description></description>

    </property>

    <property>

        <name>hbase.zookeeper.property.clientPort</name>

        <value>2181</value>

        <description>HBASE_MANAGES_ZK=false时该端口号要与zoo.cfg中配置clientPort属性的端口号一致</description>

    </property>

    <property>

        <name>hbase.master</name>

        <value>secondary</value>

        <description>hbase的主控节点,用secondary这台服务器</description>

    </property>

    <property>

        <name>hbase.master.info.port</name>

        <value>60010</value>

        <description></description>

    </property>

    <property>

        <name>hbase.master.port</name>

        <value>60000</value>

        <description></description>

    </property>

    <property>

        <name>hbase.regionserver.lease.period</name>

        <value>60000</value>

        <description></description>

    </property>

    <property>

        <name>hbase.rpc.timeout</name>

        <value>60000</value>

        <description></description>

    </property>

    <property>

        <name>hbase.tmp.dir</name>

        <value>/home/hadoop/hbase_home/tmp</value>

        <description>Temporary directory on the local filesystem.</description>

    </property>

</configuration>

hbase.master配置项是hbase的hmaster服务所在的主机,本例中配置在secondary主机上。

 

/conf/regionservers

slaver1

slaver2

slaver3

配置所有regionserver所在的服务器主机名或ip地址

 

替换hadoop-core的jar包

hbase的lib目录中自带hadoop-core-${version}.jar包,可能与实际系统中的hadoop版本不一致,所以要从hadoop中把jar包拷贝过来,拷贝之前先删除旧版本的jar包。

rm /home/hadoop/hbase-0.94.20/lib/hadoop-core-1.0.4.jar

cp /home/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar /home/hadoop/hbase-0.94.20/lib/

 

分发Hbase副本

通过scp命令分发安装配置好的hbasehbase没有部署到master服务器上,所以不需要复制到master上

scp -r /home/hadoop/hbase-0.94.20 hadoop@slaver1: /home/hadoop/

 

分发环境变量

/etc/profile为root用户所有,所以scp要加sudo,而且需要传输到slaver1的root用户下。

sudo scp /etc/profile root@slaver1:/etc/profile

 

 

4.        启动Zookeeper,Hbase测试

zookeeper和hbase都部署完毕,可以启动进行测试。

hadoop、zookeeper、hbase必须按照一定顺序进行启动和停止。

启动hadoop à 启动zookeeper à 启动hbase à 停止hbase à 停止zookeeper à 停止hadoop

 

启动zookeeper

zookeeper没有主机,需要每个节点单独启动,全部启动完毕,zookeeper会根据选举策略,选出一个leader出来,其余节点为follower。

zookeeper服务命令如下

命令

作用

zkServer.sh start

启动zookeeper服务

zkServer.sh status

查看zookeeper服务状态,能看到该节点是leader还是follower

zkServer.sh stop

停止zookeeper服务

zkServer.sh restart

重启zookeeper服务

zookeeper服务启动之后,日志中会出现一些连接失败警告,这是正常的,因为其它节点服务还未启动,全部启动之后,正常日志中就不会出现这些信息。

 

启动hbase

hbase集群只需要在hmaster节点上启动和关闭即可,其它regionserver会被自动启动,本例中把hmaster部署在secondary服务器上,所以只需要在secondary服务器上启动hbase,在启动hbase之前需要查看hadoop和zookeeper是否正常启动。

hbase服务命令如下

命令

作用

start-hbase.sh

启动hbase集群服务,包括hmaster,regionservers

stop-hbase.sh

关闭hbase集群服务,包括hmaster,regionservers

hbase-daemons.sh start/stop regionserver/zookeeper/master-backup

启动或停止所有的regionserver或(内置)zookeeper或backup-master

hbase-daemon.sh start/stop master/regionserver/zookeeper

启动或停止单个master或regionserver或(内置)zookeeper

启动hbase集群,然后查看zookeeper和hbase的日志,看是否出现异常情况。

 

hbase有个shell客户端,通过shell命令可以操作hbase,有ddl和dml等等。

进入shell

hbase shell

创建一个test表,列族有'info','score','user'三个

create 'test', 'info','score','user'

查看创建的表

list

用shell创建表的时候,zookeeper的日志中发现一个info级别的error,日志信息如下。

hbase(main):006:0* create 'test', 'info','score','user'

2014-06-11 18:44:28,343 - INFO  [ProcessThread:-1:PrepRequestProcessor@407] - Got user-level KeeperException when processing sessionid:0x1467fef37790002 type:delete cxid:0x6f zxid:0xfffffffffffffffe

txntype:unknown reqpath:n/a Error Path:/hbase/table/test Error:KeeperErrorCode = NoNode for /hbase/table92/test

这个error不影响hbase的应用,查看了一下hdfs中的目录,发现/hbase下面就直接是test表的文件,没有table92的目录,一直都搞不懂,尝试把hbase的hdfs存储路径调整为hdfs://master:9000/hbase/table92,依然会有这个日志,test表会存储到table92下面。从网上搜索也没有什么结果,索性不去耗费时间了,有了解的朋友可以指点下。

相关内容