當前位置:首頁 » 硬碟大全 » hbasescan讀緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hbasescan讀緩存

發布時間: 2022-01-26 11:30:02

⑴ 描述hbase的scan和get功能以及實現的異同

HBase的查詢實現只提供兩種方式: 1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get) 2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan) 實現條件查詢功能使用的就是scan方式

⑵ 如何讀取hbase數據給rece

WordCountHbaseReaderMapper類繼承了TableMapper< Text,Text>抽象類,TableMapper類專門用於完成MapRece中Map過程與Hbase表之間的操作。此時的map(ImmutableBytesWritable key,Result value,Context context)方法,第一個參數key為Hbase表的rowkey主鍵,第二個參數value為key主鍵對應的記錄集合,此處的map核心實現是遍歷key主鍵對應的記錄集合value,將其組合成一條記錄通過contentx.write(key,value)填充到< key,value>鍵值對中。
詳細源碼請參考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.java
public static class WordCountHbaseReaderMapper extends
TableMapper<Text,Text>{

@Override
protected void map(ImmutableBytesWritable key,Result value,Context context)
throws IOException, InterruptedException {
StringBuffer sb = new StringBuffer("");
for(Entry<byte[],byte[]> entry:value.getFamilyMap("content".getBytes()).entrySet()){
String str = new String(entry.getValue());
//將位元組數組轉換為String類型
if(str != null){
sb.append(new String(entry.getKey()));
sb.append(":");
sb.append(str);
}
context.write(new Text(key.get()), new Text(new String(sb)));
}
}
}

3、 Recer函數實現
此處的WordCountHbaseReaderRece實現了直接輸出Map輸出的< key,value>鍵值對,沒有對其做任何處理。詳細源碼請參考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.java
public static class WordCountHbaseReaderRece extends Recer<Text,Text,Text,Text>{
private Text result = new Text();
@Override
protected void rece(Text key, Iterable<Text> values,Context context)
throws IOException, InterruptedException {
for(Text val:values){
result.set(val);
context.write(key, result);
}
}
}

4、 驅動函數實現
與WordCount的驅動類不同,在Job配置的時候沒有配置job.setMapperClass(),而是用以下方法執行Mapper類: TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class, Text.class, Text.class, job);
該方法指明了在執行job的Map過程時,數據輸入源是hbase的tablename表,通過掃描讀入對象scan對表進行全表掃描,為Map過程提供數據源輸入,通過WordCountHbaseReaderMapper.class執行Map過程,Map過程的輸出key/value類型是 Text.class與Text.class,最後一個參數是作業對象。特別注意:這里聲明的是一個最簡單的掃描讀入對象scan,進行表掃描讀取數據,其中scan可以配置參數,這里為了例子簡單不再詳述,用戶可自行嘗試。
詳細源碼請參考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.java
public static void main(String[] args) throws Exception {
String tablename = "wordcount";
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "Master");
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 1) {
System.err.println("Usage: WordCountHbaseReader <out>");
System.exit(2);
}
Job job = new Job(conf, "WordCountHbaseReader");
job.setJarByClass(WordCountHbaseReader.class);
//設置任務數據的輸出路徑;
FileOutputFormat.setOutputPath(job, new Path(otherArgs[0]));
job.setRecerClass(WordCountHbaseReaderRece.class);
Scan scan = new Scan();
TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class, Text.class, Text.class, job);
//調用job.waitForCompletion(true) 執行任務,執行成功後退出;
System.exit(job.waitForCompletion(true) ? 0 : 1);

}

5、部署運行
1)啟動Hadoop集群和Hbase服務
[hadoop@K-Master ~]$ start-dfs.sh #啟動hadoop HDFS文件管理系統
[hadoop@K-Master ~]$ start-mapred.sh #啟動hadoop MapRece分布式計算服務
[hadoop@K-Master ~]$ start-hbase.sh #啟動Hbase
[hadoop@K-Master ~]$ jps #查看進程
22003 HMaster
10611 SecondaryNameNode
22226 Jps
21938 HQuorumPeer
10709 JobTracker
22154 HRegionServer
20277 Main
10432 NameNode

⑶ 需要安裝什麼使用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

⑷ 能問您一個關於hbase scan rowkey的問題嗎

1)當時怎麼實現的忘了,但是應該就是一個簡單的拼串。其實這段代碼就是每次設一個startkey、endkey。取這中間的數據。

2)tableName應該是外面的一個變數而已。你不用糾結這個。忘了startkey是否要真實存在,如果不要求直接設一下就可以了。如果必須存在,你也可以用startkey和offset來scan。也可以的。

3)另外注意一下緩存的控制,要關閉autocommit。重設緩存,手工flush數據。這樣就不至於每條都提交了。

⑸ hbase 如何存儲數據

HBASE中的表示按column family來存儲的

建立一個有3個column family的表

create 't1', {NAME => 'f1', VERSIONS => 1}, {NAME => 'f2', VERSIONS => 1}, {NAME => 'f3', VERSIONS => 1}
定義表的時候只需要指定column family的名字,列名在put的時候動態指定
插入數據
下面插入沒有指定column的名字
put 't1', 'r1', 'f1', 'v1'
put 't1', 'r2', 'f2', 'v2'
put 't1', 'r3', 'f3', 'v3'

下面插入指定column的名字
put 't1', 'r4', 'f1:c1', 'v1'
put 't1', 'r5', 'f2:c2', 'v2'
put 't1', 'r6', 'f3:c3', 'v3'

hbase(main):245:0> scan 't1'
ROW COLUMN+CELL
r1 column=f1:, timestamp=1335407967324, value=v1
r2 column=f2:, timestamp=1335408004559, value=v2
r4 column=f1:c1, timestamp=1335408640777, value=v1
r5 column=f2:c1, timestamp=1335408640822, value=v2
r6 column=f1:c6, timestamp=1335412392258, value=v3
r6 column=f2:c1, timestamp=1335412384739, value=v3
r6 column=f2:c2, timestamp=1335412374797, value=v3

插入多列的數據
put 't1', 'r7', 'f1:c4', 'v9'
put 't1', 'r7', 'f2:c3', 'v9'
put 't1', 'r7', 'f3:c2', 'v9'

手工把memstore寫到Hfile中

flush 't1'

刪除所有CF3的數據
deleteall 't1','r7'

flush 't1'

每次flash都會建一個新的hfile

$ ../bin/hadoop dfs -lsr /hbase/t1

數據時直接存到CF目錄下的,每個CF目錄下有3到4個Hfile

f1
f1/
f1/321c683f48dd91e058179486587e
f1/
f2
f2/
f2/
f2/
f3
f3/
f3/
f3/
f3/

f3都數據雖然都被刪除了,由於沒有合並文件都存在

手工合並hfile

hbase(main):244:0> compact 't1'
0 row(s) in 0.0550 seconds

$ ../bin/hadoop dfs -lsr /hbase/t1
f1
f1/
f2
f2/

/f3

f1和f2下就只有一個hfile,f3下面沒有hfile因為數據都被刪除了

一次只能put一個column
一次只能delete一個column
刪除整行,用deleteall
deleteall 't1', 'r1'
了解更多開源相關,去LUPA社區看看吧。

⑹ 如何獲取HBase資料庫中「最後一條」數據

hbase0.98版本之後的Scan支持setReversed()函數,具體我還沒有研究過,但估計startRow和endRow要改,好像這個函數是從後往前查的

⑺ hbase的scan怎樣支持通配符

一般情況下,我們使用Linux的shell命令,就可以非常輕松的操作Hbase,例如一些建表,建列簇,插值,顯示所有表,統計數量等等,但有時為了提高靈活性,我們也需要使用編程語言來操作Hbase,當然Hbase通過Thrift介面提供了對大多數主流編程語言

⑻ HBase scan setBatch和setCaching的區別

HBase的查詢實現只提供兩種方式:1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan)實現條件查詢功能使用的就是scan方式,scan在使用時有以下幾點值得注意:1、scan可以通過setCaching與setBatch方法提高速度(以空間換時間);2、scan可以通過setStartRow與setEndRow來限定范圍([start,end)start是閉區間,end是開區間)。范圍越小,性能越高。通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的性能。3、scan可以通過setFilter方法添加過濾器,這也是分頁、多條件查詢的基礎。scan中的setCaching與setBatch方法的區別是什麼呢?setCaching設置的值為每次rpc的請求記錄數,默認是1;cache大可以優化性能,但是太大了會花費很長的時間進行一次傳輸。setBatch設置每次取的columnsize;有些row特別大,所以需要分開傳給client,就是一次傳一個row的幾個column。batch和caching和hbasetablecolumnsize共同決意了rpc的次數。

⑼ 如何加快hbase讀取數據的效率

一.工具開發背景:
業務上目前主要計算邏輯的數據源是hbase,但是我們沒有工具對hbase的數據進行單條更改造數據來驗證邏輯,之前的做法是把hbase的數據都導出來,改完再重新載入回去,或使用hbase shell介面進行更改(有一個限制就是hbase shell get 出來的數據漢字是看不出來的),效率低,也不便於自動化的回歸。測試非常的被動。
於是在師姐的建議下期望有操作hbase數據的工具來提高我們的效率,及大數據的驗證。

二.工具簡介:
工具使用java編寫的jar包,在ihbase.sh進行簡單數據處理對jar包進行調用。主要功能為數據的增刪改查,支持gbk,utf8編碼。通過配置一個xml格式的配置文件 (也可以不配置)。
三.使用方法:
1.properties.sh:在裡面配置hbase,hadoop等環境變數,裡面目前默認是我們測試集群的配置作為參考。注意一些基礎的jar包一定要有。
2.config:xml格式的配置hbase導出數據的信息。在海量導出數據或根據rowkey到處數據的時候使用。
3.ihbase.sh工具的使用介面。
四.簡要使用介紹:
操作均在bin目錄下。

一.查詢數據功能
1. ./ihbase –t table_name -rowkey rowkey -enc encoding -s
-enc encoding這個的目的是指定以什麼編碼讀出hbase數據,目前支持utf8,gbk。如果不加該參數則默認以utf讀出。
查看錶名為table_name,rowkey為rowkey的數據。
2. ./ihbase –t 表名 –k CF:COLUMN=value –k CF:COLUMN=value –w column -s
./ihbase.sh –t "test" –k "a:name=jkfs" –k "a:id=111" -w "nid" -s
查詢滿足a:name=jkfs且a:id=111的記錄,若加上-w參數,則只顯示 -w 傳進去的列。若不加-w 顯示所有列。
(這個命令一般很少用,因為使用這個=的filer需要掃hbase全表,因為這種方式很少使用,所以暫時沒考慮如何優化)

二.刪除數據功能

1. ./ihbase –t table_name –rowkey rowkey –delete
根據rowkey進行刪除。
2. ./ihbase –t table_name –k CF:COLUMN=value –k CF:COLUMN=value –delete
./ihbase –t test –k "a:id=jaks" -k "name=a:jkasj" -delete
刪除滿足a:id=jaks且a:name=jkasf的數據(目前支持and進行刪除,不支持or,原理同該方式的查詢)

三.添加數據功能
./ihbase –t table_name –rowkey rowkey –v CF:COLUMN=value –v CF:COLUMN=value -a
./ihbase.sh –t "a:test" -rowkey "111" –v "a:name=jkfs" –v "id=111" -a

添加rowkey為111的數據,後面key,value可以任意指定。如果rowkey已經存在,則報錯不進行添加。
添加數據要求必須指定rowkey

四.修改數據功能
1. ./ihbase –t table_name –rowkey rowkey –v key=value -v key=value -u
./ihbase.sh -t "test" -rowkey "1111" –v "name=jkasjd" -u
根據rowkey進行修改一條記錄的列數據
2. ./ihbase –t table_name –k key=value –k CF:COLUMN=value -v CF:COLUMN=value -u
./ihbase.sh –t test –k "a:name=jksdj" –k "mge=kjdk" –v "a:name=huanyu" -u
根據非rowkey進行修改,-k 提供修改的條件,-u 提供要修改的列的數數據。(原理同查詢,scan全表)

五.導出hbase指定列的數據(所有數據)
./ihbase -f config 此處有一個限制:就是導出表的配置文件必須放在bin的目錄下。如果不喜歡這樣也可以修改ihbase腳本進行調整。
config為配置導出表信息的xml配置
<?xml version="1.0"?>
<configuration>
<table>
<in_enc>gbk</in_enc>
<out_enc>utf8</out_enc>
<tablename>test</tablename>
<field_separator>\001</field_separator>
<record_separator>\002</record_separator>
<column>
bmw_shops:title
</column>
<outpath>/test/huanyu/hbase</outpath>
</table>
</configuration>
in_enc:hbase中的編碼,以解析hbase中數據使用的編碼。
out_enc:輸出到hdfs路徑上的編碼。
tablename:操作的表名。
field_separator:如果導出多個欄位則作為多個欄位間的分隔符。
record_separator:導出數據的行分隔符。(除了\n的字元,因為默認會分行)。
column:導出的欄位。如果不存在該欄位則導出''。
outpath:導出數據的路徑。(其實應在代碼中把這個路徑先刪除的,但是怕用戶忘記修改路徑誤刪除,所以沒有這么做)
有多少個region 啟動多少個map。

六.導出hbase指定行的指定列的數據
./ihbase -f config -rf rfile
config裡面配置導出的列,字元編碼表名等信息。
rfile 配置導出哪些rowkey的數據。(一個rowkey一行)

類似上面。

七.幫助信息
./ihbase –h
顯示幫助信息