# Hypertable

Hypertable is een high performance, open source en zeer schaalbare NoSQL database. Het systeem is gebaseerd op een publicatie over Bigtable, Google’s eigen schaalbare databasesysteem. Het Hypertable open source project is begonnen in maart 2007 door ex-Inktomi engineers en werd gesponsord door Baidu, Rediff.com en Zvents Inc. In 2009 is Hypertable Inc. opgericht om ondersteuning te bieden aan bedrijven die Hypertable gebruiken.

## Hypertable vs RDBMSen

Hypertable is vergelijkbaar met traditionele RDBMSen, op het punt dat het bestaat uit tabellen met rijen en kolommen. Verder zijn de systemen erg verschillend. Zo zijn er geen verschillende datatypes, alles is een UTF-8 string. Ook zijn joins en transacties niet mogelijk, en is er slechts één sleutel. De tabellen kunnen dan ook het beste worden gezien als enorme tabellen met data, gesorteerd op slechts een enkele primaire sleutel, de row key. Omdat de data gesorteerd is op een primaire sleutel, is het DBMS goed geschikt voor applicaties die snel toegang willen tot grote hoeveelheden. Denk hierbij aan systemen zoals ebay en yelp.
Hypertable maakt van de tabelstructuur simpelweg een lijst van key/value paren. De key bestaat hierbij uit een minimum van 3 verschillende delen:
* De row key
* Een identifier voor de kolom
* Een timestamp
Elke cel in de tabel kan dus verschillende versies hebben, gekenmerkt door een timestamp. Een nieuwe waarde van de cel wordt toegevoegd met een nieuwe timestamp, maar overschrijft de oude data niet. Bij een query wordt standaard de meest recente versie teruggegeven.

## Design

Een Hypertable systeem bestaat uit een aantal onderdelen, waarvan de belangrijkste nu zijn:
* Master
* RangeServers
* Hyperspace
* Filesystem brokers en Distributed File System (DFS)

### Master

Er is één Master. Deze is vooral verantwoordelijk voor metadata operaties, zoals create table/ drop table. Ook zorgt de Master voor load balancing van RangeServers. De Master behandelt absoluut geen client data, en 100% uptime is dus niet heel belangrijk. Een eventuele oplossing voor hoge uptime is een hot standby Master.
De load balancing van de Master werkt als volgt. Elke tabel in Hypertable begint als één simpele tabel, op één server. Er worden meer en meer records aangemaakt, totdat een bepaalde drempelwaarde wordt bereikt. Op dit moment wordt de tabel gesplitst. De ene helft blijft op de server, de andere helft wordt verplaatst naar een andere (range)server binnen het systeem. Naarmate deze delen van de tabellen groeien, zullen deze ook weer verdeeld worden over meerdere servers.

### RangeServers

De RangeServer regelt een gedeelte van de tabel data. Als er een commit binnenkomt, wordt dit eerst weggeschreven in een commit-log op het DFS, zodat deze niet verloren gaat als de RangeServer onverhoopt uitvalt. Vervolgens wordt het naar de zogeheten cellcache geschreven. Deze wordt periodiek weggeschreven naar de schijf, in een cellstore.
Als de drempelwaarde van het aantal cellstores is bereikt, worden de cellstore samengevoegd en/of gecomprimeerd.
De merge scanner itereert over zowel de cellcache en cellstores, en voegt waar nodig de data samen, om zo een algeheel beeld van de data op de RangeServer te geven.

### Hyperspace

Hyperspace is een Distributed Lock Manager (DLM) met zeer hoge beschikbaarheid. De Hyperspace module bevat een implementatie van een highly available lock service gemodelleerd naar het Chubby system.

### Filesystem brokers en DFS

Hypertable is gebouwd om op elk distributed filesystem (DFS) te kunnen draaien. Een voorbeeld van een veelgebruikt DFS is Hadoop.
Er zijn brokers voor alle verschillende DFSen. Deze brokers zorgen voor de communicatie tussen de RangeServers en het gekozen DFS.

## Hypertable Query Language (HQL)

Hypertable heeft een eigen query taal: Hypertable Query Language (HQL). Deze wijkt af van SQL, vanwege de meerdere dimensies en omdat er geen datatype gedefinieerd hoeft/kan worden.

### CREATE TABLE query

Opbouw:
Een voorbeeld:

### INSERT query

Een insert query wijkt nog meer af. Je insert in een table, een waarde voor elke column voor elke row key. Deze row key wordt ook gelijk aangemaakt, en hoeft dus niet eerst gedefinieerd te worden.
Opbouw
Een voorbeeld:

### SELECT

Uiteindelijk een select.
Voorbeelden