⑴ HBase是什麼呢,都有哪些特點呢
Hbase是一種NoSQL資料庫,這意味著它不像傳統的RDBMS資料庫那樣支持SQL作為查詢語言。Hbase是一種分布式存儲的資料庫,技術上來講,它更像是分布式存儲而不是分布式資料庫,它缺少很多RDBMS系統的特性,比如列類型,輔助索引,觸發器,和高級查詢語言等待
那Hbase有什麼特性呢?如下:
強讀寫一致,但是不是「最終一致性」的數據存儲,這使得它非常適合高速的計算聚合
自動分片,通過Region分散在集群中,當行數增長的時候,Region也會自動的切分和再分配
自動的故障轉移
Hadoop/HDFS集成,和HDFS開箱即用,不用太麻煩的銜接
豐富的「簡潔,高效」API,Thrift/REST API,Java API
塊緩存,布隆過濾器,可以高效的列查詢優化
操作管理,Hbase提供了內置的web界面來操作,還可以監控JMX指標
什麼時候用Hbase?
Hbase不適合解決所有的問題:
首先資料庫量要足夠多,如果有十億及百億行數據,那麼Hbase是一個很好的選項,如果只有幾百萬行甚至不到的數據量,RDBMS是一個很好的選擇。因為數據量小的話,真正能工作的機器量少,剩餘的機器都處於空閑的狀態
其次,如果你不需要輔助索引,靜態類型的列,事務等特性,一個已經用RDBMS的系統想要切換到Hbase,則需要重新設計系統。
最後,保證硬體資源足夠,每個HDFS集群在少於5個節點的時候,都不能表現的很好。因為HDFS默認的復制數量是3,再加上一個NameNode。
Hbase在單機環境也能運行,但是請在開發環境的時候使用。
內部應用
存儲業務數據:車輛GPS信息,司機點位信息,用戶操作信息,設備訪問信息。。。
存儲日誌數據:架構監控數據(登錄日誌,中間件訪問日誌,推送日誌,簡訊郵件發送記錄。。。),業務操作日誌信息
存儲業務附件:UDFS系統存儲圖像,視頻,文檔等附件信息
不過在公司使用的時候,一般不使用原生的Hbase API,使用原生的API會導致訪問不可監控,影響系統穩定性,以致於版本升級的不可控。
HFile
HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的載入整個文件。索引的大小(keys的大小,數據量的大小)影響block的大小,在大數據集的情況下,block的大小設置為每個RegionServer 1GB也是常見的。
探討資料庫的數據存儲方式,其實就是探討數據如何在磁碟上進行有效的組織。因為我們通常以如何高效讀取和消費數據為目的,而不是數據存儲本身。
Hfile生成方式
起初,HFile中並沒有任何Block,數據還存在於MemStore中。
Flush發生時,創建HFile Writer,第一個空的Data Block出現,初始化後的Data Block中為Header部分預留了空間,Header部分用來存放一個Data Block的元數據信息。
而後,位於MemStore中的KeyValues被一個個append到位於內存中的第一個Data Block中:
註:如果配置了Data Block Encoding,則會在Append KeyValue的時候進行同步編碼,編碼後的數據不再是單純的KeyValue模式。Data Block Encoding是HBase為了降低KeyValue結構性膨脹而提供的內部編碼機制。
⑵ hbase和hive有什麼區別
1:Hive中的表是純邏輯表,就只是表的定義等,即表的元數據。Hive本身不存儲數據,它完全依賴HDFS和MapRece。這樣就可以將結構化的數據文件映射為為一張資料庫表,並提供完整的SQL查詢功能,並將SQL語句最終轉換為MapRece任務進行運行。 而HBase表是物理表,適合存放非結構化的數據。
2:Hive是基於MapRece來處理數據,而MapRece處理數據是基於行的模式;HBase處理數據是基於列的而不是基於行的模式,適合海量數據的隨機訪問。
3:HBase的表是疏鬆的存儲的,因此用戶可以給行定義各種不同的列;而Hive表是稠密型,即定義多少列,每一行有存儲固定列數的數據。
4:Hive使用Hadoop來分析處理數據,而Hadoop系統是批處理系統,因此不能保證處理的低遲延問題;而HBase是近實時系統,支持實時查詢。
5:Hive不提供row-level的更新,它適用於大量append-only數據集(如日誌)的批任務處理。而基於HBase的查詢,支持和row-level的更新。
6:Hive提供完整的SQL實現,通常被用來做一些基於歷史數據的挖掘、分析。而HBase不適用與有join,多級索引,表關系復雜的應用場景。
⑶ 簡述通過Apache+HBase+API進行表過濾器應用的理解
摘要 過濾器是HBase為客戶端提供的一種高級API,是HBase的一種高級特性,它提供了非常強大的功能幫助用戶處理表中的數據。HBase中讀取數據的API主要是get()和scan(),它們都支持直接讀取數據和通過指定起始行健訪問數據的功能,可以通過添加限定條件如列族、列、時間戳等來限制查詢的數量,但是它們缺少一種細粒度的的篩選功能,比如基於正則表達式的篩選。由此誕生過濾器,Get類和Scan類都支持過濾器,通過方法setFilter(Filter filter)可以設置查詢時的過濾器。
⑷ HBase列族是怎麼定義的,一個表要定義幾個列族較好求幫助,謝謝了
HBase表中的每個列都歸屬於某個列族,列族必須作為表模式(schema)定義的一部分預先給出;
列名以列族作為前綴,每個「列族」都可以有多個列成員(column);
HBase把同一列族裡面的數據存儲在同一目錄下,由幾個文件保存。
目前
hbase
不能很好地處理
多個列族
建議
只用
1
~
2
個列族
最好只用一個
⑸ Hbase的特性有哪些
HBase不是一個關系型資料庫,它需要不同的方法定義你的數據模型,HBase實際上定義了一個四維數據模型,下面就是每一維度的定義:
行鍵:每行都有唯一的行鍵,行鍵沒有數據類型,它內部被認為是一個位元組數組。
列簇:數據在行中被組織成列簇,每行有相同的列簇,但是在行之間,相同的列簇不需要有相同的列修飾符。在引擎中,HBase將列簇存儲在它自己的數據文件中,所以,它們需要事先被定義,此外,改變列簇並不容易。
列修飾符:列簇定義真實的列,被稱之為列修飾符,你可以認為列修飾符就是列本身。
版本:每列都可以有一個可配置的版本數量,你可以通過列修飾符的制定版本獲取數據。
⑹ hbase的過濾器有哪些
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。通常來說,通過行鍵,值來篩選數據的應用場景較多。
1. RowFilter:篩選出匹配的所有的行,對於這個過濾器的應用場景,是非常直觀的:使用BinaryComparator可以篩選出具有某個行鍵的行,或者通過改變比較運算符(下面的例子中是CompareFilter.CompareOp.EQUAL)來篩選出符合某一條件的多條數據,以下就是篩選出行鍵為row1的一行數據:
[java]view plain
Filterrf=newRowFilter(CompareFilter.CompareOp.EQUAL,newBinaryComparator(Bytes.toBytes("row1")));//OK篩選出匹配的所有的行
[java]view plain
Filterpf=newPrefixFilter(Bytes.toBytes("row"));//OK篩選匹配行鍵的前綴成功的行
[java]view plain
Filterkof=newKeyOnlyFilter();//OK返回所有的行,但值全是空
[java]view plain
Filterrrf=newRandomRowFilter((float)0.8);//OK隨機選出一部分的行
[java]view plain
Filterisf=newInclusiveStopFilter(Bytes.toBytes("row1"));//OK包含了掃描的上限在結果之內
[java]view plain
Filterfkof=newFirstKeyOnlyFilter();//OK篩選出第一個每個第一個單元格
[java]view plain
Filtercpf=newColumnPrefixFilter(Bytes.toBytes("qual1"));//OK篩選出前綴匹配的列
[java]view plain
Filtervf=newValueFilter(CompareFilter.CompareOp.EQUAL,newSubstringComparator("ROW2_QUAL1"));//OK篩選某個(值的條件滿足的)特定的單元格
[java]view plain
Filterccf=newColumnCountGetFilter(2);//OK如果突然發現一行中的列數超過設定的最大值時,整個掃描操作會停止
[java]view plain
SingleColumnValueFilterscvf=newSingleColumnValueFilter(
Bytes.toBytes("colfam1"),
Bytes.toBytes("qual2"),
CompareFilter.CompareOp.NOT_EQUAL,
newSubstringComparator("BOGUS"));
scvf.setFilterIfMissing(false);
scvf.setLatestVersionOnly(true);//OK
12.SkipFilter:這是一種附加過濾器,其與ValueFilter結合使用,如果發現一行中的某一列不符合條件,那麼整行就會被過濾掉:
[java]view plain
Filterskf=newSkipFilter(vf);//OK發現某一行中的一列需要過濾時,整個行就會被過濾掉
Filterwmf=newWhileMatchFilter(rf);//OK類似於Pythonitertools中的takewhile
List<Filter>filters=newArrayList<Filter>();
filters.add(rf);
filters.add(vf);
FilterListfl=newFilterList(FilterList.Operator.MUST_PASS_ALL,filters);//OK綜合使用多個過濾器,AND和OR兩種關系
⑺ 求教:怎樣用hbase過濾器實現,一個列多列值
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據的多回個維度(行,列,數據版本答)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。
⑻ hbase如何創建多列簇
大數據時代,誰掌握了足夠的數據,誰就有可能掌握未來,而其中的數據採集就是將來的流動資產積累。
幾乎任何規模企業,每時每刻也都在產生大量的數據,但這些數據如何歸集、提煉始終是一個困擾。而大數據技術的意義確實不在於掌握規模龐大的數據信息,而在於對這些數據進行智能處理,從中分析和挖掘出有價值的信息,但前提是如何獲取大量有價值的數據。
⑼ 如何使用scala+spark讀寫hbase
公司有一些實時數據處理的項目,存儲用的是hbase,提供實時的檢索,當然hbase裡面存儲的數據模型都是簡單的,復雜的多維檢索的結果是在es裡面存儲的,公司也正在引入Kylin作為OLAP的數據分析引擎,這塊後續有空在研究下。
接著上面說的,hbase存儲著一些實時的數據,前兩周新需求需要對hbase裡面指定表的數據做一次全量的update以滿足業務的發展,平時操作hbase都是單條的curd,或者插入一個批量的list,用的都是hbase的java api比較簡單,但這次涉及全量update,所以如果再用原來那種單線程的操作api,勢必速度回慢上許多。
關於批量操作Hbase,一般我們都會用MapRece來操作,這樣可以大大加快處理效率,原來也寫過MR操作Hbase,過程比較繁瑣,最近一直在用scala做spark的相關開發,所以就直接使用scala+spark來搞定這件事了,當然底層用的還是Hbase的TableOutputFormat和TableOutputFormat這個和MR是一樣的,在spark裡面把從hbase裡面讀取的數據集轉成rdd了,然後做一些簡單的過濾,轉化,最終在把結果寫入到hbase裡面。
整個流程如下:
(1)全量讀取hbase表的數據
(2)做一系列的ETL
(3)把全量數據再寫回hbase
核心代碼如下:
//獲取conf
val conf=HBaseConfiguration.create() //設置讀取的表
conf.set(TableInputFormat.INPUT_TABLE,tableName) //設置寫入的表
conf.set(TableOutputFormat.OUTPUT_TABLE,tableName)//創建sparkConf
val sparkConf=new SparkConf() //設置spark的任務名
sparkConf.setAppName("read and write for hbase ") //創建spark上下文
val sc=new SparkContext(sparkConf)
//為job指定輸出格式和輸出表名
val newAPIJobConfiguration1 = Job.getInstance(conf)
newAPIJobConfiguration1.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, tableName)
newAPIJobConfiguration1.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])
//全量讀取hbase表
val rdd=sc.newAPIHadoopRDD(conf,classOf[TableInputFormat]
,classOf[ImmutableBytesWritable]
,classOf[Result]
)
//過濾空數據,然後對每一個記錄做更新,並轉換成寫入的格式
val final_rdd= rdd.filter(checkNotEmptyKs).map(forDatas)
//轉換後的結果,再次做過濾
val save_rdd=final_rdd.filter(checkNull)
//最終在寫回hbase表
save_rdd.saveAsNewAPIHadoopDataset(newAPIJobConfiguration1.getConfiguration)
sc.stop()
從上面的代碼可以看出來,使用spark+scala操作hbase是非常簡單的。下面我們看一下,中間用到的幾個自定義函數:
第一個:checkNotEmptyKs
作用:過濾掉空列簇的數據
def checkNotEmptyKs(f:((ImmutableBytesWritable,Result))):Boolean={ val r=f._2 val rowkey=Bytes.toString(r.getRow) val map:scala.collection.mutable.Map[Array[Byte],Array[Byte]]= r.getFamilyMap(Bytes.toBytes("ks")).asScala if(map.isEmpty) false else true
}
第二個:forDatas
作用:讀取每一條數據,做update後,在轉化成寫入操作
def forDatas(f: (ImmutableBytesWritable,Result)): (ImmutableBytesWritable,Put)={ val r=f._2 //獲取Result
val put:Put=new Put(r.getRow) //聲明put
val ks=Bytes.toBytes("ks") //讀取指定列簇
val map:scala.collection.mutable.Map[Array[Byte],Array[Byte]]= r.getFamilyMap(ks).asScala
map.foreach(kv=>{//遍歷每一個rowkey下面的指定列簇的每一列的數據做轉化
val kid= Bytes.toString(kv._1)//知識點id
var value=Bytes.toString(kv._2)//知識點的value值
value="修改後的value"
put.addColumn(ks,kv._1,Bytes.toBytes(value)) //放入put對象
}
) if(put.isEmpty) null else (new ImmutableBytesWritable(),put)
}
第三個:checkNull 作用:過濾最終結果裡面的null數據
def checkNull(f:((ImmutableBytesWritable,Put))):Boolean={ if(f==null) false else true
}
上面就是整個處理的邏輯了,需要注意的是對hbase裡面的無效數據作過濾,跳過無效數據即可,邏輯是比較簡單的,代碼量也比較少。
⑽ hbase 多條件查詢or 怎麼過濾掉不需要查的列
hbase的region是按行劃分,而非按列,如果你讀取指定一行的所有列數據,regionServer雖然無法保證你的所有數據都在一個HFile中,但是至少是在一個Region中。但是具體的HFile所在的hdfs的節點那就不是HBase關心的事了,因為HBase的存儲是依賴與hdfs,所以底層存儲讀取的事會由NameNode操心,NameNode會考慮就近原則,而提供最高效的數據讀取策略。
你的數據傳輸是必然,但是HBase不會計算,計算是發生在你將想要的數據獲取到之後再自行進行計算的。你讀取大量數據必然會有大量數據傳輸,HBase只是將提供了一種高效的數據讀取策略,盡量減小數據傳輸量