您的位置:首页 > 编程语言 > Java开发

集群外访问Hbase – access Hbase use a java client program

2011-05-25 22:38 573 查看
集群外访问Hbase – access Hbase use a java
client program


 
集群环境:
Master -
10.123.122.151          test-Master
 
Slave   -
10.123.122.163          test-DATA01
10.123.122.162          test-DATA02
10.123.122.156          test-DATA03
zookeeper
 
由于需要以client方式访问hbase读写数据, 在原有环境hadoop-0.20.2+737 (cdh3) + hbase-0.89.20100924+28 + jdk-6u20 下总是不能成功连接,典型的错误如下:
Session establishment complete 但是无法继续下去(log4j
调整到 debug模式可以看到详细的日志信息)

 
[INFO] Initiating client connection, connectString=Test-DATA03:2181 sessionTimeout=60000 watcher=org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper@423e5d1
[DEBUG] zookeeper.disableAutoWatchReset is false
[DEBUG] <Test-DATA03:/hbase,org.apache.hadoop.hbase.client.HConnectionManager>Connected to zookeeper again
[INFO] Opening socket connection to server Test-DATA03/10.123.122.156:2181
[INFO] Socket connection established to Test-DATA03/10.123.122.156:2181, initiating session
[DEBUG] Session establishment request sent on Test-DATA03/10.123.122.156:2181
[INFO] Session establishment complete on server Test-DATA03/10.123.122.156:2181, sessionid = 0x1300c46dd880ba6, negotiated timeout = 60000
[DEBUG] Reading reply sessionid:0x1300c46dd880ba6, packet:: clientPath:null serverPath:null finished:false header:: 1,4  replyHeader:: 1,52581,0  request:: '/hbase/master,F  response:: #31302e3132332e3132322e3135313a3630303030,s{46590,46590,1305876059993,1305876059993,0,0,0,85581891423961088,20,0,46590} 
[DEBUG] <Test-DATA03:/hbase,org.apache.hadoop.hbase.client.HConnectionManager>Read ZNode /hbase/master got 10.123.122.151:60000
java.lang.NoSuchMethodError: org.apache.hadoop.security.UserGroupInformation.getCurrentUser()Lorg/apache/hadoop/security/UserGroupInformation;
        at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:387)
        at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:435)
        at org.apache.hadoop.hbase.client.HConnectionManager$TableServers.getMaster(HConnectionManager.java:383)
        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:78)
        at com.run.puff.utils.HTableFactory.init(HTableFactory.java:38)
        at com.run.puff.control.Bootstrap.start(Bootstrap.java:293)
        at com.run.puff.control.Bootstrap.main(Bootstrap.java:449)
[DEBUG] Closing session: 0x1300c46dd880ba6
[DEBUG] Closing client for session: 0x1300c46dd880ba6
[DEBUG] Reading reply sessionid:0x1300c46dd880ba6, packet:: clientPath:null serverPath:null finished:false header:: 2,-11  replyHeader:: 2,52582,0  request:: null response:: null
[DEBUG] Disconnecting client for session: 0x1300c46dd880ba6
 
 
2011-05-20 16:45:40,941 INFO [org.apache.zookeeper.ClientCnxn] - Opening socket connection to server Test-DATA03/10.123.122.156:2181
2011-05-20 16:45:40,943 DEBUG [org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper] - <Test-DATA03:/hbase,org.apache.hadoop.hbase.client.HConnectionManager>Trying to read /hbase/root-region-server
2011-05-20 16:45:40,965 INFO [org.apache.zookeeper.ClientCnxn] - Socket connection established to Test-DATA03/10.123.122.156:2181, initiating session
2011-05-20 16:45:40,970 DEBUG [org.apache.zookeeper.ClientCnxn] - Session establishment request sent on Test-DATA03/10.123.122.156:2181
2011-05-20 16:45:40,978 INFO [org.apache.zookeeper.ClientCnxn] - Session establishment complete on server Test-DATA03/10.123.122.156:2181, sessionid = 0x1300c46dd880da6, negotiated timeout = 60000
2011-05-20 16:45:40,988 DEBUG [org.apache.zookeeper.ClientCnxn] - Reading reply sessionid:0x1300c46dd880da6, packet:: clientPath:null serverPath:null finished:false header:: 1,4  replyHeader:: 1,53606,0  request:: '/hbase/root-region-server,F  response:: #31302e3132332e3132322e3135363a3630303230,s{11,46598,1305789309818,1305876061548,4,0,0,0,20,0,11} 
2011-05-20 16:45:40,988 DEBUG [org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper] - <Test-DATA03:/hbase,org.apache.hadoop.hbase.client.HConnectionManager>Read ZNode /hbase/root-region-server got 10.123.122.156:60020
2011-05-20 16:45:41,045 DEBUG [org.apache.hadoop.ipc.HBaseClient] - The ping interval is60000ms.
2011-05-20 16:45:41,079 DEBUG [org.apache.hadoop.ipc.HBaseClient] - Connecting to /10.123.122.156:60020
2011-05-20 16:45:41,104 DEBUG [org.apache.hadoop.ipc.HBaseClient] - IPC Client (47) connection to /10.123.122.156:60020 from an unknown user sending #0
2011-05-20 16:45:41,104 DEBUG [org.apache.hadoop.ipc.HBaseClient] - IPC Client (47) connection to /10.123.122.156:60020 from an unknown user: starting, having connections 1
2011-05-20 16:45:41,170 DEBUG [org.apache.hadoop.ipc.HBaseClient] - closing ipc connection to /10.123.122.156:60020: null
java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
        at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.receiveResponse(HBaseClient.java:514)
        at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.run(HBaseClient.java:454)
 
解决这个问题,最终通过升级集群中的hbase版本解决,使用的是apache官方版本
hbase-0.90.1.tar.gz,升级完毕启动hbase时开始报错
  org.apache.hadoop.ipc.RPC$VersionMismatch
 
$ start-hbase.sh 
Test-DATA03: starting zookeeper, logging to /opt/hbase/bin/../logs/hbase-hadoop-zookeeper-TEST-DATA03.out
starting master, logging to /opt/hbase/logs/hbase-hadoop-master-CUC-test-FD-WEB.out
Test-DATA03: starting regionserver, logging to /opt/hbase/bin/../logs/hbase-hadoop-regionserver-TEST-DATA03.out
Test-DATA02: starting regionserver, logging to /opt/hbase/bin/../logs/hbase-hadoop-regionserver-TEST-DATA02.out
Test-DATA01: starting regionserver, logging to /opt/hbase/bin/../logs/hbase-hadoop-regionserver-TEST-DATA01.out
Test-DATA03: Exception in thread "main" org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol version mismatch. (client = 63, server = 61)
Test-DATA03:        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:403)
Test-DATA03:        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:384)
Test-DATA03:        at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:111)
Test-DATA03:        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:213)
Test-DATA03:        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:180)
Test-DATA03:        at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:89)
Test-DATA03:        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1514)
Test-DATA03:        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:67)
Test-DATA03:        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:1548)
 
然后通过简单的处理方式,将hadoop-core-0.20.2+737.jar
拷贝至hbase安装目录的lib下问题即解,此问题应该是由于升级的hbase为apache官方版本,其中包含的hadoop-0.20.2-core.jar
与hadoop-cdh3 的 hadoop-core-0.20.2+737.jar
存在差异

再次重启hbase,一切顺利
 
如下连接代码终于可以正常工作了
hbaseConf = HBaseConfiguration.create();
 
hbaseConf.set("hbase.master.port", "test-Master:54310"); 
hbaseConf.set("hbase.zookeeper.quorum", "test-DATA03"); 
hbaseConf.set("hbase.zookeeper.property.clientPort","2181"); 
HBaseAdmin
admin = new HBaseAdmin(hbaseConf);
 
 
附注:对于
java.lang.NoSuchMethodError: org.apache.hadoop.security.UserGroupInformation.getCurrentUser()Lorg/apache/hadoop/security/UserGroupInformation;
这个异常,在apache 官网上找到了相关该bug的相关信息,
https://issues.......apache.org/jira/browse/HADOOP-7101
HADOOP-7101
UserGroupInformation.getCurrentUser()
fails when called from non-Hadoop JAAS context

 
 
代码修改日志:
 https://issues.apache.org/jira/secure/attachment/12468097/hadoop-7101.txt
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息