Hadoop簡明教程 課件 第5、6章 分布式數(shù)據(jù)庫HBase、數(shù)據(jù)倉庫Hive_第1頁
Hadoop簡明教程 課件 第5、6章 分布式數(shù)據(jù)庫HBase、數(shù)據(jù)倉庫Hive_第2頁
Hadoop簡明教程 課件 第5、6章 分布式數(shù)據(jù)庫HBase、數(shù)據(jù)倉庫Hive_第3頁
Hadoop簡明教程 課件 第5、6章 分布式數(shù)據(jù)庫HBase、數(shù)據(jù)倉庫Hive_第4頁
Hadoop簡明教程 課件 第5、6章 分布式數(shù)據(jù)庫HBase、數(shù)據(jù)倉庫Hive_第5頁
已閱讀5頁,還剩159頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章分布式數(shù)據(jù)庫HBase5.1.1從BigTable說起嵌入式系統(tǒng)基本概念為解決海量數(shù)據(jù)存儲的問題,Google的軟件開發(fā)工程師研發(fā)了BigTable,并于2005年4月投入使用。BigTable

是以GFS作為底層數(shù)據(jù)存儲,以Google的MapReduce為分布式計(jì)算框架,可以用于存儲和處理海量數(shù)據(jù)。每個Table都是一個多維的稀疏表。BigTable的設(shè)計(jì)目的是可靠地處理PB級別的數(shù)據(jù),并且能夠部署到成千上萬臺機(jī)器上。2006年,Google發(fā)表了題為《Bigtable:ADistributedStorageSystemforStructuredData》的論文,啟發(fā)了眾多的NoSQL數(shù)據(jù)庫,比如:HBase等。5.1.2HBase簡介嵌入式系統(tǒng)基本概念

HBase是HadoopDatabase的簡稱,是GoogleBigTable的開源實(shí)現(xiàn)。HBase是一個高可靠、高性能、列存儲、可伸縮、實(shí)時(shí)讀寫的分布式數(shù)據(jù)庫系統(tǒng),是Hadoop生態(tài)系統(tǒng)的重要組成部分之一。它主要用來存儲非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。HBase利用Hadoop的HDFS作為其文件存儲系統(tǒng),利用廉價(jià)集群提供海量數(shù)據(jù)存儲能力;利用HadoopMapReduce來處理HBase中的海量數(shù)據(jù),實(shí)現(xiàn)高性能計(jì)算;使用ZooKeeper作為協(xié)同服務(wù),實(shí)現(xiàn)集群穩(wěn)定運(yùn)行和失敗恢復(fù)。5.1.3HBase具有的特點(diǎn)嵌入式系統(tǒng)基本概念

1.存儲空間大2.具有可伸縮性3.面向列4.適應(yīng)稀疏表5.數(shù)據(jù)類型單一5.2HBase數(shù)據(jù)模型嵌入式系統(tǒng)基本概念數(shù)據(jù)模型是一個數(shù)據(jù)庫產(chǎn)品的核心,邏輯上,HBase以表的形式呈現(xiàn)給最終用戶,物理上,HBase以文件的形式存儲在HDFS中。5.2.1數(shù)據(jù)模型概述嵌入式系統(tǒng)基本概念

HBase是以表的形式存儲數(shù)據(jù),每個表由行和列組成,每一行都有一個可排序的行鍵和任意多的列,每個列屬于一個特定的列族,同一個列族里面的數(shù)據(jù)存儲在一起。列族支持動態(tài)擴(kuò)展,我們可以很輕松地添加一個列族或列。無需預(yù)先定義列的數(shù)量以及類型,表中存儲的每個值是一個未經(jīng)解釋的字符串,以字節(jié)數(shù)組byte[]形式存儲,沒有數(shù)據(jù)類型,用戶需要自行進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。HBase中執(zhí)行更新操作時(shí),并不會刪除數(shù)據(jù)舊的版本,而是生成一個新的版本,不同版本用時(shí)間戳來區(qū)分。5.2.2數(shù)據(jù)模型的相關(guān)概念嵌入式系統(tǒng)基本概念

1.表HBase采用表來組織數(shù)據(jù),表由行、列族和列組成,每個行由行鍵來標(biāo)識,一般按行鍵的字典順序進(jìn)行排序。2.行鍵每一行代表著一個數(shù)據(jù)對象,由行鍵來唯一標(biāo)識,行鍵會被建立索引,數(shù)據(jù)的獲取通過行鍵來完成。行鍵可以使用任意字符串表示。在HBase內(nèi)部,行鍵被保存為字節(jié)數(shù)組。5.2.2數(shù)據(jù)模型的相關(guān)概念嵌入式系統(tǒng)基本概念

3.列族列族是列限定符的集合,一個表包含多個列族,在創(chuàng)建表時(shí)必須要聲明列族。HBase所謂的列式存儲就是指數(shù)據(jù)按列族進(jìn)行存儲,這種設(shè)計(jì)可以方便地進(jìn)行數(shù)據(jù)分析。4.列限定符簡稱列,表中具體一個列的名字,列族里的數(shù)據(jù)通過列限定符來定位,列限定符不用事先定義,也不需在不同行之間保持一致。一個列族的所有列限定符使用相同的前綴(列族名稱)。5.2.2數(shù)據(jù)模型的相關(guān)概念嵌入式系統(tǒng)基本概念

6.單元格在HBase表中,通過行、列族和列限定符確定一個單元格,單元格的數(shù)據(jù)沒有特定的數(shù)據(jù)類型,以byte[]來存儲。7.時(shí)間戳每個單元格都保存著同一份數(shù)據(jù)的多個版本,這些版本采用時(shí)間戳來進(jìn)行索引。時(shí)間戳的類型是64位的整型。5.2.2數(shù)據(jù)模型的相關(guān)概念嵌入式系統(tǒng)基本概念

圖5-1HBase數(shù)據(jù)模型的一個實(shí)例5.3HBase系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

圖5-2HBase的系統(tǒng)架構(gòu)5.3HBase系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念1.客戶端客戶端包含訪問HBase的接口,同時(shí)在緩存中維護(hù)著已經(jīng)訪問過的Region位置信息,用來加快后續(xù)數(shù)據(jù)訪問過程??蛻舳送ㄟ^RPC機(jī)制與HBase的Master主服務(wù)器和Region服務(wù)器進(jìn)行通信,客戶端與Master主服務(wù)器進(jìn)行管理類通信,客戶端與Region服務(wù)器進(jìn)行數(shù)據(jù)讀寫類通信。圖5-2HBase的系統(tǒng)架構(gòu)5.3HBase系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

圖5-2HBase的系統(tǒng)架構(gòu)2.Zookeeper服務(wù)器Zookeeper是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,它存儲了-ROOT-表的地址和Master主服務(wù)器的地址,通過-ROOT-表的地址可尋址所需的數(shù)據(jù)。通過Zookeeper服務(wù)器,Master主服務(wù)器可以隨時(shí)感知到各個Region服務(wù)器的運(yùn)行狀態(tài)。HBase中可以啟動多個Master,Zookeeper可以幫助選舉出一個Master作為集群的Master主服務(wù)器,并保證在任何時(shí)刻總有唯一一個Master主服務(wù)器在運(yùn)行,這就可以避免Master的“單點(diǎn)失效”問題。5.3HBase系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念3.Master主服務(wù)器

Master主服務(wù)器負(fù)責(zé)管理表和Region,主要的作用包括:管理用戶對表的增刪改查操作;為Region服務(wù)器分配Region,負(fù)責(zé)Region服務(wù)器的負(fù)載均衡;在Region分裂或合并后,負(fù)責(zé)重新調(diào)整Region的分布;將發(fā)生故障的Region服務(wù)器上的Region遷移到其它的Region服務(wù)器上。圖5-2HBase的系統(tǒng)架構(gòu)5.3HBase系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

圖5-2HBase的系統(tǒng)架構(gòu)4.Region服務(wù)器Region是HBase中分布式存儲和負(fù)載均衡的基本單位。Region服務(wù)器是HBase的從服務(wù)器,HBase集群中可以有多個Region服務(wù)器,一個Region服務(wù)器可以存放多個Region。Region服務(wù)器負(fù)責(zé)維護(hù)分配給自己的Region,并響應(yīng)用戶的讀寫請求。5.5HBaseShell嵌入式系統(tǒng)基本概念

HBase提供了一個與用戶交互的Shell終端,HBase還為用戶提供了較方便的Shell命令,通過這些命令我們可以方便地對表、列族、列等進(jìn)行操作。5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

1.create:創(chuàng)建表例如:創(chuàng)建表temp1,該表具有f1、f2、f3三個列族,命令如圖5-9所示,注意表名和列族都要用單引號括起來,并以逗號隔開。圖5-9create:創(chuàng)建表5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

2.list:列出HBase中所有的表信息例如:列出當(dāng)前HBase中所有的表信息,命令如圖5-10所示。圖5-10list:列出HBase中所有的表信息5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

3.put:向表、行、列指定的單元格添加數(shù)據(jù)put命令的格式:put表名,行鍵,列族:列名,值。例如:向表temp1中的第r3行、第“f2:x1”列,添加數(shù)據(jù)“hello,hbase”。向第r3行、第“f2:x3”列,添加數(shù)據(jù)“hello,hadoop”。向第r3行、第“f1:y1”列,添加數(shù)據(jù)“123456”。命令如圖5-11所示。5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念圖5-11put:向表、行、列指定的單元格添加數(shù)據(jù)5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

4.get:通過表名、行、列、時(shí)間戳、時(shí)間范圍和版本號來獲得相應(yīng)單元格的值。例如:獲得表temp1中的第r3行的數(shù)據(jù)。獲得表temp1中的第r3行f2列族的數(shù)據(jù)。獲得表temp1中的第r3行f2列族x1列的數(shù)據(jù)。命令如圖5-12所示。5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

圖5-12get命令的使用5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

5.scan:按指定范圍掃描表可以通過TIMERANGE、FILTER、LIMIT、STARTROW、STOPROW、TIMESTAMP、MAXLENGTH、COLUMNS、CACHE來限定所需要瀏覽的數(shù)據(jù)。例如:查看表temp1中的所有數(shù)據(jù)。命令如圖5-13所示。圖5-13查看表temp1中的所有數(shù)據(jù)5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

6.describe:查看表結(jié)構(gòu)

describe命令也可以簡寫成desc。例如:查看表temp1的表結(jié)構(gòu)。命令如圖5-14所示。圖5-9create:創(chuàng)建表5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

圖5-14查看表temp1的相關(guān)信息5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

7.alter:修改列族模式例如:向表temp1添加列族f5,命令如圖5-15所示。另外,可用describe'temp1'命令檢查添加列族是否成功。圖5-15向表temp1添加列族f55.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念刪除表temp1中的列族f5,命令如圖5-16所示。圖5-16刪除表temp1中的列族f55.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

8.delete:刪除指定單元格的數(shù)據(jù)例如:刪除表temp1中的第r3行f1列族y1列的數(shù)據(jù),命令如圖5-17所示??梢杂胹can'temp1'查看刪除結(jié)果。圖5-17刪除表temp1中的第r3行f1列族y1列的數(shù)據(jù)5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

9.count:統(tǒng)計(jì)表中的行數(shù)例如:統(tǒng)計(jì)表temp1的行數(shù),命令如圖5-18所示。圖5-18統(tǒng)計(jì)表temp1的行數(shù)5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

10.exists:判斷表是否存在例如:判斷表temp1是否存在,命令如圖5-19所示。圖5-19判斷表temp1是否存在5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

11.truncate:清空表中的數(shù)據(jù),但保留表結(jié)構(gòu)例如:清空表temp1中的數(shù)據(jù),命令如圖5-20所示。圖5-20清空表temp1中的數(shù)據(jù)5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

12.enable/disable:使表有效(啟用表)/使表無效(禁用表)

13.drop:刪除表如果要徹底刪除表數(shù)據(jù)和表結(jié)構(gòu),必須先使該表無效,然后刪除該表。例如:刪除表temp1,可用list命令檢查刪除結(jié)果,命令如圖5-21所示。5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念圖5-9create:創(chuàng)建表5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

14.status:查看HBase集群狀態(tài)信息可以通過summary、simple或者detailed這3個參數(shù)指定輸出信息的詳細(xì)程度。例如:輸出HBase集群概要狀態(tài)信息,命令如圖5-22所示。圖5-22輸出HBase集群概要狀態(tài)信息5.5.1HBaseShell常用命令嵌入式系統(tǒng)基本概念

15.version:查看HBase版本信息例如:輸出當(dāng)前HBase的版本信息,如圖5-23所示。圖5-23輸出當(dāng)前HBase的版本信息5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

【例5-1】請用HBaseShell命令完成以下操作1.創(chuàng)建一個學(xué)生信息表student,其表結(jié)構(gòu)如表5-1所示。number(學(xué)號)作為行鍵,info列族下有name(姓名)、class(班級)兩個列,score列族下面的english、math、Chinese三個列用于存儲三門課的考試成績。5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

2.向表student中插入number為2021001和2021002的兩條記錄。3.查詢2021001的math成績。4.查詢2021002的全部信息。5.刪除2021002的math成績。5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

1.創(chuàng)建學(xué)生信息表student

hbase(main):001:0>create'student','info','score’

5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

2.向表student中插入記錄。

hbase(main):002:0>put'student','2021001','info:name','zhangsan’

hbase(main):003:0>put'student','2021001','info:class','A’

hbase(main):004:0>put'student','2021001','score:english','85’

hbase(main):005:0>put'student','2021001','score:math','78’

hbase(main):006:0>put'student','2021001','score:Chinese','89'5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念我們可以把全部或部分的HBaseShell命令寫入一個文件內(nèi),像LinuxShell腳本程序那樣順序執(zhí)行。例如將2021002的記錄插入student表中所有命令寫入test.sh文件內(nèi),test.sh內(nèi)容如下:

put'student','2021002','info:name','lisi’put'student','2021002','info:class','B’put'student','2021002','score:english','80’put'student','2021002','score:math','91’put'student','2021002','score:Chinese','86’用exit退出HBaseShell,執(zhí)行腳本文件:hbaseshell/user/data/test.sh,執(zhí)行結(jié)果如圖5-24所示。5.5.2HBaseShell應(yīng)用實(shí)例

圖5-24hbaseshell/user/data/test.sh的執(zhí)行結(jié)果5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念掃描全表,查看插入操作完成后,student表中的數(shù)據(jù),如圖5-25所示。圖5-25插入操作完成后,student表中的數(shù)據(jù)5.5.2HBaseShell應(yīng)用實(shí)例嵌入式系統(tǒng)基本概念

3.查詢2021001的math成績。

hbase(main):008:0>get'student','2021001','score:math’4.查詢2021002的全部信息。

hbase(main):009:0>get'student','2021002’5.刪除2021002的math成績。

hbase(main):010:0>delete'student','2021002','score:math'

5.6HBaseJavaAPI嵌入式系統(tǒng)基本概念通過上一節(jié)的學(xué)習(xí),我們已基本掌握了HBaseShell命令的使用方法。但在很多情況下,我們還需要通過Java編程來操作HBase。HBase是使用Java語言編寫的,提供了較為全面JavaAPI。利用這些API可以編寫出功能豐富的程序,對HBase進(jìn)行各種操作。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

1.HBaseConfiguration

該類是客戶端必須要使用的,它會償試著從hbase-site.xml文件中讀取配置信息,可以使用成員方法create()來初始化HBase的配置文件。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

2.AdminAdmin可以用于創(chuàng)建表,刪除表,列出表項(xiàng),使表有效(啟用表),使表無效(禁用表),或者修改表,以及執(zhí)行其他管理操作。該接口需要從Connection.getAdmin()中獲取一個實(shí)例,并在使用完成后調(diào)用close()。該接口提供的常用方法有:

voidcreateTable(TableDescriptordesc)throwsIOException

創(chuàng)建一個新表。voiddeleteTable(TableName

tableName)throwsIOException用于刪除一個表。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

voiddisableTable(TableName

tableName)throwsIOException

禁用表并等待完成。最終可能會超時(shí)。voidenableTable(TableName

tableName)throwsIOException

啟用一個表??赡軙瑫r(shí)。voidmodifyTable(TableDescriptortd)throwsIOException

修改現(xiàn)有的表。

boolean

tableExists(TableName

tableName)throwsIOException

檢查指定名稱的表是否存在。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

3.ConnectionConnection接口通過ConnectionFactory類調(diào)用createConnection()方法來實(shí)例化連接。連接使用完成后,必須調(diào)用close()方法關(guān)閉連接,以便釋放資源。連接實(shí)例建立到zookeeper的連接,查找master主節(jié)點(diǎn),在集群上定位region。連接實(shí)例到服務(wù)器、元數(shù)據(jù)緩存、zookeeper等的連接都與Table和Admin實(shí)例共享。該接口提供的常用方法有:5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

voidclose()throwsIOException

關(guān)閉連接,釋放資源。AdmingetAdmin()throwsIOException

返回一個Admin實(shí)例,來管理一個HBase集群。defaultTablegetTable(TableName

tableName)throwsIOException

通過表名獲取表的實(shí)例。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

4.TableDescriptorBuilder

TableDescriptorBuilder封裝了與表相關(guān)的屬性與操作。該類提供的常用方法有:publicstaticTableDescriptorBuilder

newBuilder(TableNamename)根據(jù)表名創(chuàng)建TableDescriptorBuilder類型的實(shí)例。publicTableDescriptorBuilder

setColumnFamily(ColumnFamilyDescriptorfamily)添加一個列族publicTableDescriptorBuilder

removeColumnFamily(byte[]name)移除一個列族。

5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

5.TableDescriptor

TableDescriptor實(shí)例包含了一個HBase表的詳細(xì)信息,比如所有列族的描述符。該接口提供的常用方法有:

ColumnFamilyDescriptor[]getColumnFamilies()返回表中所有列族的ColumnFamilyDescriptor實(shí)例,該實(shí)例不可修改。

ColumnFamilyDescriptor

getColumnFamily(byte[]name)返回名稱由參數(shù)列指定的列族的ColumnFamilyDescriptor。intgetColumnFamilyCount()返回表的列族數(shù)。TableName

getTableName()獲取表的名稱。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

6.ColumnFamilyDescriptorBuilder

該類為列族構(gòu)建類,提供的常用方法有:publicstaticColumnFamilyDescriptorBuilder

newBuilder(byte[]name)根據(jù)列族名創(chuàng)建ColumnFamilyDescriptorBuilder類型的對象。publicColumnFamilyDescriptorbuild()該方法返回ColumnFamilyDescriptor的實(shí)例。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

7.ColumnFamilyDescriptor

ColumnFamilyDescriptor包含關(guān)于列族的信息,如版本數(shù)、壓縮設(shè)置等。它通常在創(chuàng)建表或者為表添加列族的時(shí)候使用。該接口提供的常用方法有:byte[]getName()獲取列族的名字。byte[]getValue(byte[]key)獲取對應(yīng)的屬性的值。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

8.Table

用于與單個HBase表通信。從Connection中獲取一個實(shí)例,使用完成后調(diào)用close()。Table可以用于從表中獲取、放置、刪除或掃描數(shù)據(jù)。該接口提供的常用方法有:

defaultvoidclose()throwsIOException

釋放內(nèi)部緩沖區(qū)中占用或掛起的任何資源。defaultvoiddelete(Deletedelete)throwsIOException

刪除指定的單元格/行。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

defaultbooleanexists(Getget)throwsIOException

檢查Get實(shí)例所指定的值是否存在于Table的列中。defaultResultget(Getget)throwsIOException

從給定的行獲取特定單元格的值。defaultResultScanner

getScanner(Scanscan)throwsIOException

獲取Scan對象指定的ResultScanner實(shí)例。defaultResultScanner

getScanner(byte[]family)throwsIOException

獲取當(dāng)前給定列族的ResultScanner實(shí)例。defaultvoidput(Putput)throwsIOException

向表中添加值。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

9.PutPut執(zhí)行單行添加操作。一個Put實(shí)例代表一行記錄。該類提供的常用方法有:

publicPutaddColumn(byte[]family,byte[]qualifier,byte[]value)將列族和列限定符對應(yīng)值添加到一個put實(shí)例中。publicPutaddColumn(byte[]family,byte[]qualifier,long

ts,byte[]value)將列族和列限定符對應(yīng)的值及時(shí)間戳添加到Put實(shí)例中。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

10.Get

獲取單行實(shí)例相關(guān)信息,包括列、列族、時(shí)間戳等。該類提供的常用方法有:publicGetaddColumn(byte[]family,byte[]qualifier)獲取指定列族和列限定符對應(yīng)的值。publicGetaddFamily(byte[]family)獲取指定列族對應(yīng)的所有列的值。publicGetsetFilter(Filterfilter)執(zhí)行Get操作時(shí)設(shè)置服務(wù)器端的過濾器。publicGetsetTimeRange(longminStamp,long

maxStamp)throwsIOException

僅獲取指定時(shí)間戳范圍內(nèi)的列版本。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

11.Scan

獲取所有行信息。該類提供的常用方法有:publicScanaddColumn(byte[]family,byte[]qualifier)類似Get類的對應(yīng)函數(shù)。publicScanaddFamily(byte[]family)類似Get類的對應(yīng)函數(shù)。publicScansetTimeRange(longminStamp,long

maxStamp)throwsIOException

指定最大時(shí)間戳和最小時(shí)間戳,提取指定范圍的所有Cell。

5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

publicScansetFilter(Filterfilter)指定Filter來過濾掉不需要的信息。publicScansetStartRow(byte[]startRow)指定開始的行。如果不調(diào)用,則從表頭開始。publicScansetStopRow(byte[]stopRow)指定結(jié)束行(不含此行)。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

12.ResultResult類,存儲Get或者Scan操作后獲取表的單行值。使用此類提供的方法可以直接獲取值或者各種Map結(jié)構(gòu)(key-value對)。該類提供的常用方法有:publicboolean

containsColumn(byte[]family,byte[]qualifier)檢查指定列的值是否存在(是否為空)。publicNavigableMap<byte[],byte[]>getFamilyMap(byte[]family)獲取指定列族包含的列限定符和值之間的鍵值對。publicbyte[]getValue(byte[]family,byte[]qualifier)獲取對應(yīng)列的最新值。5.6.1HBaseJavaAPI簡介嵌入式系統(tǒng)基本概念

13.ResultScanner

客戶端獲取值的接口。該接口提供的常用方法有:voidclose()關(guān)閉scanner并釋放分配給它的資源。Resultnext()throwsIOException

獲取下一行的值。5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

【例5-2】請用HBaseJavaAPI創(chuàng)建一個雇員信息表employees,其表結(jié)構(gòu)如表5-2所示。name作為行鍵,address列族下有province、city兩個列,info列族下有height、weight、birthday三個列。請向employees中插入行鍵為zhangsan的記錄。然后全表掃描并輸出所有數(shù)據(jù)。表5-2雇員信息表employees5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.hadoop.hbase.util.Bytes;5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念publicclassEmployees{ publicstaticvoidmain(String[]args)throwsIOException{ Configurationconfiguration=HBaseConfiguration.create(); /**192.168.0.130是本虛擬機(jī)的IP地址,可用localhost代替*/configuration.set("hbase.rootdir","hdfs://192.168.0.130:9000/hbase"); /**實(shí)例化連接*/ Connectionconnection=ConnectionFactory.createConnection(configuration);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念A(yù)dminadmin=connection.getAdmin(); StringmyTableName="employees";

TableName

tableName=TableName.valueOf(myTableName); /**如果存在要創(chuàng)建的表,那么先刪除,再創(chuàng)建*/ if(admin.tableExists(tableName)){

admin.disableTable(tableName);

admin.deleteTable(tableName);

System.out.println(tableName+"isexist,detele....");}5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

/**創(chuàng)建表描述構(gòu)建對象*/

TableDescriptorBuilder

tableDesBuilder=TableDescriptorBuilder.newBuilder(tableName);/**添加列族之前,先要創(chuàng)建列族構(gòu)建對象,列族名為info*/

ColumnFamilyDescriptorBuilder

cFamilyBuilderInfo=ColumnFamilyDescriptorBuilder.newBuilder("info".getBytes());/**構(gòu)建列族描述對象*/

ColumnFamilyDescriptor

cFamilyDescriptorInfo=cFamilyBuilderInfo.build();5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**添加一個列族*/

tableDesBuilder.setColumnFamily(cFamilyDescriptorInfo);

ColumnFamilyDescriptorBuilder

cFamilyBuilderAddress=ColumnFamilyDescriptorBuilder.newBuilder("address".getBytes());/**構(gòu)建列族描述對象*/

ColumnFamilyDescriptor

cFamilyDescriptorAddress=cFamilyBuilderAddress.build();/**添加一個列族*/

tableDesBuilder.setColumnFamily(cFamilyDescriptorAddress);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**構(gòu)建表描述對象*/

TableDescriptor

tableDesc=tableDesBuilder.build();

admin.createTable(tableDesc);//創(chuàng)建表

/**通過表名獲取表的實(shí)例*/ Tabletable=connection.getTable(tableName);/**創(chuàng)建一個Put實(shí)例,對應(yīng)的行鍵為zhangsan*/Putput=newPut(Bytes.toBytes("zhangsan"));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**往put實(shí)例中添加一個單元格的值,列簇為info的值,列名為hight,值為1698*/

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("height"),Bytes.toBytes("1698"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("weight"),Bytes.toBytes("70"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("birthday"),Bytes.toBytes("2005-06-08"));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

put.addColumn(Bytes.toBytes("address"),Bytes.toBytes("province"),Bytes.toBytes("guangdong"));

put.addColumn(Bytes.toBytes("address"),Bytes.toBytes("city"),Bytes.toBytes("guangzhou"));/**將put實(shí)例內(nèi)容添加到table實(shí)例指定的表中*/

table.put(put); Scans=newScan(); /**scan全表掃描*/

ResultScanner

rs=table.getScanner(s);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

/**遍歷并打印出結(jié)果集中指定數(shù)據(jù)的信息*/for(Resultr:rs){ Cell[]cell=r.rawCells(); inti=0; intcellcount=r.rawCells().length;

System.out.print("行健:"+Bytes.toString(CellUtil.cloneRow(cell[i]))); for(i=0;i<cellcount;i++){

System.out.print(""+Bytes.toString(CellUtil.cloneFamily(cell[i])));

System.out.print(":"+Bytes.toString(CellUtil.cloneQualifier(cell[i])));

System.out.print(""+Bytes.toString(CellUtil.cloneValue(cell[i])));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

System.out.print("時(shí)間戳:"+cell[i].getTimestamp());

System.out.println(); }

System.out.println(); }

table.close();

admin.close();

connection.close(); }}5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念【例5-3】請用HBaseJavaAPI完成【例5-1】的各種操作。完成本例題的程序源代碼如下:importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.hadoop.hbase.util.Bytes;importjava.io.IOException;5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念publicclassstudent{ publicstaticConfigurationconfiguration; publicstaticConnectionconnection; publicstaticAdminadmin; publicstaticvoidmain(String[]args)throwsIOException{

createTable("student",newString[]{"info","score"});

insertData("student","2021001","info","name","zhangsan");

insertData("student","2021001","info","class","A");

insertData("student","2021001","score","english","85");

insertData("student","2021001","score","math","78");

insertData("student","2021001","score","Chinese","89");5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

insertData("student","2021002","info","name","lisi");

insertData("student","2021002","info","class","B");

insertData("student","2021002","score","english","80");

insertData("student","2021002","score","math","91");

insertData("student","2021002","score","Chinese","86");

getAllRows("student");

getData("student","2021001","score","math");

getRow("student","2021002");

delData("student","2021002","score","math");

getRow("student","2021002"); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

/**建立連接*/ publicstaticvoidinit(){ configuration=HBaseConfiguration.create(); /**192.168.0.130是本虛擬機(jī)的IP地址,可用localhost代替*/

configuration.set("hbase.rootdir","hdfs://192.168.0.130:9000/hbase"); try{ connection=ConnectionFactory.createConnection(configuration); admin=connection.getAdmin(); }catch(IOExceptione){

e.printStackTrace(); } }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**關(guān)閉連接*/ publicstaticvoidclose(){ try{ if(admin!=null){

admin.close(); } if(null!=connection){

connection.close(); } }catch(IOExceptione){

e.printStackTrace(); }}5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**創(chuàng)建表*/ /**@parammyTableName

表名 *@paramcolFamily列族數(shù)組 *@throwsIOException*/ publicstaticvoidcreateTable(StringmyTableName,String[]colFamily)throwsIOException{

init();

TableName

tableName=TableName.valueOf(myTableName);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**如果存在要創(chuàng)建的表,那么先刪除,再創(chuàng)建*/ if(admin.tableExists(tableName)){

admin.disableTable(tableName);

admin.deleteTable(tableName);

System.out.println(tableName+"isexist,detele...."); } /**創(chuàng)建表描述構(gòu)建對象*/

TableDescriptorBuilder

tableDesBuilder=TableDescriptorBuilder.newBuilder(tableName);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念for(Stringstr:colFamily){ /**添加列族之前,先要創(chuàng)建列族構(gòu)建對象,列族名為str*/

ColumnFamilyDescriptorBuilder

cFamilyBuilder=ColumnFamilyDescriptorBuilder.newBuilder(str.getBytes()); /**構(gòu)建列族描述對象*/

ColumnFamilyDescriptor

cFamilyDescriptor=cFamilyBuilder.build(); /**添加一個列族*/

tableDesBuilder.setColumnFamily(cFamilyDescriptor); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**構(gòu)建表描述對象*/

TableDescriptor

tableDescriptor=tableDesBuilder.build();

admin.createTable(tableDescriptor);//創(chuàng)建表

close(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**添加數(shù)據(jù)*/ /**@paramtableName

表名 *@paramrowkey

行鍵 *@paramfamily列族 *@paramcolumn列限定符 *@paramvalue數(shù)據(jù) *@throwsException*/

publicstaticvoidinsertData(StringtableName,Stringrowkey, Stringfamily,Stringcolumn,Stringvalue)throwsIOException{

init(); Tabletable=connection.getTable(TableName.valueOf(tableName));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**創(chuàng)建一個Put實(shí)例,對應(yīng)的行鍵為rowkey的值*/ Putput=newPut(Bytes.toBytes(rowkey)); /**往put實(shí)例中添加一個單元格的值,列簇為family的值,列名為column的值,值為value的值*/

put.addColumn(Bytes.toBytes(family),Bytes.toBytes(column),

Bytes.toBytes(value)); /**將put實(shí)例內(nèi)容添加到table實(shí)例指定的表中*/

table.put(put);

table.close(); close(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**獲取某單元格數(shù)據(jù)*/ /**@paramtableName

表名 *@paramrowkey

行鍵 *@paramfamily列族 *@paramcolumn列限定符 *@throwsIOException*/ publicstaticvoidgetData(StringtableName,Stringrowkey,Stringfamily,Stringcolumn)throwsIOException{

init(); Tabletable=connection.getTable(TableName.valueOf(tableName));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**創(chuàng)建一個Get實(shí)例,對應(yīng)的行鍵為rowkey的值*/ Getget=newGet(Bytes.toBytes(rowkey)); /**獲取指定列族和列修飾符的列*/

get.addColumn(Bytes.toBytes(family),Bytes.toBytes(column)); /**獲取的result數(shù)據(jù)是結(jié)果集,還需要格式化輸出想要的數(shù)據(jù)*/ Resultresult=table.get(get);

System.out.println(newString(result.getValue(family.getBytes(), column==null?null:column.getBytes())));

table.close(); close(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**獲取某一行數(shù)據(jù)*/ /**@paramtableName

表名 *@paramrowkey

行鍵 *@throwsIOException*/ publicstaticvoidgetRow(StringtableName,Stringrowkey) throwsIOException{

init(); Tabletable=connection.getTable(TableName.valueOf(tableName));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**創(chuàng)建一個Get實(shí)例,對應(yīng)的行鍵為rowkey的值*/ Getget=newGet(Bytes.toBytes(rowkey)); /**獲取的result數(shù)據(jù)是結(jié)果集*/ Resultresult=table.get(get); Cell[]cell=result.rawCells(); inti=0; intcellcount=result.rawCells().length;

System.out.print("行健:"+Bytes.toString(CellUtil.cloneRow(cell[i])));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念for(i=0;i<cellcount;i++){

System.out.print(""+Bytes.toString(CellUtil.cloneFamily(cell[i])));

System.out.print(":"+Bytes.toString(CellUtil.cloneQualifier(cell[i])));

System.out.print(""+Bytes.toString(CellUtil.cloneValue(cell[i])));

System.out.print("時(shí)間戳:"+cell[i].getTimestamp());

System.out.println(); }

table.close(); close(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/** *當(dāng)所有參數(shù)非null時(shí),刪除一個單元格的數(shù)據(jù);當(dāng)column取值為null時(shí),刪除一個列族的數(shù)據(jù); *當(dāng)family和column取值都為null時(shí),刪除一行數(shù)據(jù) */ /**@paramtableName

表名 *@paramrowkey行鍵 *@paramfamily列族 *@paramcolumn列限定符 *@throwsIOException*/5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念publicstaticvoiddelData(StringtableName,Stringrowkey,Stringfamily,Stringcolumn)throwsIOException{

init(); Tabletable=connection.getTable(TableName.valueOf(tableName)); /**根據(jù)rowkey刪除*/ Deletedel=newDelete(Bytes.toBytes(rowkey));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念if(column!=null){ /**根據(jù)列刪除*/

del.addColumn(Bytes.toBytes(family),Bytes.toBytes(column)); }elseif(family!=null){ /**根據(jù)列族刪除*/

del.addFamily(Bytes.toBytes(family)); }

table.delete(del);

table.close(); close(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**根據(jù)表名掃描表,獲取所有數(shù)據(jù)*/ /**@paramtableName

表名 *@throwsIOException*/ publicstaticvoidgetAllRows(StringtableName)throwsIOException{

init(); Tabletable=connection.getTable(TableName.valueOf(tableName)); Scans=newScan(); /**scan全表掃描*/

ResultScanner

rs=table.getScanner(s);5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念/**遍歷并打印出結(jié)果集中指定數(shù)據(jù)的信息*/ for(Resultr:rs){ Cell[]cell=r.rawCells(); inti=0; intcellcount=r.rawCells().length;

System.out.print("行健:" +Bytes.toString(CellUtil.cloneRow(cell[i])));5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念for(i=0;i<cellcount;i++){

System.out.print("" +Bytes.toString(CellUtil.cloneFamily(cell[i])));

System.out.print(":" +Bytes.toString(CellUtil.cloneQualifier(cell[i])));

System.out.print("" +Bytes.toString(CellUtil.cloneValue(cell[i])));

System.out.print("時(shí)間戳:"+cell[i].getTimestamp());

System.out.println(); }5.6.2HBaseJavaAPI編程嵌入式系統(tǒng)基本概念

System.out.println(); }

table.close(); close(); }}第6章數(shù)據(jù)倉庫Hive6.1.1數(shù)據(jù)倉庫簡介嵌入式系統(tǒng)基本概念數(shù)據(jù)倉庫是一個面向主題的、集成的、隨時(shí)間變化的、但信息本身相對穩(wěn)定的數(shù)據(jù)集合,用于支持企業(yè)或組織的管理決策。數(shù)據(jù)源是數(shù)據(jù)倉庫系統(tǒng)的基礎(chǔ),通常包括存放于關(guān)系數(shù)據(jù)庫中的各種業(yè)務(wù)處理數(shù)據(jù)、各類文檔數(shù)據(jù)、各類法律法規(guī)、市場信息和競爭對手的信息等等。數(shù)據(jù)倉庫就是整合多個數(shù)據(jù)源的歷史數(shù)據(jù)進(jìn)行多角度、多維度的分析,并發(fā)現(xiàn)趨勢,幫助高層管理者或者業(yè)務(wù)分析人員做出商業(yè)戰(zhàn)略決策。6.1.2Hive簡介嵌入式系統(tǒng)基本概念

Hive最初由Facebook開發(fā),主要用于解決海量結(jié)構(gòu)化日志數(shù)據(jù)的離線分析。Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供了類SQL查詢語言HiveQL(HiveQueryLanguage)。當(dāng)采用MapReduce作為執(zhí)行引擎時(shí),Hive能將HiveQL語句轉(zhuǎn)變成MapReduce任務(wù)來執(zhí)行,讓不熟悉MapReduce的開發(fā)人員直接編寫HiveQL語句來實(shí)現(xiàn)對大規(guī)模數(shù)據(jù)的統(tǒng)計(jì)分析操作,大大降低了學(xué)習(xí)門檻,同時(shí)也提升了開發(fā)效率。6.1.2Hive簡介嵌入式系統(tǒng)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論