当前位置:首页 » 密码管理 » hbase客户端访问

hbase客户端访问

发布时间: 2022-05-22 17:50:50

A. aws支java的hbase-client访问

HBase提供了对HBase进行一系列的管理涉及到对表的管理、数据的操作java api。
常用的API操作有:
1、 对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。
2、 插入数据
创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
3、 获取数据
要获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。
4、 浏览每一行
通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个
KeyValue的链表。
5、 删除
使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
6、 锁
新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
7、 簇的访问
客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeper quorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。
下面是一个例子程序:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseTest {

private static Configuration conf = null;

/**
* 初始化配置
*/
static {
Configuration HBASE_CONFIG = new Configuration();
//与hbase/conf/hbase-site.xml中hbase.zookeeper.quorum配置的值相同
HBASE_CONFIG.set("hbase.zookeeper.quorum", "10.1.1.1");
//与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同
HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");
conf = HBaseConfiguration.create(HBASE_CONFIG);
}

/**
* 创建一张表
*/
public static void creatTable(String tableName, String[] familys) throws Exception {
HBaseAdmin admin = new HBaseAdmin(conf);
if (admin.tableExists(tableName)) {
System.out.println("table already exists!");
} else {
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
for(int i=0; i<familys.length; i++){
tableDesc.addFamily(new HColumnDescriptor(familys[i]));
}
admin.createTable(tableDesc);
System.out.println("create table " + tableName + " ok.");
}
}

/**
* 删除表
*/
public static void deleteTable(String tableName) throws Exception {
try {
HBaseAdmin admin = new HBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println("delete table " + tableName + " ok.");
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
}
}

/**
* 插入一行记录
*/
public static void addRecord (String tableName, String rowKey, String family, String qualifier, String value)
throws Exception{
try {
HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
table.put(put);
System.out.println("insert recored " + rowKey + " to table " + tableName +" ok.");
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 删除一行记录
*/
public static void delRecord (String tableName, String rowKey) throws IOException{
HTable table = new HTable(conf, tableName);
List list = new ArrayList();
Delete del = new Delete(rowKey.getBytes());
list.add(del);
table.delete(list);
System.out.println("del recored " + rowKey + " ok.");
}

/**
* 查找一行记录
*/
public static void getOneRecord (String tableName, String rowKey) throws IOException{
HTable table = new HTable(conf, tableName);
Get get = new Get(rowKey.getBytes());
Result rs = table.get(get);
for(KeyValue kv : rs.raw()){
System.out.print(new String(kv.getRow()) + " " );
System.out.print(new String(kv.getFamily()) + ":" );
System.out.print(new String(kv.getQualifier()) + " " );
System.out.print(kv.getTimestamp() + " " );
System.out.println(new String(kv.getValue()));
}
}

/**
* 显示所有数据
*/
public static void getAllRecord (String tableName) {
try{
HTable table = new HTable(conf, tableName);
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
for(Result r:ss){
for(KeyValue kv : r.raw()){
System.out.print(new String(kv.getRow()) + " ");
System.out.print(new String(kv.getFamily()) + ":");
System.out.print(new String(kv.getQualifier()) + " ");
System.out.print(kv.getTimestamp() + " ");
System.out.println(new String(kv.getValue()));
}
}
} catch (IOException e){
e.printStackTrace();
}
}

public static void main (String [] agrs) {
try {
String tablename = "scores";
String[] familys = {"grade", "course"};
HBaseTest.creatTable(tablename, familys);

//add record zkb
HBaseTest.addRecord(tablename,"zkb","grade","","5");
HBaseTest.addRecord(tablename,"zkb","course","","90");
HBaseTest.addRecord(tablename,"zkb","course","math","97");
HBaseTest.addRecord(tablename,"zkb","course","art","87");
//add record baoniu
HBaseTest.addRecord(tablename,"baoniu","grade","","4");
HBaseTest.addRecord(tablename,"baoniu","course","math","89");

System.out.println("===========get one record========");
HBaseTest.getOneRecord(tablename, "zkb");

System.out.println("===========show all record========");
HBaseTest.getAllRecord(tablename);

System.out.println("===========del one record========");
HBaseTest.delRecord(tablename, "baoniu");
HBaseTest.getAllRecord(tablename);

System.out.println("===========show all record========");
HBaseTest.getAllRecord(tablename);
} catch (Exception e) {
e.printStackTrace();
}
}
}

B. hbase使用出的错,求帮助

一、客户端访问hbase时出现 no further information
使用java api访问hbase时,一直连不上,查看日志发现以下错误:
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:933)
10/06/25 15:44:23 WARN zookeeper.ClientCnxn: Ignoring exception ring shutdown input
java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.shutdownInput(Unknown Source)
at sun.nio.ch.SocketAdaptor.shutdownInput(Unknown Source)

查看hbase日志发现有客户端连接信息,但是响应之后一直客户端便一直报上述错误。查资料得知该错一般由于客户端获取hbase regionServer的Ip错误导致,查看zookeeper中的地址发现存的是localhost。经网上资料得知伪分布式式下若未配置host默认获取地址为localhost(大概考虑伪分布式一般都为本机访问吧),在host中将localhost配置成ip即可。
二、HBase同时出现TableNotEnabledException和TableNotDisabledException
在一次enable表的时候由于时间过长而直接ctrl+c结束,结果再次操作时出现TableNotDisabledException错误,而尝试disable却出现
TableNotEnabledException,导致无法启用表。上网查询得知是由于中断操作导致zookeeper中记录的表状态不一致导致。通过以下方法解决。
1、连接zookeeper( 直接通过hbase的工具)hbase zkcli
2、删除hbase下 对应表的数据(或者直接删除/hbase/table路径)delete /hbase/table/{表名}

3、重启hbase

C. 在hbase三层结构下客户端怎么样访问到数据的

首先访问Zookeeper,获取-ROOT表的位置信息,然后访问-ROOT表,获得.MATA.表的信息,接着访问.MATA.表,找到所需的Region具体位于哪个服务器,最后才找到该Region服务器读取数据。

D. zookeeker如何解决HBase单点故障

解决方法:
此问题产生的主要原因是因为zookeeper集群未关闭防火墙。
执行下面命令后仍然报上面的错误:
systemctl start iptables.service
经过仔细查找后发现,CentOS 7.0默认使用的是firewall作为防火墙,需要执行如下命令关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
关闭各个节点防火墙后,重启zookeeper进程,就可以解决上述问题了。

E. 需要安装什么使用hbase shell客户端工具

进入hbase shell console
$HBASE_HOME/bin/hbase shell
如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成功之后再使用hbase shell进入可以使用whoami命令可查看当前用户

hbase(main)> whoami

表的管理
1)查看有哪些表

hbase(main)> list

2)创建表

# 语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:创建表t1,有两个family name:f1,f2,且版本数均为2
hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

3)删除表
分两步:首先disable,然后drop
例如:删除表t1

hbase(main)> disable 't1'
hbase(main)> drop 't1'

4)查看表的结构

# 语法:describe <table>
# 例如:查看表t1的结构
hbase(main)> describe 't1'

5)修改表结构
修改表结构必须先disable

# 语法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
# 例如:修改表test1的cf的TTL为180天
hbase(main)> disable 'test1'
hbase(main)> alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}
hbase(main)> enable 'test1'

权限管理
1)分配权限

# 语法 : grant <user> <permissions> <table> <column family> <column qualifier> 参数后面用逗号分隔
# 权限用五个字母表示: "RWXCA".
# READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,给用户‘test'分配对表t1有读写的权限,
hbase(main)> grant 'test','RW','t1'

2)查看权限

# 语法:user_permission <table>
# 例如,查看表t1的权限列表
hbase(main)> user_permission 't1'

3)收回权限

# 与分配权限类似,语法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用户在表t1上的权限
hbase(main)> revoke 'test','t1'

表数据的增删改查
1)添加数据

# 语法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
# 例如:给表t1的添加一行记录:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系统默认
hbase(main)> put 't1','rowkey001','f1:col1','value01'
用法比较单一。

2)查询数据
a)查询某行记录

# 语法:get <table>,<rowkey>,[<family:column>,....]
# 例如:查询表t1,rowkey001中的f1下的col1的值
hbase(main)> get 't1','rowkey001', 'f1:col1'
# 或者:
hbase(main)> get 't1','rowkey001', {COLUMN=>'f1:col1'}
# 查询表t1,rowke002中的f1下的所有列值
hbase(main)> get 't1','rowkey001'

b)扫描表

# 语法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}
# 另外,还可以添加STARTROW、TIMERANGE和FITLER等高级功能
# 例如:扫描表t1的前5条数据
hbase(main)> scan 't1',{LIMIT=>5}

c)查询表中的数据行数

# 语法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}
# INTERVAL设置多少行显示一次及对应的rowkey,默认1000;CACHE每次去取的缓存区大小,默认是10,调整该参数可提高查询速度
# 例如,查询表t1中的行数,每100条显示一次,缓存区为500
hbase(main)> count 't1', {INTERVAL => 100, CACHE => 500}

3)删除数据
a )删除行中的某个列值

# 语法:delete <table>, <rowkey>, <family:column> , <timestamp>,必须指定列名
# 例如:删除表t1,rowkey001中的f1:col1的数据
hbase(main)> delete 't1','rowkey001','f1:col1'

注:将删除改行f1:col1列所有版本的数据
b )删除行

# 语法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,删除整行数据
# 例如:删除表t1,rowk001的数据
hbase(main)> deleteall 't1','rowkey001'

c)删除表中的所有数据

# 语法: truncate <table>
# 其具体过程是:disable table -> drop table -> create table
# 例如:删除表t1的所有数据
hbase(main)> truncate 't1'

Region管理
1)移动region

# 语法:move 'encodeRegionName', 'ServerName'
# encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表
# 示例
hbase(main)>move '', 'db-41.xxx.xxx.org,60020,1390274516739'

2)开启/关闭region

# 语法:balance_switch true|false
hbase(main)> balance_switch

3)手动split

# 语法:split 'regionName', 'splitKey'

4)手动触发major compaction

#语法:
#Compact all regions in a table:
#hbase> major_compact 't1'
#Compact an entire region:
#hbase> major_compact 'r1'
#Compact a single column family within a region:
#hbase> major_compact 'r1', 'c1'
#Compact a single column family within a table:
#hbase> major_compact 't1', 'c1'

配置管理及节点重启
1)修改hdfs配置
hdfs配置位置:/etc/hadoop/conf

# 同步hdfs配置
cat /home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml
#关闭:
cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"
#启动:
cat /home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"

2)修改hbase配置
hbase配置位置:

# 同步hbase配置
cat /home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml

# graceful重启
cd ~/hbase
bin/graceful_stop.sh --restart --reload --debug inspurXXX.xxx.xxx.org

F. hbase里的hlog存在哪regionserver里还是zookeeper里

看一下下图就知道了吧。


对于用户的一个表比如Blog,可能包括数据多达亿级

该表的数据可以分布在多个HRegion

而每个HRegion保存表的某一段数据

UserTable(1)------HRegion(*)

对于多个的HRegion则有HRegionServer来维护

每个HRegion唯一对应一个HRegionServer

通过HRegionServer才能够访问对应的HRegion

而一个HRegion从物理上分为如下几个部分

HMemCache(内存缓存),HLog(日志),HStore(持久化存储)

三:HBase的数据操作流程

a:读数据

优先从HMemcache中读取,如果没有读到从HStore中读取

当然这里需要关注:读、写同步的问题,HBase如何解决,还有第一个客户端读取数据从HStore读取后,是否会加载到HMemCache中;后续的客户端,读取时直接从HMemCache中读取,以及MemCache中数据的过期化算法

b:写数据

HBase写入数据会写到HMemcache和Hlog中,HMemcache建立缓存,Hlog同步Hmemcache和Hstore的事务日志,发起FlushCache时,数据持久化到Hstore中,并清空HMemecache。

此处需要关注:

HBase写数据,首先写入Memcache,并计入Log中,最后写入HStore中,如果在写入HStore是发生系统异常,就可以从Log中恢复数据,重新写入HStore中。【该机制跟BigTable中的SSTabl,MemTable和CommitLog的作用一样】

c:客户端操作数据流程

客户端访问这些数据的时候通过Hmaster,每个Hregion服务器都会和Hmaster服务器保持一个长连接,Hmaster是HBase分布式系统中的管理者,他的主要任务就是要告诉每个Hregion服务器它要维护哪些Hregion。用户的这些都数据可以保存在Hadoop分布式文件系统上

如果一个HMaster挂了,SecondaryNameNode会自动替代HMaster

但是对应的失效转发的效率还需要进一步尝试,可能依赖ZooKeeper的相关配置项

G. android客户端访问Mysql,现在想用hbase替代Mysql,请问可行否

android客户端访问Mysql,现在想用hbase替代Mysql
HBase对外提供的接口是API,如果查询条件固定,可以用HBase,否则还是建议用Mysql

H. hbase中只有一个master hmaster挂掉了,客户端还能连接hbase集群进行数据读写吗

为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置。当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群。
该配置极其简单:
在$HBASE_HOME/conf/ 目录下新增文件配置backup-masters,在其内添加要用做Backup Master的节点hostname。如下:
[hbase@master conf]$ cat backup-masters
node1

之后,启动整个集群,我们会发现,在master和node1上,都启动了HMaster进程:

[hbase@master conf]$ jps
25188 NameNode
3319 QuorumPeerMain
31725 Jps
25595 ResourceManager
31077 HMaster
25711 NodeManager
25303 DataNode
31617 Main
31220 HRegionServer

[hbase@node1 root]$ jps
11560 DataNode
11762 NodeManager
20769 Jps
415 QuorumPeerMain
11675 SecondaryNameNode
20394 HRegionServer
20507 HMaster

I. hbase是客户端使用还是服务器使用

是在服务器端的

J. Hbase与HDFS是什么关系

HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的,Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统。

(10)hbase客户端访问扩展阅读:

Hadoop 中各模块的作用:

1、Hadoop HDFS为HBase提供了高可靠性的底层存储支持。

2、Hadoop MapRece为HBase提供了高性能的计算能力。

3、Zookeeper为HBase提供了稳定服务和failover机制。

4、Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变得非常简单。

5、Sqoop则为HBase提供了方便的RDBMS(关系型数据库)数据导入功能,使得传统数据库数据向HBase中迁移变得非常方便。

热点内容
sql敏感 发布:2024-05-05 00:28:20 浏览:62
android工程师笔试 发布:2024-05-05 00:10:52 浏览:948
python调试pycharm 发布:2024-05-05 00:10:51 浏览:707
索尼电脑vaio忘了密码如何恢复出厂设置 发布:2024-05-05 00:09:56 浏览:895
安卓系统的用户管理在哪里 发布:2024-05-04 23:12:27 浏览:430
我的世界服务器推荐电脑版免费 发布:2024-05-04 23:04:46 浏览:395
c程序如何编译 发布:2024-05-04 22:58:05 浏览:932
苹果手机怎么查看id密码 发布:2024-05-04 22:54:49 浏览:658
家有三相电如何配置音响设备 发布:2024-05-04 22:53:42 浏览:56
三星存储器已几乎满 发布:2024-05-04 22:47:38 浏览:737