中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Hive查詢HBase調用MapReduce性能優(yōu)化

2019-02-26    來源:多智時代

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

折騰了很久,被領導天天督促&指點,算是有個最基本的性能優(yōu)化。

1. 背景介紹:

Hive使用hive-hbase-handler建立HBase external table。在hive查詢包含count(*)、join、以及Predicate Pushdown等操作時,會調用MapReduce進行處理。本文旨在查詢性能方面的優(yōu)化,算是對工作中的一點記錄。

優(yōu)化主要分為兩個方面:

  1. HBase預分區(qū)以及hive–hbase-storage-handler的實現(xiàn)。

  2. HBase參數(shù)調優(yōu)。

2. 一些基本知識:

  1. 對Map過程的基本理解:Map是將原始數(shù)據(jù)拆分成split,根據(jù)split啟動Mapper。

  2. Hadoop有兩套API,一套是org.apache.hadoop.mapred,一套是org.apache.hadoop.mapreduce。前者是舊API,特點是底層基本類是接口,實現(xiàn)類需implements interface,而后者是新API,底層基本類是抽象類,實現(xiàn)類需extends abstractClass。

  3. hive的hive-storage-handler,使用的是舊mapred API。在handler中,需指定實現(xiàn)org.apache.hadoop.mapred.InputFormat 接口。

3. org.apache.hadoop.mapred.InputFormat詳解

簡單來說,InputFormat 主要用于描述輸入數(shù)據(jù)的格式,提供了以下兩個功能:

  1. 數(shù)據(jù)切分,按照某個策略將輸入數(shù)據(jù)且分成若干個 split,以便確定 Map Task 的個數(shù)即 Mapper 的個數(shù),在 MapReduce 框架中,一個 split 就意味著需要一個 Map Task;

  2. 為 Mapper 提供輸入數(shù)據(jù),即給定一個 split(使用其中的 RecordReader 對象)將之解析為一個個的 key/value 鍵值對。

該類接口定義如下:

publicinterfaceInputFormat{publicInputSplit[]getSplits(JobConfjob,intnumSplits)throwsIOException; publicRecordReadergetRecordReader(InputSplitsplit,JobConfjob,Reporterreporter)throwsIOException; }

其中,getSplit() 方法主要用于切分數(shù)據(jù),每一份數(shù)據(jù)由,split 只是在邏輯上對數(shù)據(jù)分片,并不會在磁盤上將數(shù)據(jù)切分成 split 物理分片,實際上數(shù)據(jù)在 HDFS 上還是以 block 為基本單位來存儲數(shù)據(jù)的。InputSplit 只記錄了 Mapper 要處理的數(shù)據(jù)的元數(shù)據(jù)信息,如起始位置、長度和所在的節(jié)點。

4. HBase預分區(qū)

在HBase Java API中,創(chuàng)建HBase table是可以指定TableDescriptor的。該TableDescriptor類似于一種預分區(qū)策略。默認地,如果沒有指定TableDescriptor來創(chuàng)建一張表時,只有一個region,正處于混沌時期,start-end key無邊界,可謂海納百川。什么樣的rowKey都可以接受,然而,當數(shù)據(jù)越來越多,region的size越來越大時,大到一定的閥值,hbase認為再往這個region里塞數(shù)據(jù)已經(jīng)不合適了,就會找到一個midKey將region一分為二,成為2個region,這個過程稱為分裂(region-split).而midKey則為這二個region的臨界,左為N無下界,右為M無上界。< midKey則為陰被塞到N區(qū),> midKey則會被塞到M區(qū)。

TableDescriptor是一個byte[][]數(shù)組,其中每一個byte[]相當于split key,如指定了63個split key,就會分成64個分區(qū)。預分區(qū)是不會被HBase Compact所合并的。

由于HBase是字典排序,所以如果要將表數(shù)據(jù)分散到預分區(qū)中,需要在rowkey指定一個prefix并保證盡量分散。常見的散列設計如hash或mod都是可以的。

5. 基于預分區(qū)的并發(fā)mapper設計

在HBase中,不同的RegionServer管理著不同的Region,我們希望能并發(fā)scan所有的region以達到并行化。由于mapper本身是并行的,所以只需在split上做文章,也就是改寫getSplits方法。具體做法是:

  1. 實現(xiàn)InputSplit接口,編寫一個Split對象類,在默認hive-hbase-handler中已有實現(xiàn)。

  2. 拿到table的region list。

  3. 遍歷list,獲取每一個region的startKey和endKey。

  4. 將二者寫入繼承的Split對象類。有多少region就有多少split,并且在Split對象類的readFields()方法中根據(jù)startKey和endKey讀取,write方法類似。

這樣recordReader就會讀取設置的每一個split。具體代碼不做贅述,只提供思路。

6. 參數(shù)調優(yōu)

由于hive查詢hbase的handler,底層依舊是用HBase的scan實現(xiàn)的,所以可以對HBase client端進行參數(shù)調優(yōu)。比較有用的如:

hbase.scan.cache,可以在集群管理中配置,也可以由client端的scan自行設置:scan.setCaching(),默認是1,設置大些可為一次scan拿回更多數(shù)據(jù),減少網(wǎng)絡I/O。

另有server段參數(shù)如:

hbase.ipc.server.read.threadpool.size。默認值 10,Reader 網(wǎng)絡 IO 個數(shù),reader 的個數(shù)決定了從網(wǎng)絡 io 里讀取數(shù)據(jù)的速度也就是網(wǎng)絡I/O。

同樣也可以設置server端cache大小(表級別),減少磁盤I/O。

經(jīng)測試,實現(xiàn)上述優(yōu)化,在我所能訪問到的集群里,count 一千萬數(shù)據(jù),能夠從最初的5分鐘降至最低48秒。

作者:orisonchan

鏈接:https://www.jianshu.com/p/cbcc20342ce0

在不久的將來,云計算一定會徹底走入我們的生活,有興趣入行未來前沿產(chǎn)業(yè)的朋友,可以收藏云計算,及時獲取人工智能、大數(shù)據(jù)、云計算和物聯(lián)網(wǎng)的前沿資訊和基礎知識,讓我們一起攜手,引領人工智能的未來!

標簽: 大數(shù)據(jù) 代碼 網(wǎng)絡 云計算

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:云計算性能操作測試靠譜嗎?

下一篇:互聯(lián)網(wǎng)趨勢下如何鑒別云計算與信息化