W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
HBase 0.95 版本增加了為表提供 jruby 風(fēng)格的面向?qū)ο笠玫?shell 命令。以前,作用于表的所有 shell 命令都具有程序風(fēng)格,該風(fēng)格始終將表的名稱作為參數(shù)。HBase 0.95 引入了將表分配給 jruby 變量的功能。表引用可以用來(lái)執(zhí)行數(shù)據(jù)讀寫(xiě)操作,比如放入、掃描、以及管理功能(如禁用,刪除,描述表等)。
例如,以前你總是會(huì)指定一個(gè)表名:
hbase(main):000:0> create ‘t’, ‘f’
0 row(s) in 1.0970 seconds
hbase(main):001:0> put 't', 'rold', 'f', 'v'
0 row(s) in 0.0080 seconds
hbase(main):002:0> scan 't'
ROW COLUMN+CELL
rold column=f:, timestamp=1378473207660, value=v
1 row(s) in 0.0130 seconds
hbase(main):003:0> describe 't'
DESCRIPTION ENABLED
't', {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_ true
SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2
147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false
', BLOCKCACHE => 'true'}
1 row(s) in 1.4430 seconds
hbase(main):004:0> disable 't'
0 row(s) in 14.8700 seconds
hbase(main):005:0> drop 't'
0 row(s) in 23.1670 seconds
hbase(main):006:0>
現(xiàn)在,您可以將該表分配給一個(gè)變量,并在 jruby shell 代碼中使用結(jié)果。
hbase(main):007 > t = create 't', 'f'
0 row(s) in 1.0970 seconds
=> Hbase::Table - t
hbase(main):008 > t.put 'r', 'f', 'v'
0 row(s) in 0.0640 seconds
hbase(main):009 > t.scan
ROW COLUMN+CELL
r column=f:, timestamp=1331865816290, value=v
1 row(s) in 0.0110 seconds
hbase(main):010:0> t.describe
DESCRIPTION ENABLED
't', {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_ true
SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2
147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false
', BLOCKCACHE => 'true'}
1 row(s) in 0.0210 seconds
hbase(main):038:0> t.disable
0 row(s) in 6.2350 seconds
hbase(main):039:0> t.drop
0 row(s) in 0.2340 seconds
如果該表已被創(chuàng)建,則可以使用 get_table 方法將一個(gè)表分配給一個(gè)變量:
hbase(main):011 > create 't','f'
0 row(s) in 1.2500 seconds
=> Hbase::Table - t
hbase(main):012:0> tab = get_table 't'
0 row(s) in 0.0010 seconds
=> Hbase::Table - t
hbase(main):013:0> tab.put ‘r1’ ,’f’, ‘v’
0 row(s) in 0.0100 seconds
hbase(main):014:0> tab.scan
ROW COLUMN+CELL
r1 column=f:, timestamp=1378473876949, value=v
1 row(s) in 0.0240 seconds
hbase(main):015:0>
列表功能也已被擴(kuò)展,以便它返回一個(gè)表名稱作為字符串的列表。然后,您可以使用 jruby 根據(jù)這些名稱對(duì)表操作進(jìn)行腳本編寫(xiě)。list_snapshots 命令的作用也相似。
hbase(main):016 > tables = list(‘t.*’)
TABLE
t
1 row(s) in 0.1040 seconds
=> #<#<Class:0x7677ce29>:0x21d377a4>
hbase(main):017:0> tables.map { |t| disable t ; drop t}
0 row(s) in 2.2510 seconds
=> [nil]
hbase(main):018:0>
在您的主目錄中為自己創(chuàng)建一個(gè) .irbrc 文件,添加自定義項(xiàng)。一個(gè)有用的是歷史記錄命令,因此命令可以跨 Shell 調(diào)用進(jìn)行保存:
$ more .irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"
請(qǐng)參閱 .irbrc 的 ruby 文檔以了解其他可能的配置。
要將日期“08/08/16 20:56:29”從 hbase 日志轉(zhuǎn)換為時(shí)間戳,請(qǐng)執(zhí)行以下操作:
hbase(main):021:0> import java.text.SimpleDateFormat
hbase(main):022:0> import java.text.ParsePosition
hbase(main):023:0> SimpleDateFormat.new("yy/MM/dd HH:mm:ss").parse("08/08/16 20:56:29", ParsePosition.new(0)).getTime() => 1218920189000
從走另一個(gè)方向:
hbase(main):021:0> import java.util.Date
hbase(main):022:0> Date.new(1218920189000).toString() => "Sat Aug 16 20:56:29 UTC 2008"
以與 HBase 日志格式完全相同的格式輸出將會(huì)對(duì) SimpleDateFormat 產(chǎn)生一些影響。
hbase(main):001:0> @shell.hbase.configuration.get("hbase.rpc.timeout")
=> "60000"
在 shell 中設(shè)置一個(gè)配置:
hbase(main):005:0> @shell.hbase.configuration.setInt("hbase.rpc.timeout", 61010)
hbase(main):006:0> @shell.hbase.configuration.get("hbase.rpc.timeout")
=> "61010"
在通過(guò) HBase Shell 的 create 命令創(chuàng)建表時(shí),您可以使用各種選項(xiàng)預(yù)先拆分表。
最簡(jiǎn)單的方法是在創(chuàng)建表格時(shí)指定一個(gè)分割點(diǎn)數(shù)組。請(qǐng)注意,當(dāng)將字符串文字指定為分割點(diǎn)時(shí),這些將根據(jù)字符串的基礎(chǔ)字節(jié)表示創(chuàng)建分割點(diǎn)。所以當(dāng)指定分割點(diǎn)“10”時(shí),我們實(shí)際上是指定了字節(jié)分割點(diǎn)“\x31\30”。
分割點(diǎn)將定義 n+1 區(qū)域,其中 n 是分割點(diǎn)的數(shù)量。最低的區(qū)域?qū)瑥淖畹涂赡艿逆I直到但不包括第一分割點(diǎn)密鑰的所有密鑰。下一個(gè)區(qū)域?qū)瑥牡谝粋€(gè)分割點(diǎn)開(kāi)始的密鑰,但不包括下一個(gè)分割點(diǎn)密鑰鍵。這將持續(xù)到最后的所有分界點(diǎn)。最后一個(gè)區(qū)域?qū)淖詈笠粋€(gè)拆分點(diǎn)定義為最大可能的密鑰。
hbase>create 't1','f',SPLITS => ['10','20',30']
在上面的例子中,將使用列族 "f" 創(chuàng)建表 "t1",預(yù)先拆分到四個(gè)區(qū)域。請(qǐng)注意,第一個(gè)區(qū)域?qū)瑥摹癨x00”到“\x30”(因?yàn)椤癨x31”是“1”的 ASCII 碼)的所有密鑰。
您可以使用以下變化將分割點(diǎn)傳遞到文件中。在這個(gè)例子中,分割是從對(duì)應(yīng)于本地文件系統(tǒng)上的本地路徑的文件中讀取的。文件中的每一行都指定一個(gè)分割點(diǎn)密鑰。
hbase>create 't14','f',SPLITS_FILE=>'splits.txt'
其他選項(xiàng)是根據(jù)所需的區(qū)域數(shù)量和分割算法自動(dòng)計(jì)算分割。HBase 提供基于統(tǒng)一拆分或基于十六進(jìn)制密鑰分割密鑰范圍的算法,但您可以提供自己的拆分算法來(lái)細(xì)分密鑰范圍。
# create table with four regions based on random bytes keys
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }
# create table with five regions based on hex keys
hbase>create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }
由于 HBase Shell 實(shí)際上是一個(gè) Ruby 環(huán)境,因此您可以使用簡(jiǎn)單的 Ruby 腳本以算法方式計(jì)算分割。
# generate splits for long (Ruby fixnum) key range from start to end key
hbase(main):070:0> def gen_splits(start_key,end_key,num_regions)
hbase(main):071:1> results=[]
hbase(main):072:1> range=end_key-start_key
hbase(main):073:1> incr=(range/num_regions).floor
hbase(main):074:1> for i in 1 .. num_regions-1
hbase(main):075:2> results.push([i*incr+start_key].pack("N"))
hbase(main):076:2> end
hbase(main):077:1> return results
hbase(main):078:1> end
hbase(main):079:0>
hbase(main):080:0> splits=gen_splits(1,2000000,10)
=> ["\000\003\r@", "\000\006\032\177", "\000\t'\276", "\000\f4\375", "\000\017B<", "\000\022O{", "\000\025\\\272", "\000\030i\371", "\000\ew8"]
hbase(main):081:0> create 'test_splits','f',SPLITS=>splits
0 row(s) in 0.2670 seconds
=> Hbase::Table - test_splits
請(qǐng)注意,HBase Shell 命令 truncate 有效地刪除并重新創(chuàng)建具有默認(rèn)選項(xiàng)的表格,這將丟棄任何預(yù)分割。如果您需要截?cái)囝A(yù)分割表,則必須顯式刪除并重新創(chuàng)建表以重新指定自定義分割選項(xiàng)。
您可以在 shell 中設(shè)置一個(gè)調(diào)試開(kāi)關(guān),以查看更多輸出 - 例如,運(yùn)行命令時(shí)出現(xiàn)更多的異常堆棧跟蹤:
hbase> debug <RETURN>
要在 shell 中啟用 DEBUG 級(jí)日志記錄,請(qǐng)使用該 -d 選項(xiàng)啟動(dòng)它:
$ ./bin/hbase shell -d
Count 命令返回表中的行數(shù)。配置正確的 CACHE 時(shí)速度非??欤?/p>
hbase> count '<tablename>', CACHE => 1000
上述計(jì)數(shù)一次取 1000 行。如果行很大,請(qǐng)將 CACHE 設(shè)置得較低。默認(rèn)是每次讀取一行。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: