1. 程式人生 > >HBase總結(4)--資料掃描與Scan物件

HBase總結(4)--資料掃描與Scan物件

一、介紹

Put、Delete與Get物件都是Row的子類,從該繼承關係中我們就可以瞭解到Get、Delete與Pu物件本身就只能進行單行的操作,HBase客戶端還提供了一套能夠進行全表掃描的API,方便使用者能夠快速對整張表進行掃描,以獲取想要的結果---scan

二、流程介紹

全表掃描是一種不需要行鍵值的操作,因此初始化時不需要指定行鍵值,因此就產生了不同的使用方法

1、不進行Scan物件建立的全表掃描

在該過程中,Htable物件會在掃描請求傳送前隱式的建立一個scan物件,然後傳遞給Hbase伺服器叢集。

public void scanWithoutInit(String tableName,String family)
	{
		Configuration conf=init();
		try {
			HBaseAdmin admin=new HBaseAdmin(conf);
			if(!admin.tableExists(tableName))
			{
				System.err.println("the table "+tableName+" is not exist");
				admin.close();
				System.exit(1);
			}
			//建立表連線
			HTable table=new HTable(conf, tableName);
			//獲取全表掃描
			ResultScanner resultScanner=table.getScanner(Bytes.toBytes(family));
			//對結果進行顯示
			Iterator<Result> results=resultScanner.iterator();
			while(results.hasNext())
			{
				Result result=results.next();
				for(KeyValue kv:result.raw())
				{
					System.out.println(Bytes.toString(kv.getRow()));
					System.out.println(Bytes.toString(kv.getFamily()));
					System.out.println(Bytes.toString(kv.getQualifier()));
					System.out.println(Bytes.toString(kv.getValue()));
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

getScanner()方法時,如果不輸入指定的scan物件,則需要輸入相應的列簇或者列。因此在不進行scan物件建立的掃描中,需要明確指出列簇或者列,如果需要掃描多個列簇時,該方法就無法起到作用了。

2、進行初始化的全表掃描

初始化一個scan物件,然後對該物件進行相應的配置過,通過 getScanner(Scan scan) 函式進行全表掃描。

public void scanWithInit(String tableName)
	{
		Configuration conf=init();
		try {
			HBaseAdmin admin=new HBaseAdmin(conf);
			if(!admin.tableExists(tableName))
			{
				System.err.println("the table "+tableName+" is not exist");
				admin.close();
				System.exit(1);
			}
			//建立掃描類
			Scan scan=new Scan();
			scan.setStartRow(Bytes.toBytes("row-1"));
			scan.setStopRow(Bytes.toBytes("row-9"));
			//建立表連線
			HTable table=new HTable(conf, tableName);
			ResultScanner rs=table.getScanner(scan);
			Result result;
			while((result=rs.next())!=null)
			{
				KeyValue[] kvs=result.raw();
				for(KeyValue kv:kvs)
				{
					System.out.println(Bytes.toString(kv.getRow()));
					System.out.println(Bytes.toString(kv.getFamily()));
					System.out.println(Bytes.toString(kv.getQualifier()));
					System.out.println(Bytes.toString(kv.getValue()));
				}
			}
			rs.close();
			table.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

在上段程式碼中,使用了setStartRow() 與 setStopRow() 兩個函式進行調優。Scan有多個函式可以進行對全表掃描做出相應的規範。

3、資料遍歷與顯示ScannerResult

通過上述兩種方法可以傳送對一張表是遍歷請求,當傳送後,伺服器會相應的啟動全表掃面程式,從而準備向客戶端返回相應的資料。因此根據客戶端的遍歷需要對資料盡心請求,然後將請求的結果進行返回,客戶端拿到後進行展示

(1)next()的單行返回資料的方法

ResultScanner rs=table.getScanner(Bytes.toBytes(family));
//進項單行獲取演示
Result result=null;
while((result=rs.next())!=null)
{
	KeyValue[] kvs=result.raw();
	for(KeyValue kv:kvs)
	{
		System.out.println(Bytes.toString(kv.getRow()));
		System.out.println(Bytes.toString(kv.getFamily()));
		System.out.println(Bytes.toString(kv.getQualifier()));
		System.out.println(Bytes.toString(kv.getValue()));
	}
}
rs.close();

next()方法會預設想客戶端請求傳送一行資料請求,剛伺服器端的scan程式接收到請求後會將經需要返回的資料封裝成一個result物件返回給客戶端,因此客戶端可以通過result物件去接受該行資料。接收到的資料則跟Get中的result使用方法是相同的。

(2)next(int n)的多行返回資料的方法

next(int n):該函式會向伺服器傳送多個請求,以返回多條資料請求。

//一次獲取多個結果(行資料)進行展示
			rs=table.getScanner(Bytes.toBytes(family));
			Result[] results=null;
			while((results=rs.next(2))!=null)
			{
				for(Result r:results)
				{
					KeyValue[] kvs=r.raw();
					for(KeyValue kv:kvs)
					{
						System.out.println(Bytes.toString(kv.getRow()));
						System.out.println(Bytes.toString(kv.getFamily()));
						System.out.println(Bytes.toString(kv.getQualifier()));
						System.out.println(Bytes.toString(kv.getValue()));
					}
				}
			}
			rs.close();
next(int n)函式返回的是一個result陣列。使用者接受到資料後可以進行相應的操作。

(3)迭代器遍歷

//進行迭代的方式進行輸出
			rs=table.getScanner(Bytes.toBytes(family));
			Iterator<Result> resultIterator=rs.iterator();
			while(resultIterator.hasNext())
			{
				result=resultIterator.next();
				KeyValue[] kvs=result.raw();
				for(KeyValue kv:kvs)
				{
					System.out.println(Bytes.toString(kv.getRow()));
					System.out.println(Bytes.toString(kv.getFamily()));
					System.out.println(Bytes.toString(kv.getQualifier()));
					System.out.println(Bytes.toString(kv.getValue()));
				}
			}
			//關閉表
			rs.close();
(4)注意點

因為當用戶傳送一個scan全表掃描後,region伺服器會為全表掃描建立掃描資源,因此長時間啟用全表掃描的話會佔用region伺服器的大量資源,所以在要求在使用完scanner掃描器後儘快釋放掉資源。

rs.close() 會告知服務其掃描器租約已經結束,伺服器就會釋相應的全域性掃描的資源。

三、Scan物件

(1)setStartRow() / setStopRow

設定掃描的開始行與結束行,通過這兩個可以直接確scan在掃描的範圍,通過縮小範圍可以減少掃描到時間,從而提高掃描的效率

(2)addFamily() / addColumn()

通過這兩個函式,可以在列或者列簇上的掃描位置。HBase是面向lie出書的資料庫,而同一個列簇的資料全部存放在同一個位置檔案中。因此如果可以確定掃描那個一列簇時,可以減少掃描的範圍,從而縮短掃描的時間。而在確定到某一個列時也會因為HBase的面向列儲存使得其效率提高。

(3)setMaxVersion() / setMaxVersion(int version)

設定返回的版本數量,預設為返回最新的資料。第一個函式則會返回所有的版本資料,第二個函式可以設定返回的版本數量

(4)setTimeStamp(long max)

返回該時間戳的資料

(5)setTimeRange(long min,long max)

設定返回的時間戳的範圍,只有版本值在該範圍之內的資料才會被返回到客戶端

(6)setFilter(Filter f)

設定過濾器,有時候掃描全表返回的數量過大時,可以通過過濾器將不符合的資料進行過濾,這樣可以減少從伺服器到客戶端的資料傳送,挺高掃描效率。

(7)setCacheBlocks(boole open)

在進行全表掃描過程中,伺服器端提供了一個快取區,該快取區可以將指定的資料量全部放入到記憶體中,這樣可以提高讀取效率。快取區的開啟也可以通過htable客戶端進行開啟。在開發後用戶可以通過 setCache(int n)的方式設定每次快取的數量為多少。通過調整該函式以提高讀取的效率。

四、總結

scan的全表掃描區別於其他三個操作,雖然獲取資料與Get獲取的資料是相同的,其與Get也具有形似的屬性,可以通過修改這些屬性去對資料獲取進行調優,從而使得提高資料獲取的效率。

相關推薦

HBase總結4--資料掃描Scan物件

一、介紹 Put、Delete與Get物件都是Row的子類,從該繼承關係中我們就可以瞭解到Get、Delete與Pu物件本身就只能進行單行的操作,HBase客戶端還提供了一套能夠進行全表掃描的API,方便使用者能夠快速對整張表進行掃描,以獲取想要的結果---scan 二、流

HBase總結1-- 資料插入Put物件

一、介紹 HBase的客戶端包中集中了CURD操作,使用者可以通過其中不同種類的API盡心CURD操作。HBase資料插入使用Put物件,Put物件在進行資料插入時,首先會想Hbase叢集傳送一個RPC請求,得到響應後將Put類中的資料通過序列化的方式傳給HBase叢集,叢

企業架構研究總結4——企業架構企業架構框架概論

      通過企業架構的發展歷程我們可以看出,經過幾十年的發展業界已經湧現出了很多企業架構以及企業架構框架理論。在本章中,筆者將挑選幾種主要的企業架構和企業架構框架理論進行詳細闡述。需要注意的是,雖然本章定名為“企業架構與企業架構框架”,但是由於企業架構的特性所致,其真實形

我的軟考之路——資料結構演算法4之八大排序

        排序是程式設計的基礎,在程式中會經常使用,好的排序方法可以幫助你提高程式執行的效率,所以學好排序,打好基礎,對於程式的優化會手到擒來。無論你的技術多麼強,如果沒有基礎也強不到哪去。  

資料結構——線性結構4——順序佇列迴圈佇列的原理

佇列的介面 從上一個專欄可以看出,棧和佇列是非常相似的結構。它們之間的唯一區別是處理元素的順序。棧使用後進先出(LIFO)的規律,其中對於棧來說push的最後一個元素始終是第一個pop的元素。而佇列採用更接近於排隊的的先進先出(FIFO)模式。棧和佇列的介面也

MEF學習總結4---Container層

ret nba enum https ive src lib nco 註入 通過AttributeedModelPrograming,我們可以聲明暴露組件,依賴組件,發現組件,但是所有這些需要有一個觸發點。即需要把所有這些組合在一起來協同工作,最終實現依賴註入。這就是Con

OpenCV學習總結4- 目標跟蹤

opened 背景 key font sin mic 目標 mil cap 視覺算法原理:背景提取  1. 打開視頻(文件或攝像頭)  2. 從視頻中提取當前幀  3. 計算背景:以前多幀求取平均  4. 根據背景得到運動目標(當前幀 - 背景)  5. 返回2,程序不斷循

產品方法論總結4——痛點、癢點、爽點

發送 比較 電影 社交 提高 bsp 需求 畫像 照片 產品的抓手,主要在於痛點和爽點。前面也提到了痛點即為恐懼,對於用戶而言是剛需,爽點為即時滿足,對用戶而言是興奮點,能讓用戶達到體驗值的高潮,而這裏也提到的癢點是滿足虛擬自我,例如,網紅產品,靠的就不是痛點和爽

OptimalSolution(2)--二叉樹問題4子樹拓撲結構

kmp ole 結點 mp算法 返回 str 序列 || 開始   一、判斷t1樹是否包含t2樹全部的拓撲結構 1 / 2 3 2 / \ /

MyBatis學習總結——ORM概要MyBatis快速起步

管理 stat prim aot 驅動 單元測試 build sta 環境 目錄 一、ORM 1.1、ORM簡介 1.2、ORM的概念 1.3、ORM的優缺點 二、MyBatis 2.1、MyBatis的特點 2.2、MyBatis工作流程

設計模式總結4

設計模式總結(4) 多例模式 單例模式限制了只能使用一個例項,有時候為了提高效率需要有限個相同的例項以供使用 public class Emperor { /** * 可以產生例項個數 */ private static int maxNu

Linux學習筆記4磁碟分割槽檔案系統命令

    df 檢查檔案系統的磁碟空間佔用情況,引數-a列出全部目錄,引數-h按KB,MB,GB顯示 du   檢車某個目錄或者檔案佔用的磁碟空間,引數-s顯示佔用總空間,引數-sh統計目錄大小 mo

JQuery 總結4 jQuery 篩選查詢 等

1. hasClass(“class”) 判斷是否有這個class2. addClass(“class”)增加, removeClass(“class”)刪除,toggleClass(“cc”)有就刪cc,沒有增加cc。 $("li").click(function () { $(this).togg

JQuery 總結4 jQuery 篩選查找 等

cti span ttr ddc pan this attr font dcl 1. hasClass(“class”) 判斷是否有這個class2. addClass(“class”)增加, removeClass(“class”)刪除,toggleClass(“cc”)

vue入門總結4

1.路由的模式: 前文中我們建立VueRouter例項時用了mode:history的引數,這個值的意思是使用history模式,這種模式充分利用了history.pushState API來完成URL的跳轉而無須重新載入頁面。 如果不使用history模式,當訪問home的時候地址就會變為

Django 專案總結4- 使用者中心個人資訊

使用者中心個人資訊 在該頁面會展示使用者名稱,手機號,郵箱,郵箱驗證狀態 修改使用者模型類,增加郵箱是否驗證狀態 進入該頁面時,前端向後端請求資料; 後端進行序列化把資料返回; 在檢視加上 permission_classes 許

PHP設計模式4—— 資料物件對映模式

基本概念 資料物件對映模式,是將物件和資料儲存對映起來,對一個物件操作會對映成對資料儲存的操作。 這個模式的應用例子就是現在流行的ORM。 簡單例子 User類 class User { // 屬性和資料庫表的欄位一一對應 public $id;

c++學習總結——運算子過載標準模板庫STL

一、心得總結     運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。例如在做ATM模擬系統時,使用過載“<”來比較時間,可以簡化程式,減少程式碼。另外,我們也可以過載運算子函式,將運算子用於操作自定義的資料型別。過載運算子函式可以對運算子做出新的解釋,即定義使用

c++學習總結——虛擬函式多型

一、學習總結     在面向物件程式設計中,多型性是指一個名字,多種語義;或者介面相同,多種實現。過載函式是多型性的一種簡單形式。C++為類體系提供一種靈活的多型機制——虛擬函式。虛擬函式允許函式呼叫與函式體的聯絡在執行時才進行,成為動態聯編。類、繼承和多型,提供了對軟體重用性

Spring4之 SpringMybatis整合

Spring與Mybatis整合 整合思路 Spring管理:Mybatis的 SqlSessionFactory、Mapper 第一步:整合dao 第二步:新增事務管理 第三步:整合service、Spring管理Service介面、service通過IOC容器呼叫Dao(ma