『壹』 怎樣用hbase過濾器實現,一個列多列值查詢
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據內的多個維度(行容,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。
『貳』 幾種在shell命令行中過濾adb logcat輸出的方法
我們在開發中總能看到程序的log日誌內容充滿了屏幕,而真正對開發者有意義的信息被淹沒在洪流之中,讓開發者無所適從,嚴重影響開發效率。本文就具體介紹幾種在shell命令行中過濾adblogcat輸出的方法。 1、只顯示需要的輸出(白名單) 最方便的當然是通過管道使用 grep 過濾了,這樣可以使用 grep 強大的正則表達式匹配。簡單的匹配一行當中的某個字元串,例如 MyApp: adb logcat | grep MyApp adb logcat | grep -i myapp #忽略大小寫。 adb logcat | grep --color=auto -i myapp #設置匹配字元串顏色。更多設置請查看 grep 幫助。 進階一點可以使用 grep 的正則表達式匹配。例如上一個例子會匹配一行中任意位置的 MyApp,可以設置為僅匹配 tag。默認的 log 輸出如下,如果修改過輸出格式相應的表達式也要修改。 I/CacheService( 665): Preparing DiskCache for all thumbnails. 可以看出 tag 是一行開頭的第三個字元開始,根據這點寫出表達式: adb logcat | grep "^..MyApp" 根據這個格式也可以設置只顯示某個優先順序的 log,再匹配行首第一個字元即可。例如僅顯示 Error 級別 tag 為 MyApp 的輸出: adb logcat | grep "^E.MyApp" 當然也可以匹配多個,使用 | 分割多個匹配表達式,要加轉義符。例如要匹配 tag 為 MyApp 和 MyActivity 的輸出: adb logcat | grep "^..MyApp\|^..MyActivity" adb logcat | grep -E "^..MyApp|^..MyActivity" #使用 egrep 無須轉義符 2、過濾不需要的輸出(黑名單) 還是使用 grep,用法也跟上面的一樣,加一個 -v 即可。例如要過濾 tag 為 MyApp 和 MyActivity 的輸出: adb logcat | grep -v "^..MyApp\|^..MyActivity" adb logcat | grep -vE "^..MyApp|^..MyActivity" #使用 egrep 無須轉義符 3、顯示同一個進程的所有輸出 有時一個程序裡面的 tag 有多個,需要輸出該程序(同一個 PID)的所有 tag;僅使用 tag 過濾有時也會漏掉一些錯誤信息,而一般錯誤信息也是和程序同一個 PID。還是通過 grep 實現,思路是先根據包名找到 pid 號,然後匹配 pid。寫成 shell 腳本如下,參數是程序的 java 包名(如 com.android.media)。 #!/bin/bash packageName=$1 adb logcat | grep –color=auto $pid 4、從當前開始顯示 logcat 有緩存,如果僅需要查看當前開始的 log,需要清空之前的。 adb logcat -c && adb logcat 5、過濾 log 文件 有時需要分析 log 文件,過濾 log 文件還是使用 grep。例如 log 文件為 myapp.log,要匹配 tag 為 MyApp 和 MyActivity 的輸出,然後輸出到 newmyapp.log: cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log Windows 下推薦使用Notepad++,一個免費強大的記事本,支持正則表達式查找替換。可以高亮顯示匹配內容,也可以刪除不需要的內容。 以上的技巧主要用到了 grep,其實 logcat 本身也有過濾功能,可以根據 tag、優先順序過濾 log,具體請參考 Android 官方文檔Reading and Writing Logs。如果喜歡使用圖形界面,請參考Using DDMS,DDMS 裡面的 logcat 也可以同樣過濾。
『叄』 shell怎樣過濾掉hbase-site.xml文件中的注釋項
hbase接到命令後存下變化信息或者寫入失敗異常的拋出,默認情況下。執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱hlog)和memstore,以保證數據持久化。memstore是內存里的寫入緩沖區。客戶端在寫的過程中不會與底層的hfile直接交互,當menstore寫滿時,會刷新到硬碟,生成一個新的hfile.hfile是hbase使用的底層存儲格式。menstore的大小由hbase-site.xml文件里的系統級屬性hbase.hregion.memstore.flush.size來定義。
hbase在讀操作上使用了lru緩存機制(blockcache),blockcache設計用來保存從hfile里讀入內存的頻繁訪問的數據,避免硬碟讀。每個列族都有自己的blockcache。blockcache中的block是hbase從硬碟完成一次讀取的數據單位。block是建立索引的最小數據單位,也是從硬碟讀取的最小數據單位。如果主要用於隨機查詢,小一點的block會好一些,但是會導致索引變大,消耗更多內存,如果主要執行順序掃描,大一點的block會好一些,block變大索引項變小,因此節省內存。
LRU是Least Recently Used 近期最少使用演算法。內存管理的一種頁面置換演算法,對於在內存中但又不用的數據塊(內存塊)叫做LRU,操作系統會根據哪些數據屬於LRU而將其移出內存而騰出空間來載入另外的數據。
『肆』 hbase採用了什麼樣的數據結構
HBase採用了類似Google Bigtable的數據模型,即一個稀疏的、分布式的、持久化的多維映射表,每個表都由行鍵、列族、列限定符和時間戳組成。
在底層實現上,HBase使用了基於Hadoop的分布式文件系統HDFS來存儲數據,並且使用了一搏皮搜種稱為LSM-Tree(Log-Structured Merge-Tree)的數據結構來管理數據。LSM-Tree是一種支持高寫入吞吐量的數據結構,它把數據分成多個層,每層採用不同的策略來管理數據,包括內存中的緩存、寫入磁碟的SSTable、和合並SSTable的操作。通過這種方式,HBase能夠支持高並發、高吞吐量的數據寫入,同時保證數據的一致性和可靠性。
另外,HBase還採用了Bloom Filter、MemStore和Compaction等技術來提高數據查詢效率和存儲效率。Bloom Filter是一種快速的數據過濾技術,可以幫助HBase快速地過濾掉無效的查詢請求,提高查詢效率。MemStore是一種緩存機制,可以幫助基歷HBase加速數據寫入,提高數據握中寫入效率。Compaction則是一種數據壓縮和合並技術,可以幫助HBase節省存儲空間,提高存儲效率。
綜上所述,HBase採用了LSM-Tree、Bloom Filter、MemStore和Compaction等多種數據結構和技術,以實現高並發、高吞吐量的分布式存儲和查詢功能。
『伍』 HBase條件查詢(多條件查詢)
轉 https://blog.csdn.net/PirateLeo/article/details/7956965
文中可能涉及到的API:
Hadoop/HDFS: http://hadoop.apache.org/common/docs/current/api/
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html
Begin!
HBase的查詢實現只提供兩種方式:
1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)
2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan)
實現條件查詢功能使用的就是scan方式,scan在使用時有以下幾點值得注意:
1、scan可以通過setCaching與setBatch方法提高速度(以空間換時間);
2、scan可以通過setStartRow與setEndRow來限定范圍。范圍越小,性能越高。
通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的性能。
3、scan可以通過setFilter方法添加過濾器,這也是分頁、多條件查詢的基礎。
下面舉個形象的例子:
我們在表中存儲的是文件信息,每個文件有5個屬性:文件id(long,全局唯一)、創建時間(long)、文件名(String)、分類名(String)、所有者(User)。
我們可以輸入的查詢條件:文件創建時間區間(比如從20120901到20120914期間創建的文件),文件名(「中國好聲音」),分類(「綜藝」),所有者(「浙江衛視」)。
假設當前我們一共有如下文件:
內容列表
ID CreateTime Name Category UserID
1 20120902 中國好聲音第1期 綜藝 1
2 20120904 中國好聲音第2期 綜藝 1
3 20120906 中國好聲音外卡賽 綜藝 1
4 20120908 中國好聲音第3期 綜藝 1
5 20120910 中國好聲音第4期 綜藝 1
6 20120912 中國好聲音選手采訪 綜藝花絮 2
7 20120914 中國好聲音第5期 綜藝 1
8 20120916 中國好聲音錄制花絮 綜藝花絮 2
9 20120918 張瑋獨家專訪 花絮 3
10 20120920 加多寶涼茶廣告 綜藝廣告 4
這里UserID應該對應另一張User表,暫不列出。我們只需知道UserID的含義:
1代表 浙江衛視; 2代表 好聲音劇組; 3代表 XX微博; 4代表 贊助商。
調用查詢介面的時候將上述5個條件同時輸入find(20120901,20121001,"中國好聲音","綜藝","浙江衛視")。
此時我們應該得到記錄應該有第1、2、3、4、5、7條。第6條由於不屬於「浙江衛視」應該不被選中。
我們在設計RowKey時可以這樣做:採用UserID + CreateTime + FileID組成rowKey,這樣既能滿足多條件查詢,又能有很快的查詢速度。
需要注意以下幾點:
1、每條記錄的RowKey,每個欄位都需要填充到相同長度。假如預期我們最多有10萬量級的用戶,則userID應該統一填充至6位,如000001,000002...
2、結尾添加全局唯一的FileID的用意也是使每個文件對應的記錄全局唯一。避免當UserID與CreateTime相同時的兩個不同文件記錄相互覆蓋。
按照這種RowKey存儲上述文件記錄,在HBase表中是下面的結構:
rowKey(userID 6 + time 8 + fileID 6) name category ....
00000120120902000001
00000120120904000002
00000120120906000003
00000120120908000004
00000120120910000005
00000120120914000007
00000220120912000006
00000220120916000008
00000320120918000009
00000420120920000010
怎樣用這張表?
在建立一個scan對象後,我們setStartRow(00000120120901),setEndRow(00000120120914)。
這樣,scan時只掃描userID=1的數據,且時間范圍限定在這個指定的時間段內,滿足了按用戶以及按時間范圍對結果的篩選。並且由於記錄集中存儲,性能很好。
然後使用SingleColumnValueFilter(org.apache.hadoop.hbase.filter.SingleColumnValueFilter),共4個,分別約束name的上下限,與category的上下限。滿足按同時按文件名以及分類名的前綴匹配。
(注意:使用SingleColumnValueFilter會影響查詢性能,在真正處理海量數據時會消耗很大的資源,且需要較長的時間。
在後續的博文中我將多舉幾種應用場景下rowKey的,可以滿足簡單條件下海量數據瞬時返回的查詢功能)
如果需要分頁還可以再加一個PageFilter限制返回記錄的個數。
以上,我們完成了高性能的支持多條件查詢的HBase表結構設計。
『陸』 用happybase happy地查詢hbase數據
用happybase進行hbase中數據的增刪改查
前提:已經安裝happybase庫(pip install happybase),已有hbase環境並開啟thrift通訊埠(nohup hbase thrift start &),thrift默認埠為9090,10.10.30.200為hbase主機ip
scan方法:
參數:
row_start、row_stop:起始和終止rowkey,查詢兩rowkey間的數據
row_prefix:rowkey前綴。註:使用row_prefix的時候,row_start和row_stop不能使用
filter:要使用的過濾器(hbase 0.92版本及以上生效)
timestamp:按指定時間戳查詢
reverse:默認為False。為True時,scan結果按rowkey倒序排列
e.g:
put方法:
e.g:
△ 如put中改桐的rowkey已存在,則為修改數據
delete方法:
row:刪除rowkey為row的數據
columns:指定columns參數塌枯時,核衫坦刪除
e.g:
刪除rowkey為student2的name數據:
刪除成功:
batch方法:
1、批量操作
2、使用with管理批量
row方法及rows()方法,檢索指定rowkey的數據
檢索一條:
檢索多條:
返回結果:
e.g:
結果:
暫時就這些0v0