[[PageOutline]] = Hypertable Knowledge Database = == 【Hypertable 源起】 == * 搜尋引擎公司Zvents根據Google的9位研究人員在2006年發表的Bigtable設計規格為基礎[FYI]《[http://labs.google.com/papers/bigtable-osdi06.pdf Bigtable:結構化數據的分佈存儲系統]》,推出了一款以C++撰寫的開放源碼之分散式數據儲存系統-Hypertable專案,其發展目的則是為了能做出一套具備有PB(petabye)的資料量規模,同時具備高度延展性與讀取效能迅速之數據儲存系統,並進而形成一套開放原始碼的標準。 == 【Hypertable 簡介】 == * 總結來說Hypertable是一個高效能,分散式,開放源碼,與欄位導向的資料庫,可以儲存和處理叢集電腦上大量的節構化與非結構化的資料,它提供C++的API及HQL(Hypertable Query Language)給用戶端來存取資料庫內容。 * 它的用途並不是為了取代傳統的資料庫管理系統(像是MySQL與Oracle DB),而是為了可以儲存與管理大量的資料集。傳統的關連式資料庫RDBMs(Relational Database Management)是交易導向式,提供許多進階功能給使用者查詢結構化的資料庫內容。Hypertable為了逹到規模可彈性調整以及高效能的輸出,捨棄像是RDBMs常在使用的join或其他query的功能特色,MySQL之類的RDBMs系統屬於列導向較適合用於寫入動作較頻 繁的工作負載情形,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 ||1||343||298 ||0||0||""||"this is an excellent ottoman"||200.00||175.00|| ||Fedora ||3 ||0||145||34||78||""||"a very fine hat"||50.00||40.00|| * Hypertable 裡的schemas 非常有彈性, 只有行家族需要事先被定義。建立table的HQL命令如下﹔ CREATE TABLE Items { tag, review, price }; * 資料以 key:value組的方式儲存。所有資料的修定版都儲存在Hypertable裡,所以時間戳記是keys裡相當重要的一個部分。每單一資料點的典型key是。所挑選到的時間戳記通常會以一個range做傳入,然後回傳一整個range的所有值。這可以使得很容易看出資料的舊版本值和看其隨著時間的變化,並且可以確保之前的資料都有被儲存起來而不是被覆寫過去。這預設的行為可以被覆寫而儲存成一個固定號碼的最近版本,並允許較舊的版本做鬆散的垃圾收集。以下為Zebra列的時間戳記版本: ||time ||key ||tag:striped ||tag:fourlegs ||tag:velvet||tag:male||tag:comfortable||review:joey||review:susan||price:US||price:EU|| ||t=1||Zebra||803||212||0 ||6||9||"I like my zebra"||||25.00||20.00|| ||t=2||Zebra ||804|||||||||||||||||| ||t=3||Zebra||||216||1||||||"I REALLY like my zebra"|||||||| ||t=4||Zebra||||||||||||||||24.99||19.99|| * 所以在t=4,Zebra列就會有以下這樣的值: ||t=4 ||Zebra ||804||216||1||6||9||"I REALLY like my zebra" ||24.99||19.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: [http://code.google.com/p/hypertable/wiki/PerformanceTestAOLQueryLog 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】 == * [http://trac.nchc.org.tw/cloud/wiki/HyperTable/BioInfo_Project 以陽明的病人屬性分類資料為範本來建立資料庫] == 【Similar Project】 == * [http://hadoop.apache.org/hbase/ 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. * [http://thrudb.org/ 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. * [http://diststore.com/ DistStore] * DistStore is a family of lightweight [http://developers.facebook.com/thrift 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】 == * [http://www.hypertable.org/ HyperTable 官方網站] * [http://my.donews.com/eraera/2006/09/26/swogzstwtqdnwlfrzgsljctkjsbrtuiumxzj/ 翻譯:Google BigTable] - [http://labs.google.com/papers/bigtable-osdi06.pdf 原文(PDF)] * [http://blogs.the451group.com/opensource/2008/02/19/introducing-hypertable-a-new-open-source-database-project/ Introducing Hypertable - a new open source database project] * [http://funp.com/push/?tag=Hypertable&hot&stars=1 開放原始碼專案 Hypertable(BigTable clone)的效率] * [http://www.linuxworld.com/podcasts/linux/2008/013008-linuxcast.html LinuxWorld Hypertable 專訪 Doug Judd (PodCast) - 包含如何使用 HyperTable 來匯入大量 Apache Log 的範例] * [http://code.google.com/p/hypertable/ hypertable 在 Google Code 的討論群] * [http://code.google.com/p/hypertable/wiki/HowHypertableWorks How Hypertable Works - Google Code 上的說明文件] * [http://code.google.com/p/hypertable/wiki/ApacheLogLoad Google Code 上的範例 Apache log load example] * [http://mmdays.com/2008/02/14/cloud-computing/ Cloud Computing 雲端運算] * [http://ieeexplore.ieee.org/iel3/4957/13637/00626582.pdf A Hypertabular Visualizer of Query Results] * [http://code.google.com/p/hypertable/wiki/ArchitecturalOverview Hypertable的架構說明] == 【Related News】 == * [http://news.sina.com.tw/tech/sinacn/cn/2008-02-19/154038229686.shtml 微軟收購雅虎存在諸多障礙] * [http://www.linuxworld.com/news/2008/020608-hypertable.html Zvents releases open-source cluster database] * [http://reddit.com/r/programming/info/67zfd/comments/ 關於Hypertable資料寫入檔案系統的問題] == 【Technology】 == * Hypertable Installation Guide: [http://trac.nchc.org.tw/cloud/wiki/HyperTable/HowToInstall How to install] * Hypertable Documentation Tree: [http://140.110.138.176/hypertable/html/inherits.html Source Code Documentation Tree](Doxygen) * Hypertable Query Language(HQL) Guide: [http://trac.nchc.org.tw/cloud/wiki/HyperTable/HQLTutorial HQL Hwo To] == 【Discussion】 == * 關聯式資料庫的優勢逐漸消失?? * [http://insidehpc.com/2008/03/19/an-end-to-the-dominance-of-relational-databases/ An end to the dominance of relational databases] * [http://www.infoq.com/news/2007/11/the-rdbms-is-not-enough The RDBMS is not enough] * [http://www.infoq.com/cn/news/2008/01/mapreduce-rdbms MapReduce是倒退:拿它與關係數據庫比較公平嗎?] * [http://almaer.com/blog/the-new-attack-on-the-rdbms The new attack on the RDBMS]