wiki:HyperTable

Version 18 (modified by sunny, 17 years ago) (diff)

--

Hypertable Knowledge Database

【Hypertable 源起】

搜尋引擎公司Zvents以Google的9位研究人員在2006年發表的Bigtable(簡稱BT,Google內部使用的文件儲存系統)設計規格為基礎[FYI]《Bigtable:結構化數據的分佈存儲系統》,推出了一款開放源碼的分散式數據儲存系統Hypertable專案。以 C++ 撰寫,可架在 HDFS 和 KFS 上,按照1000節點比例設計,0.9 alpha測試版已經在10個節點上測試過,儘管還在初期階段,但已有不錯的效能:寫入 28M 列的資料,各節點寫入速率可達 7MB/s,讀取速率可達 1M cells/s。

【Hypertable 簡介】

總結來說Hypertable是一個高效能,分散式,開放源碼,與欄位導向的資料庫,可以儲存,處理叢集電腦上大量的節構化與非結構化的資料,Hypertable提供C++的API及HQL(Hypertable Query Language)給用戶端來存取資料庫內容。Hypertable的用途並不是為了取代傳統的資料庫管理系統(像是MySQL與Oracle DB),而是為了可以儲存與管理大量的資料集。傳統的關連式資料庫RDBMs(Relational Database Management)是交易導向式,提供許多進階功能給使用者查詢結構化的資料庫內容。Hypertable為了逹到規模可彈性調整以及高效能的輸出,捨棄像是RDBMs常在使用的join或其他query的功能特色,MySQL之類的RDBMs系統屬於row-oriented較適合用於寫入動作較頻繁的工作負載情形,Hypertable屬於column-oriented較適合讀取動作較頻繁的工作負載情形。Hypertable建構於分散式檔案系統(DFS)之上,目前有許多DFS系統,任一DFS均可架設Hypertable,一套DFS可以讓許多機器看起來就好像單一虛擬磁碟,而且都均有容錯與備份機制,因此DFSs可以結合許多叢集電腦的儲存資源,提供高速與大資料量的存取效能,故Hypertable架構在DFS之上也就可以提供高速與高容量的資料庫儲存空間。

【How it works】

  • Hypertable 將資料運用主鍵排列儲存在table裡。資料庫所有cell的值都是不解釋的字符數組串,沒有任何類型與型態。Hypertables藉由將tables切割成連續的範圍,並分佈儲存到不同的實體機器上,來擴大規模。Hypertable cluster有兩種server: (1) Range Servers - 掌管一個範圍內的一連串資料; (2) Master Servers - 處理管理工作和監督 Range Servers。單一實體機器可以同時跑 Range Server process 和 Master Server process。單一Range Server可以掌管許多不連續的ranges;單一 Master Server負責很聰明地將它們做分散的規劃管理。如果某單一range滿了的話,range則被分半並重新配置。上半部的range不變,下半部的range則被Master Server重新指定到一個新的Range Server。預設最大的range size是200MB。如果全部的 Range Servers都已滿了, Master Servers則會將ranges搬移到較少較不滿的Range Servers。ranges的清單及它們位在哪裡以METADATA型式存在table裡,如同正規的table一樣與Hypertable共存。而Hyperspace 提供一個類似一般正規檔案系統的命名空間,並為客戶端扮演一個鎖定管理者做控管。
  • 以下是一個例子,顯示了存在Hypertable裡的資料是怎麼樣的,和該如何為非同質性的資料組儲存tags 和reviews。線上商店有許多商品項目,包括玩偶.傢俱和帽子。列識別符為玩偶.傢俱和帽子的名字,並且有許多行用來描述其每個tag 和review。前四行指示這個tag的行家族之資料點是tag,行識別符是標籤的名稱,值是我們想給其加上什麼標籤值。第五第六行家族指示它是個review,識別符是書寫者的名稱,其內容值才是真正的review。
key tag:striped tag:fourlegs tag:velvet tag:male tag:comfortable review:joey review:susan price:US price:EU
Zebra 803 212 0 6 9 "I like my zebra" 25.00 20.00
Ottoman 1343298 00"""this is an excellent ottoman"200.00175.00
Fedora 3 01453478"""a very fine hat"50.0040.00
  • Hypertable 裡的schemas 非常有彈性, 只有行家族需要事先被定義。建立table的HQL命令如下﹔

CREATE TABLE Items {

tag, review, price

};

  • 資料以 key:value組的方式儲存。所有資料的修定版都儲存在Hypertable裡,所以時間戳記是keys裡相當重要的一個部分。每單一資料點的典型key是<row><column-family><column-qualifier><timestamp>。所挑選到的時間戳記通常會以一個range做傳入,然後回傳一整個range的所有值。這可以使得很容易看出資料的舊版本值和看其隨著時間的變化,並且可以確保之前的資料都有被儲存起來而不是被覆寫過去。這預設的行為可以被覆寫而儲存成一個固定號碼的最近版本,並允許較舊的版本做鬆散的垃圾收集。以下為Zebra列的時間戳記版本:
time key tag:striped tag:fourlegs tag:velvettag:maletag:comfortablereview:joeyreview:susanprice:USprice:EU
t=1Zebra8032120 69"I like my zebra"25.0020.00
t=2Zebra 804
t=3Zebra2161"I REALLY like my zebra"
t=4Zebra24.9919.99
  • 所以在t=4,Zebra列就會有以下這樣的值:
t=4 Zebra 804216169"I REALLY like my zebra" 24.9919.99
  • Hypertable透過使用Cell Caches 和 Cell Stores 可以有效率的處理隨機更新。一個range實際上由許多Cell Stores組成。在一個cell store裡的所有列都是以列識別符做排序。Hypertable當一個寫入的動作發生,此資訊會先被寫入DFS的commit log,然後再存入Cell Cache的記憶體。 當Cell Cache達到大小限制,就會被壓縮並寫到硬碟裡成為Cell Store。Cell stores終究是不連續的,所以Heap Merge scanner負責聚集在cell cache 和cell store裡的key/value pairs,並且回傳排過序後的值。當range達到一個cell store的限制, Heap Merge就會啟動並且壓縮多個cell stores 成一個。不過在理想的狀況下,每個range最好只擁有單一的Cell Store。
  • Hypertable 提供使用者可以透過存取群組機制來控制行資料如何實際地儲存在DFS裡。每一行家族屬於單一存取群組,所有再存取群組裡行家族的資料都實際地一起儲存在硬碟裡。這可以改善被存取頻繁的行家族之讀寫效能。以下舉個例子,一個table有100個行家族,但只有兩個行家族比較常被存取。如果這兩個行家族一起被儲存在他們自己的存取群組,那麼為了要存取它們,系統將作disk I/O只須針對這兩行。若沒有存取群組,即使只有兩行的資料要存取,這100行的資料都將實際地被讀寫。

【Performance】

  • Performance Test: AOL Query Log(from Google)
    • Machine Profile
      • 8 data nodes
        • each node
          • 1 x 1.8GHz Dual-core Opteron Processor 2210
          • 4 GB RAM
          • 4 x 7200 RPM SATA drives (mounted JBOD)
    • The AOL query logs were inserted into an 8-node Hypertable cluster. The average size of each row key was ~7 bytes and each value was ~15 bytes. The insert rate (with 4 simultaneous insert processes) was approximately 410K inserts/s. The table was scanned at a rate of approximately 671K cells/s.

【How we use it】

  • 以陽明的病人屬性分類資料為範本來建立搜尋引擎
    • 參考資料:
    • 匯入方式:
      將陽明的病人屬性分類資料(XML格式),轉換成Hypertable可批次讀取的TSV格式,再使用HQL指令載入到Hypertable當中
    • 匯出方式:
      使用HQL指令匯出TSV檔案
    • 搜尋方式:
      目前Hypertable只提供以Rowkey完全比對及Rowkey或Timestamp的區間比對,以陽明的範例為例:
      Source是指檢查之前診斷判定的病因;
      Primary Site是指檢查之後診斷判定的病因;
      如果用Source為Rowkey來搜尋"Breast",搜尋結果會查出所有Source為"Breast"的資料
      如果用Primary Site為Rowkey來搜尋"Breast",搜尋結果會查出所有Primary Site為"Breast"的資料
      • NOTE: 交互比對的部份,Hypertable目前似乎沒提供,這個有可能要另外的程式再來處理過

【Similar Project】

  • HBase: Bigtable-like structured storage for Hadoop HDFS
    • Hypertable is based very closely on the design of Bigtable, with a few modifications. Hypertable is designed for speed and is written in C++, while Hbase is in Java.
  • Thrudb
    • Thrudb is a set of simple services built on top of Facebook’s Thrift framework that provides indexing and document storage services for building and scaling websites. Its purpose is to offer web developers flexible, fast and easy-to-use services that can enhance or replace traditional data storage and access layers.
  • DistStore
    • DistStore? is a family of lightweight Thrift based web services which are extremely scalable in both throughput and dataset size. Its purpose is to offer a simple and flexible data storage solution that can grow with your project from inception to millions of users.

【Reference】

【Related News】

【Technology】

【Discussion】

Attachments (1)

Download all attachments as: .zip