Hadoop2.5.2+Zookeeper3.4.6 + HBase0.98.8-hadoop2环境搭建

 

 

1.Hadoop集群

参考我的前篇文章:Hadoop 2.5.2分布式集群配置

2.Zookeeper集群

2.1 配置

2.1.1 zoo.cfg

# cd /usr/local/
# tar -zxvf zookeeper-3.4.6.tar.gz 
# cd zookeeper-3.4.6
# cp conf/zoo_sample.cfg conf/zoo.cfg
# vim conf/zoo.cfg


tickTime=2000
    dataDir=/usr/local/zookeeper-3.4.6/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=Hmaster:2888:3888
server.2=Hslave1:2888:3888
server.3=Hslave2:2888:3888

2.1.2 分发到集群的其它机器

把zookeeper文件夹连同修改后的配置文件通过scp拷贝到另外两台机器(Hslave1, Hslave2)上。

# cd /usr/local
# scp -r zookeeper-3.4.6 root@Hslave1:/usr/local
# scp -r zookeeper-3.4.6 root@Hslave2:/usr/local

2.1.3 设置myid(身份唯一标识)

先创建目录

在Hmaster, Hslave1, Hslave2上创建dataDir中配置的目录/usr/local/zookeeper-3.4.6/data。

// 先创建目录
# mkdir /usr/local/zookeeper-3.4.6/data

// Hmaster
# echo "1" > /usr/local/zookeeper-3.4.6/data/myid
// Hslave1
# echo "2" > /usr/local/zookeeper-3.4.6/data/myid
// Hslave2
# echo "3" > /usr/local/zookeeper-3.4.6/data/myid

2.1.4 一些配置参数的解释

tickTime :心跳时间,单位毫秒。同时tickTime又是zookeeper中的基本单位,比如后面的initLimit=5就是指5个tickTime时间,在这里是10秒。

dataDir :存储数据信息的本地目录。

2.2 启动/关闭

{ZOOKEEPER_HOME} /bin/zkServer.sh start

启动和关闭命令必须到zookeeper集群的每个机器上,没有像start-dfs.sh那样的命令可以一下子把整个集群启动。

2.3 启动日志分析

可能出现如下情况

2014-05-21 11:26:43,085 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@382] - Cannot open channel to 2 at election address cloud002/172.18.19.37:3888
java.net.ConnectException: 拒绝连接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
at java.lang.Thread.run(Thread.java:744)
2014-05-21 11:26:43,263 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannot open channel to 2 at election address cloud002/172.18.19.37:3888
java.net.ConnectException: 拒绝连接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
2014-05-21 11:26:43,265 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@849] - Notification time out: 400

由于ZooKeeper集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。
其他结点可能也出现类似问题,属于正常。

2.4 测试验证

{ZOOKEEPER_HOME} /bin/zkServer.sh status

以下是结果示例,可以看到各机器的角色是follower还是leader。

[root@hmaster zookeeper-3.4.6]# jps
2118 Jps
2013 QuorumPeerMain


[root@hmaster zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@hslave1 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[root@hslave1 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

2.5 注意事项

对于一个包含3台server的Zookeeper集群,最多容许关闭一台(如果被关闭的是leader,则会重新选举出一个)。如果关闭两台,则剩下那台虽然进程QuorumPeerMain还在,但zkServer.sh status查看状态则显示Error contacting service. It is probably not running。

对于一个包含5台server的Zookeeper集群,最多容许关闭两台。关闭三台,则剩下两台虽然进程QuorumPeerMain还在,但也显示同样的错误。

(如果这个时候用Java程序去连接Hbase,则会提示:org.apache.hadoop.hbase.ZooKeeperConnectionException: Can’t connect to ZooKeeper)

这里面有两个常见的疑问:

1) 当3台server关闭一台时,只剩下两台时,无法形成majority,那么它是如何选举出leader的?

2) 当5台server关闭三台时,剩下两台,为什么不能像1)中一样仍然正常工作?

这两个问题的答案是同一个,Zookeeper中的所谓majority voting机制,其majority是针对原始的server数量,不是指变化后的数量,这个原始的数量即你配置在zoo.cfg中的server个数。

还有一个常见的问题是为什么推荐使用奇数个Zookeeper server,那是因为3个server与4个server能够提供的可靠性是一样的,3台server的集群允许其中一台server宕机,而4台server的集群也只能容许其中一台server宕机,因为如果两台server宕机,那么剩下两台,对比于原来的4台,2/4不够成大多数。

3.Hbase集群

3.1 配置

3.1.1 配置hbase-env.sh

配置JAVA_HOME和pids目录,export HBASE_MANAGES_ZK=false,这表示不使用hbase自带的zookeeper,而使用外部的zookeeper(这里指我们在上面建的zookeeper)

# The java implementation to use.  Java 1.6 required.
export JAVA_HOME=/usr/java/default
...
# The directory where pid files are stored. /tmp by default. 尽量不要用默认的tmp
export HBASE_PID_DIR=/usr/local/hbase-0.98.8/pids
...
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false

3.1.2 hbase-site.xml

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://Hmaster:9000/hbase</value>
    <description>The directory shared by region servers.</description>
</property>
<property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
    <description>Property from ZooKeeper's config zoo.cfg. The port at
        which the clients will connect.
    </description>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/usr/local/zookeeper-3.4.6/data</value>
</property>
<property>
    <name>zookeeper.session.timeout</name>
    <value>120000</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>Hmaster,Hslave1,Hslave2</value>
</property>
<property>
    <name>hbase.tmp.dir</name>
    <value>/usr/local/hbase-0.98.8/data</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>

3.1.3 regionservers

Hslave1
Hslave2
Hslave3

3.1.4 一些配置参数的解释

hbase.zookeeper.property.clientPort:指定zk的连接端口

zookeeper.session.timeout:RegionServer与Zookeeper间的连接超时时间。当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的regions重新balance,让其他存活的RegionServer接管.

hbase.zookeeper.quorum:默认值是 localhost,列出zookeepr ensemble中的servers

3.1.5 Hbase分发到集群的其它机器

将Hbase目录分发到Hsalve1,Hslave2,Hslave3上

# cd /usr/local
# scp -r hbase-0.98.8 root@Hslave1:/usr/local
# scp -r hbase-0.98.8 root@Hslave2:/usr/local
# scp -r hbase-0.98.8 root@Hslave3:/usr/local

3.2 启动/关闭

bin/start-hbase.sh

bin/stop-hbase.sh

3.3 测试

在Hmaster上执行

{HBASE_HOME}/bin/hbase shell

进入shell命令行,通过创建表等操作来检查不是不工作正常。

或者通过一个简单的Java程序来测试:

Configuration config = HBaseConfiguration.create();

config.set( "hbase.zookeeper.quorum", "Hmaster,Hslave1,Hslave2" );

config.set( "hbase.zookeeper.property.clientport", "2181" );

//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :)

HBaseAdmin.checkHBaseAvailable( config );

HTable    t    = new HTable( config, "test" );

Scan    s    = new Scan();
//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name"));

ResultScanner rs = t.getScanner( s );

try{

    for ( Result r : rs )

    {

        for ( Cell cell : r.rawCells() )

        {

            System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " ");

            System.out.println( "Timetamp:" + cell.getTimestamp() + " " );

            System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " );

            System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " );

            System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " ");

        }

    }

    } finally {

    t.close();

}


System.out.println( "Done!" );

注意,java测试程序所在机器的hosts文件,注意必须有全FDQN(fully qualified domain name, 参见上面linux中的hosts文件),否则有java访问时会提示找不到Hmaster.mh.com

3.4 注意事项

HBase集群需要依赖于一个Zookeeper ensemble。HBase集群中的所有节点以及要访问HBase的客户端都需要能够访问到该Zookeeper ensemble。HBase自带了Zookeeper,但为了方便其他应用程序使用Zookeeper,最好使用单独安装的Zookeeper ensemble。

此外,Zookeeper ensemble一般配置为奇数个节点,并且Hadoop集群、Zookeeper ensemble、HBase集群是三个互相独立的集群,并不需要部署在相同的物理节点上,他们之间是通过网络通信的。

需要注意的是,如果要禁止启动hbase自带的zookeeper,那么,不仅仅需要刚才的export HBASE_MANAGES_ZK=false配置,还需要hdfs-site.xml中的hbase.cluster.distributed为true,否则你在启动时会遇到Could not start ZK at requested port of 2181 错误,这是因为hbase尝试启动自带的zookeeper,而我们已经启动了自己安装的那个zookeeper,默认都使用2181端口,所以出错。

还有,有时候会遇到stop-hbase.sh执行很长时间未结束,很可能的原因是你之前把zookeeper关闭了.

最后,Hbase不需要mapreduce,所以只要start-dfs.sh启动hdfs,然后到zookeeper各节点上启动zookeeper,最后再hbase-start.sh启动hbase即可.

3.5 遇到的问题

HBbase 0.98.8启动后,zookeeper集群独立,没有被Hbase托管,

1.启动时查看主控节点的日志hbase-hadoop-master-master.log,其中的报错如下,

NotServingRegionException: Region hbase:meta,,1 is not online Hslave2…

2017-11-13 15:16:32,003 INFO  [master:Hmaster:60000] catalog.CatalogTracker: Failed verification of hbase:meta,,1 at address=Hslave2,60020,1510556718821, exception=org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: Region hbase:meta,,1 is not online on Hslave2,60020,1510557380354
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:2776)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegion(HRegionServer.java:4333)
    at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionInfo(HRegionServer.java:3676)
    at org.apache.hadoop.hbase.protobuf.generated.AdminProtos$AdminService$2.callBlockingMethod(AdminProtos.java:20158)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2027)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:108)
    at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:110)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:90)
    at java.lang.Thread.run(Thread.java:745)

或者

2.启动hbase时,hmaster启动后又消失了,且hin/base shell后,list执行报错”ERROR:can’t get master address from ZooKeeper; znode data == null”

一般认为是,停止Hbase服务时导致zookeeper的meta数据丢失或损毁所致,解决办法时,停止HBase服务,停止ZooKeeper服务,把zookeeper的每个节点的zoo.cfg指定的dataDir=/hadoop/zookeeper-data目录的文件清除掉,然后重启zookeeper,再重启hbase,再去观察hbase主控节点日志hbase-hadoop-master-master.log,发现一切正常,问题已经得到解决

转载于:https://www.cnblogs.com/stonesma/p/8541452.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值