當前位置:首頁 » 密碼管理 » 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 [email protected]{}:/etc/hadoop/conf/hdfs-site.xml
#關閉:
cat /home/hadoop/slaves|xargs -i -t ssh [email protected]{} "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 [email protected]{} "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 [email protected]{}:/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。如下:
[[email protected] conf]$ cat backup-masters
node1

之後,啟動整個集群,我們會發現,在master和node1上,都啟動了HMaster進程:

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

[[email protected] 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中遷移變得非常方便。

熱點內容
光遇安卓為什麼數據損壞 發布:2022-07-01 13:12:16 瀏覽:59
拍視頻腳本 發布:2022-07-01 13:10:32 瀏覽:196
奇亞會做存儲不 發布:2022-07-01 13:07:16 瀏覽:710
安卓觸屏精靈是什麼語言 發布:2022-07-01 13:05:26 瀏覽:614
模擬人生2和3哪個配置好 發布:2022-07-01 13:05:20 瀏覽:988
網站源碼酒類 發布:2022-07-01 13:00:24 瀏覽:105
字體解壓後如何復制到文件夾 發布:2022-07-01 12:58:39 瀏覽:973
c語言ascii轉換 發布:2022-07-01 12:57:35 瀏覽:752
開機後的蘋果和安卓怎麼轉移 發布:2022-07-01 12:57:02 瀏覽:443
暖風和壓縮機 發布:2022-07-01 12:55:35 瀏覽:626