發表文章

目前顯示的是有「hbase」標籤的文章

hbase java api 介紹 (2)

在很久以前的hbase java api介紹 (1)之後, 今天總算找時間寫了第二篇內容, 在此篇文章中, 將會敘述比較正規的java client寫作方式, 增進讀取hbase的效率, 以下是範例程式: import java.io.*; import java.net.*; import java.util.*; import java.lang.*; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.*; import org.apache.hadoop.conf.Configuration; public class hbasetest2 {     public static Configuration conf;     static         {         conf = HBaseConfiguration.create();         conf.set("hbase.zookeeper.property.clientPort", "2222");         conf.set("hbase.zookeeper.quorum", "master,slave01,slave02");         conf.set("hbase.master", "master:600000");     }         static public void main(String[] args) throws Exception         {                 String[] Tab...

hbase shell (2)

在hbase中, 有些時候我們須查詢某一欄位的數值是否更新, 在這個情況下, 應該如何利用hbase shell的方式查詢呢? 如果我們確知row-key的名稱, 我們可以利用get的方式執行: hbase(main):005:0> get 'UserTable', 'B8:8D:12:1A:59:76' [...] 10 row(s) in 0.4240 seconds 甚至指定欄位, 例如: hbase(main):008:0> get 'UserTable', 'B8:8D:12:1A:59:76', {COLUMN=>['x', 'y']} COLUMN                CELL  x:                   timestamp=1434519293316, value=12.847539358614743  y:                   timestamp=1434519293316, value=28.36858703324554 2 row(s) in 0.0100 seconds 然而, 若是row-key為自動產生 (由寫入程式決定),  或是, 不知道row-key的資訊 (例如: 使用者的MAC位址), 應該如何查詢呢?

[shell script] 重新啟動 hbase 叢集

對於hbase而言, 若是發生無法挽救的錯誤, 導致需要重新啟動hbase叢集, 一直以來都是麻煩的事情... 尤其, 這還牽涉到HDFS的資料同步, 因此, 若是要重新格式化hbase叢集需要經過以下步驟: 1. 關閉hbase (注意HMaster, 可能會沒有回應...) 2. 關閉hadoop 3. 清除各節點上hbase和hadoop的資料 4. 格式化hadoop namenode 5. 啟動hadoop 6. 啟動hbase 由於目前所使用的雲端環境不是非常穩定, 有時會所有虛擬機同時重新啟動, 導致hbase叢集也必須重啟... 因此, 我在hbase master節點上寫了一支shell script, 把重啟hbase叢集自動化執行 以下是一些環境變數: hbase 叢集節點: hbasemaster, hbaseslave01, hbaseslave02 HDFS資料儲存位置: /opt/data hadoop log儲存位置: /opt/hadoop/logs hbase資料暫存位置: /opt/hbase/hbase-data hbase資料暫存位置: /opt/hbase/hbase-logs 安裝hadoop和hbase的權限: hduser (這些變數的設定請參考hadoop和hbase的安裝) 以下是shell script檔 (restart_hbase.sh): #!/bin/bash # Program: #       This program restarts hbase cluster. # History: # 2015/06/11     Chun-Hsien Ko     First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH pid=$(su - hduser -c "cat /opt/hbase/hbase-pids/hbase-hduser-master.pid") echo $pid kill -9 $pid su - hdus...

hbase shell (1)

要存取hbase, 最簡單的方法就是透過hbase shell, hbase shell是hbase內建的存取介面, 透過即時的命令輸入, 可以操作hbase中資料表的操作, 我們以hbase 0.94版本為例, 介紹hbase shell的功能: 首先, 我們先確認hbase和hadoop的程式都仍在執行, 接著, 進入hbase的路徑(/opt/hbase), 進入hbase shell: $ /opt/hbase/bin/hbase shell 進入hbase shell後, 我們先輸入help查看說明: hbase(main):003:0> help HBase Shell, version 0.94.2, r1395367, Sun Oct  7 19:11:01 UTC 2012 Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command. Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group. COMMAND GROUPS:   Group name: general   Commands: status, version, whoami   Group name: ddl   Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, en  able, enable_all, exists, is_disabled, is_enabled, list, show_filters   Group name: dml   Commands: count, delete, deleteall, get, get_counter,...

thrift api 使用: HTML

在這一篇文章中, 我們將介紹如何使用HTML透過PHP讀取hbase, 我們安裝的目錄結構為: hadoop                     /opt/hadoop hbase                        /opt/hbase 網頁根目錄             /var/www/ hbase的php目錄      /var/www/hbase thrift php                  /var/www/hbase/thrift php存放目錄           /var/www/php 測試程式之前,請先確定hbase , hadoop 都有正常運作中 $ bin/hbase thrift start 尚在執行 以下是我們的範例程式(example.php):     <!DOCTYPE html>     <html>     <meta charset="utf-8">     <head>     <script>     function getUser()     {     if(window.XMLHttpRequest)     {         xmlhttp = new XMLHttpRequest();         if(xmlhttp != null)     ...

thrift api 使用: PHP

在 上一篇 文章中, 提及thrift server的建立與存取, 在這一篇文章中, 將介紹如何透過thrift存取hbase資料, 類似的內容,  waue0920 已經寫下詳細的紀錄, 因此, 我們將跟隨相同的架構, 並補充一些內容, 我們安裝的目錄結構為: hadoop                     /opt/hadoop hbase                        /opt/hbase 網頁根目錄             /var/www/ hbase的php目錄 /var/www/hbase thrift php                  /var/www/hbase/thrift 測試程式之前,請先確定hbase , hadoop 都有正常運作中 $ bin/hbase thrift start 尚在執行 以下是這次範例程式(example.php) <?php $GLOBALS['THRIFT_ROOT'] = '/var/www/hbase/thrift'; require_once( $GLOBALS['THRIFT_ROOT'].'/Thrift.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php' ); require_once( $GLOBALS['THRIFT_ROOT'].'/pa...

hbase java api 介紹 (1)

在之前, 我們介紹 如何編譯hbase-client程式 時, 曾經放上一段程式碼作為範例, 然而, 該程式碼需要預先建立好一個hbase table (myHBaseTable), 並且在myHBaseTable中, 建立一個column: myFamily, 在今天的範例中, 我們將擴展這個例子, 從建立table開始, 都由hbase java api負責, 以下是程式: import java.io.*; import java.net.*; import java.util.*; import java.lang.*; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.*; import org.apache.hadoop.conf.Configuration; public class hbasetest {     public static Configuration conf;     static {         conf = HBaseConfiguration.create();         conf.set("hbase.zookeeper.property.clientPort", "2222");         conf.set("hbase.zookeeper.quorum", "hbasemaster");     }     public static void main(String[] args) throws IOException {         HBaseAdmin admin = new HBaseAdmin(conf);         // create a hbase table   ...

hbase 0.94 + thrift 0.7.0 安裝 (2)

之前介紹了thrift的 安裝 , 在這裡要特別提醒的是, thrift有版本相容問題, 以作者的測試經驗, 0.9.1和0.9.2版的thrift都和hbase 0.94不相容, 不相容的地方主要在於library的位置, 以及name space的支援, 若是使用較新版本的thrift, 可能要自行更改一些變數設定,

hbase 0.94 + thrift 0.7.0 安裝 (1)

在 上一篇 文章中, 我們介紹了如何用java來存取hbase叢集, 在這一文章中, 我們介紹如何建立thrift的環境, 要注意的是: 這一篇文章是以hbase 0.94作為範例, 在其他版本(0.96)上是否需要其他設定, 則需要再試看看, 考慮到hbase原生只支援java與shell方式存取, 對於其他程式語言, 尤其是網頁界面而言, 就成了很大的障礙, thrift就提供了解決方案, 讓像是PHP的網頁語言也可以使用,

hbase-client java 程式的編譯與執行

完成hbase從即架設之後, 接下來, 就要利用hbase來存取資料, 在hbase的架構中, 原生的存取方式有三種: thrift, java program 以及 hbase shell, 在這篇文章中, 我們假設hbase中已經有一個myHBaseTable, 在myHBaseTable中, 只有一個column: myFamily, 接著, 我們想執行以下的程式: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class hbasetest {     public static Configuration conf;     static {         conf = HBaseConfiguration.create();         conf.set("hbase.zookeeper.property.clientPort", "2222");         conf.set("hbase.zookeeper.quorum", "master.hbase.mbwcl.nctu.edu.tw");     }     public static void m...

hbase 0.96 on hadoop 1.1.2 安裝

在完成了hadoop安裝後, 我們可以繼續安裝hbase, hadoop的安裝可以參考: hadoop 1.1.2安裝(1) , hadoop1.1.2安裝(2) , 在安裝hbase前, 要先確認hadoop的版本是否 相容(chapter 4.1) : HBase-0.92.x HBase-0.94.x HBase-0.96 Hadoop-0.20.205 S X X Hadoop-0.22.x S X X Hadoop-1.0.x S S S Hadoop-1.1.x NT S S Hadoop-0.23.x X S NT Hadoop-2.x X S S 在hbase 0.96版本中, 就已經開始支援hadoop 2.0 (YARN), 不過, 考量到我們對於haddop 1.x版本較為熟悉, 我們還是以hadoop 1.1.2作為使用的hadoop版本範例,

[TRACE] org.apache.hadoop.hbase.regionserver.HRegion (merge, 0.94)

上一篇trace HRegion 的文章是0.96以後的版本, 因此, 在進行merge時, 有較為完整的程序, 在0.94版的hbase中, 關於merge的函示共有兩個: mergeAdjacent()和merge(), 事實上, mergeAdjacent()也是經過判斷後呼叫merge()函式, 因此, 我們在這篇文章中專注研讀merge()函式, 以下是merge()的全部程式碼: 4630 /** 4631 * Merge two regions whether they are adjacent or not. 4632 * 4633 * @param a region a 4634 * @param b region b 4635 * @return new merged region 4636 * @throws IOException 4637 */ 4638 public static HRegion merge( HRegion a, HRegion b) 4639 throws IOException { 4640 if (!a.getRegionInfo().getTableNameAsString().equals( 4641 b.getRegionInfo().getTableNameAsString())) { 4642 throw new IOException( "Regions do not belong to the same table" ); 4643 } 4644 4645 FileSystem fs = a.getFilesystem(); 4646 4647 // Make sure each region's cache is empty 4648 4649 a.flushcache(); 4650 b.flushcache(); 4651 4652 // Compact each region so we only have one sto...

[TRACE] org.apache.hadoop.hbase.regionserver.RegionMergeTransaction

在之前的文章中, 我們介紹了 org.apache.hadoop.hbase.regionserver , 在org.apache.hadoop.hbase.regionserver這個函式中, 使用RegionMergeTransaction物件執行Region的合併: RegionMergeTransaction rmt = new RegionMergeTransaction(a, b, true); 其中, a, b 是要被合併的Region. rmt則是合併之後, 新展生的Region. 為了詳細了解Region在進行合併時的操作, 我們將繼續研讀RegionMergeTransaction的原始碼,

[TRACE] org.apache.hadoop.hbase.util.HMerge

在之前介紹過hbase中的merge工具:  org.apache.hadoop.hbase.util.Merge 由於org.apache.hadoop.hbase.util.Merge有許多限制, 尤其是cluster必須offline, 以致在實體環境中難以適用... 這一次介紹的是另外一個merge工具: org.apache.hadoop.hbase.util.HMerge org.apache.hadoop.hbase.util.HMerge (HMerge)有兩種不同的模式: 對於一般table的online merge, 以及對於.META. table的offline merge. 簡單來說, HMerge提供了和auto split相反的功能, HMerge會去檢查相鄰的Region, 如果Region過小, 則進行merge. 這樣的狀況發生在大量資料被delete的狀況下, 對於進行merge table的要求就是要先disable, 以免在進行merge時資料出錯.

hbase split function (2)

圖片
hbase 0.94在進行表格分割(split)時, 依序進行下列動作:

hbase split function (1)

圖片
在hbase中, 表格被切隔成不同大小的Region, 不同的Region存放於不同的RegionServer上. Region的數量將影響LoadBalancer的運行結果, 同時考慮到每個RegionServer上有限的記憶體資源, 如何依據表格以及RegionServer的資源, 動態的切割表格成為Region, 是HBase規畫的重要問題。

hbase hbck 介紹 (1)

hbck (HBaseFsck) 是用來檢查hbase中群集一致性的工具, 其中, FSCK是file system consistency check的縮寫, hbase hbck會確認.META.表格的資訊, Region和RegionServer的對應關係, 以及HDFS中的硬碟資料狀態, 確保hbase中資料是一致的, 以功能而言, hbase hbck分成以下兩種主要功能: 修復Region和HDFS的對應關係(合併或是建立Region), 修復Region和META.表格的對應關係   The general repair strategy works in these steps.   1) Repair Table Integrity on HDFS. (merge or fabricate regions)   2) Repair Region Consistency with META and assignments

hbase中的資料儲存架構與格式 (2)

圖片
(問題)  hbase中資料如何儲存的? (2) HFile的資料格式? (方法) HFile是hbase中硬碟資料真實儲存的型態, 在hbase 0.94版本中, 使用的是HFile V2的格式, 不同於0.92版本(HFile V1)的格式, 擴展了資料的儲存欄位與編目的方式.

hbase中的資料儲存架構與格式 (1)

圖片
(問題)  hbase中資料如何儲存的? (1) 甚麼是Region, RegionServer ,Store, StoreFile以及HFile? (方法) 以下的文字是摘錄自 "HBase: The Definitive Guide"的文字和圖, 敘述hbase(0.92版)如何透過RegionSever進行資料儲存: The HRegionServer opens the region and creates a corresponding HRegion object. When the HRegion is opened it sets up a Store instance for each HColumnFamily for every table as defined by the user beforehand. Each Store instance can, in turn, have one or more StoreFile instances, which are lightweight wrappers around the actual storage file called HFile. A Store also has a MemStore, and the HRegionServer a shared HLog in-stance.

[TRACE] org.apache.hadoop.hbase.regionserver

在trace  org.apache.hadoop.hbase.util.Merge 時, 我們看到了這個merge的工具使用HRegion.merge()的方式, 把兩個Region合併成一個, 為了更進一步了解merge的流程, 我們繼續trace HRegion.merge()的程式碼, 並把HRegion程式碼中, 和merge相關的地方找出來, HRegion.merge()是一個兩個變數的函式, 輸出為合併後的Region, HRegion.merge()輸入和輸出都是 HRegion 的格式, 使用方法如下: HRegion merged = null; HRegion r1 = HRegion.openHRegion(info1, htd, utils.getLog(info1), getConf()); HRegion r2 = HRegion.openHRegion(info2, htd, utils.getLog(info2), getConf()); merged = HRegion.merge(r1, r2);