大數(shù)據(jù)培訓(xùn)-Module06HBase二次開發(fā)_第1頁
大數(shù)據(jù)培訓(xùn)-Module06HBase二次開發(fā)_第2頁
大數(shù)據(jù)培訓(xùn)-Module06HBase二次開發(fā)_第3頁
大數(shù)據(jù)培訓(xùn)-Module06HBase二次開發(fā)_第4頁
大數(shù)據(jù)培訓(xùn)-Module06HBase二次開發(fā)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、版權(quán)所有 2015 華為技術(shù)有限公司HBase二次開發(fā)第1頁.前言.第1頁HBase是一個高可靠性、高性能、面向列、可伸縮的分布式數(shù)據(jù)庫,設(shè)計目標(biāo)是用來解決關(guān)系型數(shù)據(jù)庫在處理海量數(shù)據(jù) 時的局限性。本章主要介紹HBase的接口以及二次開發(fā)的使用指導(dǎo)。目錄.第2頁1.HBase常用接口介紹常用Shell接口常用Java接口HBase常用接口.第3頁客戶端使用主要方式:HBase ShellHBase的命令行工具,最簡單的接口,適合 HBase管理使用。Java API HBase客戶端程序通過底層RPC接口與HBase集群進行通信,客戶程序直接集成HBase的Java包,通過調(diào)用相關(guān)API即可完成

2、操作。其余接口:REST 接口REST(Representational State Transfer)表述性狀態(tài)轉(zhuǎn) 移接口。Thrift接口Thrift 是一個基于靜態(tài)代碼生成的跨語言的RPC協(xié)議棧實 現(xiàn),它可以生成包括C+, Java, Python, Ruby, PHP 等主 流語言的代碼,這些代碼實現(xiàn)了 RPC 的協(xié)議層和傳輸層 功能,從而讓用戶可以集中精力于服務(wù)的調(diào)用和實現(xiàn)。Avro接口Avro是一個數(shù)據(jù)序列化系統(tǒng),設(shè)計用于支持大批量數(shù)據(jù) 交換的應(yīng)用。目錄.第4頁1.HBase常用接口介紹常用Shell接口常用Java接口常用Shell接口 連接通過/hbase shell來連接正在

3、運行的HBase Shell客戶端用法:/ 安全登錄,在進入hbase shell客戶端之前,需要進行安裝客戶端和用戶登錄的準(zhǔn)備工作,具體需要參考CPI文檔中安 裝與使用客戶端章節(jié)/進入HBase shell客戶端# .bin/hbase shellHBase Shell; enter help for list of supported commands. Type exit to leave the HBase ShellVersion 0.94.0, r, Sun Aug 26 22:12:56 CST 2012hbase(main):001:0.第5頁常用Shell接口 創(chuàng)建表創(chuàng)建表時

4、,可以選擇多個參數(shù),但表名和列族名是必須的參數(shù),其它參數(shù)還包括版本數(shù)、TTL 以及預(yù)分Region建表的key數(shù)組等用法:hbase create t1, NAME = f1, VERSIONS = 5hbase create t1, NAME = f1, NAME = f2, NAME = f3hbase # The above in shorthand would be the following: hbase create t1, f1, f2, f3hbase create t1, NAME = f1, VERSIONS = 1, TTL = 2592000, BLOCKCACHE =

5、 true hbase create t1, f1, SPLITS = 10, 20, 30, 40hbase create t1, f1, SPLITS_FILE = splits.txt hbase # Optionally pre-split the table into NUMREGIONS, usinghbase # SPLITALGO (HexStringSplit, UniformSplit or classname)hbase create t1, f1, NUMREGIONS = 15, SPLITALGO = HexStringSplit.第6頁常用Shell接口 插入一行

6、數(shù)據(jù)PutPut數(shù)據(jù)時,必選參數(shù)是表名、RowKey、列名(包括列族和列名)和值,可選參數(shù)包括時間戳用法:hbase put t1, r1, c1, value, ts1例如,向表test中put三條數(shù)據(jù),并通過count命令計算test表中的數(shù)據(jù)的條數(shù) 示例:/向表test中put數(shù)據(jù),RowKey為rowkey1,列族名為cf,列名為qualifier1,值為value1.第7頁hbase(main):002:0 0 row(s) in 0.5940 hbase(main):003:0 0 row(s) in 0.0080/指定時間戳為3 hbase(main):011:0 0 row(s

7、) in 0.0510 hbase(main):013:0 3 row(s) in 0.0160put test,rowkey1,cf:qualifier1,value1 secondsput test,rowkey2,cf:qualifier2,value2 secondsput test,rowkey3,cf:qualifier3,value3,3 secondscount test seconds常用Shell接口 讀取一行數(shù)據(jù)Get查詢一行數(shù)據(jù)時,必選參數(shù)是表名和RowKey,可選參數(shù)包括列名(包括列族和列名)、時間戳、版本數(shù)等用法:.第8頁hbase hbase hbase hbas

8、e hbase hbaseget t1,get t1,get t1,get t1,get t1,get t1,r1 r1,r1,r1,r1,r1,TIMERANGE= ts1, ts2= c1= c1, c2, c3=COLUMNCOLUMNCOLUMNCOLUMNc1,c1,TIMESTAMP TIMERANGE= ts1= ts1,ts2,VERSIONS = 4hbase get VERSIONS = 4t1,r1,COLUMN = c1,c1c1, c2c1, c2TIMESTAMP= ts1,hbase hbase hbaseget t1,get t1,get t1,r1,r1,r1

9、,常用Shell接口 讀取多行數(shù)據(jù)Scan查詢多行數(shù)據(jù),必選參數(shù)是表名,可選參數(shù)包括列名(包括列族和列名)、起止Key、Filter用法:/查詢元表.第9頁hbase hbase hbase hbase hbasescan scan scan scan scan.META.META., COLUMNS = info:regioninfot1,t1,t1,COLUMNS = c1, c2, LIMIT = 10, STARTROW = xyzCOLUMNS = c1, TIMERANGE = 1303668804, 1303668904FILTER = (PrefixFilter (row2)

10、AND (QualifierFilter s(=,binary:xyz)AND (TimestampsFilter hbase scan t1,( 123, 456)FILTER =org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0) hbase scan t1, COLUMNS = c1, c2, CACHE_BLOCKS = false hbase scan t1, RAW = true, VERSIONS = 10常用Shell接口 其他常用命令HBase還提供了一些其它的Shell API,包括general、d

11、dl、dml、tools、replication和security六組,每 組又包括多個Shell命令。每組命令和每個命令的用法均可以通過help查詢其用法COMMAND GROUPS:Group name: generalCommands: status, version, whoamiGroup name: ddlCommands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, is_disabled,

12、 is_enabled, list, show_filtersGroup name: dmlCommands: count, delete, deleteall, get, get_counter, incr, put,scan, truncateGroup name: toolsCommands: assign, balance_switch, balancer, close_region, compact, flush, hlog_roll, major_compact, move, split, unassign, zk_dumpGroup name: replicationComman

13、ds: add_peer, disable_peer, enable_peer, list_peers, remove_peer, start_replication, stop_replicationGroup name: securityCommands: grant, revoke, user_permission.第10頁目錄.第11頁1.HBase常用接口介紹常用Shell接口常用Java接口在開始使用HBase Java API之前,需要做幾項準(zhǔn)備工作: 要求JDK版本1.7及以上版本。HBase開發(fā)相關(guān)的jar包(包括ZooKeeper、HDFS、MapReduce等)需要和 H

14、Base集群節(jié)點上的版本保持一致。在hosts文件中添加HBase服務(wù)器節(jié)點的IP和HostName的映射關(guān)系。HBase采用的接口與Apache HBase保持一致,請參見:/apidocs/index.html.第12頁工程搭建 準(zhǔn)備工作1. 獲取客戶端安裝包中的配置文件core-site.xml、hbase-site.xml、hdfs- site.xml并放置在到Java工程中的conf目錄下。并將conf目錄添加到classpath下。 2. 獲取客戶端安裝包中的HBase開發(fā)依賴的jar文件,并添加到工程的classpath路 徑下。3.

15、具體操作請參考CPI文檔中開發(fā)環(huán)境準(zhǔn)備的章節(jié)。在Eclipse工具中,單擊“New Java Project”,輸入工程名,單擊“Finish” 即可創(chuàng)建Java工程。下載客戶端安裝包配置開發(fā)環(huán)境創(chuàng)建Java工程開發(fā)應(yīng)用編譯運行/ 初始化配置信息Configuration conf = HBaseConfiguration.create();/ 創(chuàng)建表HBaseAdmin admin = new HBaseAdmin(conf);admin.createTable(htd);/ 插入一行數(shù)據(jù)HTable table = new HTable(conf, tableName);Put put =

16、 new Put(Bytes.toBytes(012005000201); put.add(FAMILIES, Bytes.toBytes(name), Bytes.toBytes(張三); put.add(FAMILIES, Bytes.toBytes(gender), Bytes.toBytes(男);put.add(FAMILIES, Bytes.toBytes(address), Bytes.toBytes(廣東省深圳市);table.put(put);工程搭建 準(zhǔn)備工作.第13頁/ 安全版本Configuration conf = HBaseConfiguration.create(

17、);conf.addResource(user-hbase.xml);.第14頁if (User.isHBaseSecurityEnabled(conf) conf.set(HBASE_KEYTAB_FILE,System.getProperty(user.dir) + File.separator + conf+ File.separator + conf.get(HBASE_KEYTAB_FILE);String krbfilepath = System.getProperty(user.dir) + File.separator+ conf + File.separator + krb5

18、.conf; System.setProperty(java.security.krb5.conf, krbfilepath);try ZKUtil.loginClient(conf, HBASE_KEYTAB_FILE, HBASE_KERBEROS_PRINCIPAL, InetAddress.getLocalHost().getCanonicalHostName();User.login(conf, HBASE_KEYTAB_FILE, HBASE_KERBEROS_PRINCIPAL,InetAddress.getLocalHost().getCanonicalHostName();

19、catch (IOException e) e.printStackTrace();通過調(diào)用HBaseConfiguration的 create()方法來實例化。否則,將 無法正確加載HBase中的相關(guān)配置 項常用Java接口 創(chuàng)建安全版本的Configuration實例通過HBaseAdmin的createTable方法來創(chuàng)建一張表,指定表名、列族名稱。創(chuàng)建表分為快速建表和預(yù)分Region建表,前 者表示創(chuàng)建表后整張表只有一個Region,隨 著數(shù)據(jù)量的增加會自動分裂成多個Region; 后者表示,創(chuàng)建表時預(yù)先分配多個Region, 此種方法建表可以提高寫入大量數(shù)據(jù)初期的 數(shù)據(jù)寫入速度示例:

20、/ 表名和列族名稱String tableName = myTable; String families = f1;/ 通過已有的Configuration對象實例化一個HBaseAdmin對象HBaseAdmin admin = new HBaseAdmin(config);/ 表的描述信息,指定表名、列族名稱HTableDescriptor tableDesc = newHTableDescriptor(tableName);tableDesc.addFamily(new HColumnDescriptor(familiesi);/ 不預(yù)分Region建表admin.createTable

21、(tableDesc);/ 預(yù)分Region建表的兩種方式:/ 指定起止RowKey和Region個數(shù);此時的起始RowKey為第一個Region的 endKey,結(jié)束key為最后一個Region的startKey。 admin.createTable(tableDesc, Bytes.toBytes(10),Bytes.toBytes(800000), 30);/ 指定RowKey數(shù)組,不包括第一個Region的startKey和最后一個Region的 endKey,因此Region個數(shù)等于數(shù)組長度+1/ 例如以下語句創(chuàng)建的表包括4個Region,各Region的起止key分別為,a), a

22、,k), k,z),z,),可以看成左閉右開區(qū)間,a屬于a,k)這個Region,k屬于k,z)這個 Region,z屬于z,)這個Region。byte keys = Bytes.toBytes(a), Bytes.toBytes(k), Bytes.toBytes(z);admin.createTable(tableDesc, keys);.第15頁常用Java接口 創(chuàng)建表開啟壓縮功能有利于減少HBase中數(shù)據(jù)存儲 的冗余數(shù)據(jù),HBase中有兩類壓縮機制, HFile文件級別的壓縮Compress和 DataBlockEncode前綴壓縮。HBase中數(shù)據(jù) 存儲格式是HFile,文件級別的

23、壓縮既是針對 HFile的壓縮,前綴壓縮式針對HFile中數(shù)據(jù) 主要部分DataBlock進行壓縮。 使用HBase壓縮功能的方法是在創(chuàng)建表時, 針對列族在HColumnDescriptor類中通過接 口設(shè)置示例:columnDesc = new HColumnDescriptor(familiesi);/ 設(shè)置前綴壓縮,HBase提供了PREFIX、DIF、FAST_DIFF三種前綴壓 縮方法 columnDesc.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF);/ 設(shè)置文件壓縮,文件壓縮通常需要安裝壓縮算法共享庫,這里建議先先 通過/ o

24、rg.apache.hadoop.hbase.util.CompressionTest檢查一下壓縮算 法可用性columnDesc.setCompressionType(Algorithm.SNAPPY);tableDesc.addFamily(columnDesc);.第16頁常用Java接口 開啟壓縮方式HBase是一個面向列的數(shù)據(jù)庫,一行數(shù)據(jù), 可能對應(yīng)多個列族,而一個列族又可以對應(yīng) 多個列。通常,寫入數(shù)據(jù)的時候,我們需要 指定要寫入的列(含列族名稱和列名稱)。如果要往HBase表中寫入一行數(shù)據(jù),需要首 先構(gòu)建一個Put實例。Put中包含了數(shù)據(jù)的 RowKey值和指定列(含列族名稱和列名

25、稱) 的Value值,一個RowKey的Value值可以有 多個(即包含多個列)示例:/ 表的名稱為personprivate static final byte TABLENAME = Bytes.toBytes(person);/ 列族名稱的名稱為privateInfoprivate static final byte FAMILIES =Bytes.toBytes(privateInfo);.第17頁/ 列族privateInfo中有兩個列name和addressprivate static final byte qualifiers = Bytes.toBytes(name),Byte

26、s.toBytes(addres) ;/ 實例化一個put對象Put put = new Put(Bytes.toBytes(rowkey);put.add(FAMILIES, qualifiers0, Bytes.toBytes(values00 + i); put.add(FAMILIES, qualifiers0, Bytes.toBytes(values01 + i);/ 多個put存放到一個List中puts.add(put);/ 提交一次put數(shù)據(jù)請求hTable.put(puts);常用Java接口 插入數(shù)據(jù)Put從表中讀取一條數(shù)據(jù),首先需要實例化 該表對應(yīng)的HTable對象,然

27、后創(chuàng)建一個 Get對象。也可以為get對象設(shè)定參數(shù)值, 如列族的名稱和列的名稱。查詢結(jié)果的 該行數(shù)據(jù)存儲Result對象中,Result中 存儲了多個KeyValue對示例:HTable table = null;try table = new HTable(conf, tableName);Get get = new Get(rowKey.getBytes();/ 設(shè)定列族名和列名get.addColumn(family, qualifier);/ 設(shè)定列族名get.addFamily(family);Result result = table.get(get);for (KeyValue

28、kv : result.raw() System.out.println(kv.getRow() + + (kv.getFamily() + + (kv.getQualifier() + + kv.getTimestamp() + + kv.getValue() + ); catch (IOException e) / TODO finally if (null != table) try table.close(); catch (IOException e) / TODO.第18頁常用Java接口 讀取一行數(shù)據(jù)Get要從表中讀取數(shù)據(jù),首先需要實例化該表 對應(yīng)的HTable對象,然后創(chuàng)建一個

29、Scan對 象,并針對查詢條件設(shè)置scan的參數(shù)值, 為了提高查詢效率,最好指定StartKey和 EndKey。查詢結(jié)果的多行數(shù)據(jù)保存在 ResultScanner對象,每行數(shù)據(jù)以Result對 象形式存儲,Result中存儲了多個 KeyValue對示例:HTable table = null;ResultScanner rScanner = null; try table = new HTable(conf, tableName); Scan scan = new Scan(); scan.setStartRow(startRow); scan.setStopRow(stopRow);/

30、 重要參數(shù):每次RPC從服務(wù)端取回的記錄數(shù)scan.setCaching(1000);.第19頁rScanner = table.getScanner(scan);for (Result r = rScanner.next(); r != null; r = rScanner.next() for (KeyValue kv : r.raw() / TODO catch (IOException e) / TODO finally if (null != rScanner) rScanner.close();if (null != table) try table.close(); catch

31、(IOException e) / TODO常用Java接口 讀取多行數(shù)據(jù)Scan HBase Filter主要通過設(shè)置一些過濾條件,在 查詢(Scan)過程中進行Row級別的數(shù)據(jù)過濾。 可以設(shè)置RowKey過濾條件,也可以設(shè)置列名或 者列值的過濾條件。 HBase中提供了多種過濾器,這些過濾器都在 org.apache.hadoop.hbase.filter包中。單個過 濾器的使用,首先需要創(chuàng)建一個Scan對象,然后 設(shè)置該對象的Filter參數(shù)為過濾器對象。也可以多 個過濾器條件配合使用,采用FilterList。具體 HBase中提供了哪些filter,可以查詢API示例:Scan s

32、= new Scan();/ 前綴過濾器,查找RowKey以“132”開頭的行s.setFilter(new PrefixFilter(Bytes.toBytes(132);/ 查找符合條件的6行數(shù)據(jù)s.setFilter(new PageFilter(6);/ 多個過濾器結(jié)合使用FilterList list = new FilterList(Operator.MUST_PASS_ALL);list.addFilter(new SingleColumnValueFilter(family, qualifier,CompareOp.EQUAL, value); list.addFilter(n

33、ew PageFilter(6); s.setFilter(list);.第20頁常用Java接口 過濾器Filter示例:/ new IndexAdmin對象進行索引管理操作HBaseAdmin admin = new IndexAdmin(conf);.第21頁/ 創(chuàng)建表的Desc對象和列族對象String userTableName = testAddIndex;HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(userTableName); HColumnDescriptor hcd = new HColumnDescriptor(cf);htd.addFamily(hcd);/ 創(chuàng)建一個二級索引對象TableIndices tableIndices = new TableIndices(); tableIndices.addIndex(iSpec);IndexSpecification spec = new IndexSpecification(index1);spec.addIndexColumn(hcd, q1, ValueType.String, 10);/ 創(chuàng)建表和二級索引admin.createTable

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論