Einführung in Hbase

Einführung in Hbase

  • Künstliche Intelligenz
6 Minuten Lesezeit Aktualisiert Apr 24, 2017

Auf einen Blick: HBase ist eine Open-Source-NoSQL-Datenbank, die auf Hadoop basiert und für effizienten Zufallszugriff auf große Datensätze mit einer Master-Slave-Architektur entwickelt wurde. Sie unterstützt Datenspeicherung in HDFS oder Amazon S3 und verfügt über ein einzigartiges Schema, das auf Zeilen, Spaltenfamilien und Zeitstempeln für die Versionssteuerung basiert.

  • HBase ist inspiriert von Googles Big Table.
  • Sie ermöglicht einen hohen Durchsatz in Big-Data-Anwendungen.

Überblick

Hbase ist die Open-Source-Implementierung von Googles Big Table-Datenbank, in der Google Daten beispielsweise für Google Earth und Webindexdaten speichert.

HBase ist eine strukturierte NoSQL-Datenbank, die auf Hadoop basiert. Man kann Hbase-Daten im HDFS (Hadoop Distributed File System) speichern. Und HBase-Daten können auch in Amazon S3 gespeichert werden, das eine völlig andere Architektur hat. HBase ist strukturiert, weil es die Zeilen-und-Spalten-Struktur eines RDBMS hat, ähnlich wie Oracle. Aber es ist eine spaltenorientierte Datenbank und keine zeilenorientierte, was wir unten erklären. Und es ist noSQL, weil man SQL nicht verwenden kann, um Beziehungen zwischen Tabellen zu bauen, wie es bei einem RDBMS wie JOIN möglich ist.

Was HBase tut, ist zufälligen Zugriff auf Big Data. Hadoop tut das nicht: Es ist ein Batch-System, das nur Dateien schreibt, diese aber nicht aktualisiert.

Wie Cassandra speichert HBase die Daten in einer Speichertabelle und speichert sie dann in massiven Schreibvorgängen auf die Festplatte. Das verschafft ihm den hohen Durchsatz, der für Big-Data-Anwendungen benötigt wird.

play

(Dieser Artikel ist Teil unseres Hadoop-Leitfadens. Nutzen Sie das rechte Menü zur Navigation.)

Architektur

HBase verfügt über eine Master-Slave-Architektur. Der Masterserver koordiniert die Regionsserver. Die Regionserver sind für das Schreiben, Lesen und andere Datenoperationen verantwortlich.

Apache Zookeeper, das mit Hadoop installiert ist, übernimmt Konfigurations- und verteilte Operationen

Installieren Sie HBase

Im Folgenden geben wir einige Beispiele, wie man Tabellen in HBase erstellt und Daten schreibt. Man muss also zuerst HBase installieren. Man findet Anleitungen zur Installation von HBase im Internet. Es gibt kein RPM-Paket dafür. Im Grunde muss man zuerst Hadoop installieren. Dann lädt man HBase herunter, entpackt es und nimmt kleine Änderungen an der Hadoop-Konfigurationsdatei hbase-site.xml. Die Installation ist also nicht kompliziert.

Für diese Beispiele verwenden wir HBase im eigenständigen statt im verteilten Modus.

HBase-Schema

HBase-Schemata werden für den Leser, der mit Oracle oder MySQL vertraut ist, seltsam aussehen. Geben wir zunächst einige Definitionen, um das zu verdeutlichen. Wir werden für unsere Beispiele eine Produktdatenbank verwenden. Das bedeutet aber nicht, dass HBase für ein Lagerkontrollsystem geeignet ist. Das könnte es sein, besonders für eines, das extrem groß ist.

  • Tabelle – eine Ansammlung von Reihen.
  • Row – eine Sammlung von Säulenfamilien.
  • Spaltenfamilie – eine Sammlung von Spalten. HBase speichert Daten nach Spaltenfamilie und nicht nach Zeilen. Dies ermöglicht eine schnellere Abrufung der Spalten, da sie nahe beieinander liegen.
  • Spalte – sind einzelne Datenposten, wie zum Beispiel Produktpreis. Zum Beispiel könnte man in einem System, das Produktinformationen speichert, eine Spaltenfamilie namens Merkmale und dann eine weitere namens Inventar haben. Eigenschaften könnten die Spaltenbeschreibung, Hersteller und Seriennummer enthalten. Der Bestand könnte ArtikelZählen, SKU (Lagerhaltungseinheit), EAN (Barcode Europe) und UPC (Barcode USA) umfassen. Sie beziehen sich auf die Spalten wie folgt: Eigenschaften: ArtikelZählung.
  • Zeitstempel – HBase indexiert Zeilenschlüssel, Spalten und Zeitstempel. Der Zeitstempel kann in jedem beliebigen Zeitformat sein, einschließlich einfacher Ganzzahlen, die gar keine Zeit sind. Da der Zeitstempel Teil des Schlüssels ist, kann man doppelte Zeilen haben. Das bedeutet, man kann mehrere Versionen einer Zeile haben. Zum Beispiel könnte man eine Buchhaltungstransaktion zum Zeitpunkt n und dieselben Informationen zu einem anderen Zeitpunkt haben.
  • Zeilenschlüssel – Der Zeilenschlüssel ist das, was man in der Zeilenschlüssel-Spalte speichert. Es ist also nicht nur eine Ordinalzahl. In diesem Beispiel verwenden wir Produktnummer. Man gibt dem Zeilenschlüssel keinen Namen, wie zum Beispiel productNumber, wie man es bei Spalten tut. HBase hält Zeilenschlüssel alphabetisch angeordnet, sodass ähnliche Elemente nebeneinander bleiben. Zum Beispiel verwenden sie in der Google-Dokumentation, die Google Big Table erklärt, das Beispiel ihres Web-Indexes. Daten für abc.com werden neben sales.abc.com gespeichert. (In anderen Bereichen, um diese nebeneinander zu speichern, speichert Google diese Domainnamen rückwärts wie com.abc und com.abc.sales.)
  • Zelle – Technisch gesehen speichert HBase Daten in Karten. Python-, Scala- und Java-Programmierer wissen, dass eine Karte eine (Schlüssel->Wert-)Datenstruktur ist, bei der keine doppelten Schlüssel erlaubt sind. Google sagt, dass HBase eine "spärliche, konsistente, verteilte, multidimensionale, sortierte Karte" ist. Daten werden als diese Abbildung gespeichert ((Reihenschlüssel, Spaltenfamilie, Spalte, Zeitstempel) -> Wert). Man kann also sagen, dass eine Zelle ein Spaltenwert ist. Das ist zwar nicht die genaue technische Definition, aber eine einfache Sichtweise darauf.

Zur Veranschaulichung haben Zeilen die unten gezeigte Struktur mit Zeilenschlüssel, Zeitstempel, Spaltenfamilie und Spalten. Aber nicht alle Zeilen müssen dieselben Spalten haben, was ebenfalls eine große Änderung gegenüber RDBMS ist. Hier kommt die Definition sparse ins Spiel: Zeilen ohne eine bestimmte Spalte benötigen keinen leeren Platz, wie es ein RDBMS tut, um diesen leeren Wert zu speichern.

Reihenschlüssel TimeStamp Säulenfamilie Säulenfamilie Säulenfamilie Säulenfamilie
Spalte 1 Spalte 2 Spalte 3 Spalte 4

Angenommen, wir haben eine Produktdatenbank. Die Produkte werden in einer SKU (Lagerhaltungseinheit) gespeichert, die ein einzelner Artikel, ein 6er-Pack, eine Kiste usw. sein kann. Der UPC-Code ist der Barcode. Und die Menge ist die Menge im Lager.

Also haben wir unten dieses Schema mit Produktnummer als Zeilenschlüssel und zwei Produktfamilien: Merkmale und Lager. Jede davon hat Spalten, sodass wir diese Beispieldaten haben:

Produktnummer TimeStamp Merkmale Inventar Inventar
Beschreibung UPC Manu. sku Menge
1 10 Skateboard 123 Jeder 100
2 10 Brille 456 Paket 400
2 15 Brille 456 Paket 600
3 20 Wildschwein 789 Mako Jeder 2

Beachten Sie, dass wir 2 Zeilen mit Zeilenschlüssel 2 und UPC-Spalte 456 haben. Der Unterschied liegt im Zeitstempel. Wir haben also Lagerbestände zu zwei verschiedenen Zeitpunkten.

Beachten Sie, dass Produkt 3 Eigenschaften:Hersteller-Spalte hat und die anderen Zeilen nicht. Dies zeigt, dass Zeilen unterschiedliche Spalten haben können. Wir werden in unseren untenstehenden Beispielen mit diesem Schema arbeiten.

HBase-Shell

Fügen Sie /usr/local/hbase/hbase(version)/bin/ in Ihren Pfad ein, damit Sie die Shell so öffnen können:

    hbase shell

Das ist die JRuby-IRB-Hülle, die auf HBase reitet. Man kann also Variablen erstellen und so weiter.

Erstelle eine Tabelle mit der Shell

Erstellen Sie eine Tabelle mit:

    create <table name>, <column family 1>,<column family 2>, ...

Wie in:

    create 'products', 'characteristics’, 'inventory'

Gib eine Liste ein, um zu zeigen, dass sie erstellt wurde, und dann den Befehl, um das Schema anzuzeigen.

Daten zur Tabelle hinzufügen

Wir erstellen keine Spaltennamen, bevor Sie die Daten in die Tabelle einfügen. Das machen Sie spontan. Der Befehl lautet:

    put <table name>, <row key>, <column family: column>

Das setzt einen Wert auf eine bestimmte Zeile und Spalte. Du kannst nicht in mehr als einer Spalte in einem Put schreiben.

    put 'products', '123', 'characteristics:description', 'skateboard'

Schreibe in eine andere Zelle für dasselbe Produkt:

    put 'products', '123', 'inventory:count', '100'

Dann listen Sie die Daten mit Scan auf:

    scan 'products'

ROW                      COLUMN+CELL                                                           
 123                     column=characteristics:description, timestamp=1488291808832, value=skateboard                                                               
 123                     column=inventory:count, timestamp=1488292001662, value=100

Daten abrufen

So ruft man eine bestimmte Zeile/Zelle ab:

    get 'products', '123', 'characteristics:description'

COLUMN                   CELL                                                                  
characteristics:descrip timestamp=1488291808832, value=skateboard

Verwendung von Versionen

Um die Zeitstempelfunktion zu nutzen, um mehrere Versionen zu speichern, erstellen wir die Tabelle folgendermaßen:

    create 'products', {NAME => 'characteristics', VERSIONS => 3}, {NAME => 'inventory', VERSIONS => 3}

Das bedeutet, dass man bis zu 3 Versionen jeder Zeile/Spalte aufbewahren sollte.

Dann schreibe einen Wert und gib keinen Zeitstempel an. Es wird die Systemzeit verwendet.

    put 'products', '123', 'characteristics:description', 'skateboard'

Dann schreibe dieselbe Zeile, denselben Spaltenwert und verwende eine beliebige ganze Zahl als Zeitstempel. Hier verwenden wir 2.

    put 'products', '123', 'characteristics:description', 'skateboard', 2

Scannen Sie nun, um die Daten in der Tabelle anzuzeigen, und Sie sehen, dass wir zwei Versionen haben:

    scan 'products', {VERSIONS => 3}

ROW                      COLUMN+CELL                                                           
 123                     column=characteristics:description, timestamp=1488293615489, value=ska
                         teboard                                                               
 123                     column=characteristics:description, timestamp=2, value=skateboard

Eine Tabelle löschen

Um eine Tabelle zu löschen, müssen Sie sie zuerst deaktivieren:

    disable ‘products’

Dann kannst du es löschen:

    drop 'products'

Beachten Sie, dass wir Anführungszeichen um den Namen der Namenstabelle setzen.

Datentypen

Beachten Sie, dass wir für alle unsere Beispiele Strings verwendet haben. Hbase schreibt Werte als Bytes, sodass jedes Objekt, das als Bytes gespeichert werden kann (und das ist alles außer Bits), gespeichert werden kann. Es unterstützt also Strings, Zahlen, Bilder und komplexe Objekte. Das sieht man in Java, wenn man verwendet:

    Put(Bytes.toBytes());

Erstellen Sie eine Tabelle mit Java

Die meisten Programmierer, die mit HBase arbeiten, verwenden Java. HBase verwendet JRuby als Shell, das ebenfalls eine Schnittstelle zu Java ist.

Hier ist ein Beispiel, wie man eine Tabelle mit Java erstellt. Du musst den CLASSPATH wie unten gezeigt festlegen, um dieses Beispiel auszuführen. Im Grunde liefert der Befehl hbase classpath eine sehr lange Zeichenkette, die du zum Kompilieren deines Programms brauchst.

    export CLASSPATH=$CLASSPATH:`hbase classpath`
	
cat HbaseExamples.java:

import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.conf.Configuration;

public class HbaseExamples {
	
	public static void main(String[] args) throws IOException {
		
		Configuration conf = HBaseConfiguration.create();
		HBaseAdmin admin = new HBaseAdmin(conf);
		HTableDescriptor tableDescriptor = new
      		HTableDescriptor(TableName.valueOf("products"));
		tableDescriptor.addFamily(new HColumnDescriptor("characteristics"));
      		tableDescriptor.addFamily(new HColumnDescriptor("inventory"));
		admin.createTable(tableDescriptor);
      		System.out.println(" Table created ");
	}
}

Setze CLASSPATH, kompiliere und führe das Programm aus:

    export CLASSPATH=`hbase classpath`

javac -cp `hbase classpath` HbaseExamples.java
java -cp $CLASSPATH:. HbaseExamples

Es sollte viele Hbase-Nachrichten an die Konsole senden, die mit folgendem endet:

    2017-02-27 16:06:01,616 INFO  [main] client.HBaseAdmin: Created products
 Table created

Jetzt können Sie die Shell und Liste öffnen und sehen, dass die Produkttabelle erstellt wurde:

    hbase(main):009:0> list
TABLE                                                                           
products

Das sind also genug Informationen, um dir den Einstieg zu erleichtern. Bevor du einsteigst und HBase benutzt, solltest du dich weiter damit beschäftigen, wie man Master, Regionen und Schemata erstellt, damit du deine Daten so aufbaust, dass sie mit der Architektur konsistent sind. Das bedeutet, den RDBMS-Bias in deinem Denken loszuwerden, was diejenigen von uns, die wir seit Jahren MySQL und Oracle haben, haben werden. Und du könntest etwas JRuby studieren, um zu sehen, wie du Variablen in deinen HBase-Skripten verwenden kannst.

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Künstliche Intelligenz

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.