SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
Webanwendungen mit Apache HBase entwickeln
Roman Roelofsen
Managing Director (aka Alpha Geek)
Weigle Wilczek GmbH
Twitter: romanroe

JAX, 19. April 2012

1
¨
WeigleWilczek - Uber Uns

IT-Beratung, Software-Entwicklung
Typische Anwendungen
”Web-Anwendungen”
Lagerverwaltung
Kennzahlenanalyse, Dashboards

Kein Facebook, Twitter, etc.

2
Typischer Stack

JVM
Jetty/Tomcat/WebSphere
Guice/Spring
Diverse Web-Frameworks
Diverse RDBMS (MySQL, PostreSQL, ...)
Ein paar Exoten
MongoDB
Prevayler

3
Probleme mit RDBMS

Schlechte horizontale Skalierung
Option A) Partitionierung nach Funktion
Option B) Partitionierung nach PK, Hash, etc.

Vertikale Skalierung ist teuer

4
Warum NoSQL?

Buzzword! (== Spaß, meistens jedenfalls)
Partitionierungsf¨higkeiten sind wirtschaftlich interessant
a
Skaliert die Abfragezeit mit der Serveranzahl?
Kosten f¨r Redundanz k¨nnen berechnet werden
u
o
memcached, etc. wird uber߬ssig (weniger Administration)
u
¨

NoSQL-Architekturen passen gut zum Cloud-Trend
Apache Hadoop wird (in den USA) sehr gehyped
→ Evaluierung

5
Warum NoSQL?

6
Warum NoSQL?

7
Warum NoSQL?

8
Auswahl NoSQL

Sammelbegriff f¨r viele Datenbanken
u
Dokumenten-Datenbank
Graph-Datenbank
Key/Value Datenbank
Objekt-Datenbank
Google’s BigTable, Amazon’s Dynamo
...

9
Google’s BigTable

Verteilte Key/Value Datenbank
Basiert auf Google File System
Fehlertolerant
Skalierbar
L¨uft auf ”billiger” Hardware
a
Erlaubt Parallelisierung (MapReduce & Co.)

10
Apache Hadoop Stack

Hadoop
Verteiltes Dateisystem (HDFS)

Hive
Abfragen

MapReduce
Implementierung f¨r das HDFS
u

HBase
BigTable-Implementierung

MediaGuardian Innovation Awards: Innovator of the Year
Wikipedia: ”...Hervorgehoben wurde, dass Hadoop so
vielseitige und weitreichende Anwendungen erm¨glicht, dass es
o
sich als Beginn einer neuen Datenrevolution erweisen k¨nne.”
o

11
Exkurs: HBase vs. Cassandra

HBase Vorteile
Konsistenz
Read-Performance > Write-Performance

Cassandra Vorteile
Write-Performance > Read-Performance

Wichtig f¨r Business-Anwendungen
u
Konsistenz
Read-Performance
Abfragen

12
HBase - Datendesign
Key/Value Datenbank
java.util.Map
Row
Map<ROW_ID, DATA>

13
HBase - Datendesign
Key/Value Datenbank
java.util.Map
Row
Map<ROW_ID, DATA>
Column Family
Map<ROW_ID, Map<FAMILY_ID, DATA>>

14
HBase - Datendesign
Key/Value Datenbank
java.util.Map
Row
Map<ROW_ID, DATA>
Column Family
Map<ROW_ID, Map<FAMILY_ID, DATA>>
Column
Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

15
HBase - Datendesign
Key/Value Datenbank
java.util.Map
Row
Map<ROW_ID, DATA>
Column Family
Map<ROW_ID, Map<FAMILY_ID, DATA>>
Column
Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

Alle Werte sind byte[]
Map<byte[], Map<byte[], Map<byte[], byte[]>>>

16
HBase - Datendesign

17
HBase - Datendesign

Zeilen IDs werden Byte-Lexikographisch sortiert
Innerhalb einer Zeile werden Spalten Byte-Lexikographisch
sortiert
Zeilen- und Spaltenabschnitte k¨nnen leicht ”gescannt”
o
werden
Wichtige Eigenschaft, um Indizes zu simulieren bzw. Abfragen
zu erm¨glichen
o

18
HBase - Column Families

Column Families werden in unterschiedlichen Dateien
gespeichert

19
HBase - Horizontale Skalierung
IDs werden in Regionen aufgeteilt
Regionen werden auf Region Servers gespeichert
Regionen und Region Server werden je nach Auslastung neu
angeordnet

20
HBase - Versionierung

Jede ”Zelle” wird mit einem Timestamp gespeichert und
automatisch versioniert

21
HBase - Versionierung

Jede ”Zelle” wird mit einem Timestamp gespeichert und
automatisch versioniert
Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>

22
HBase - Versionierung

Jede ”Zelle” wird mit einem Timestamp gespeichert und
automatisch versioniert
Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>

Default: 3 Versionen
Timestamp wird beim Schreiben vom Server gesetzt,
kann aber vom Client uberschrieben werden
¨

23
HBase API Grundlagen

24
HBase - Getting Started

Standalone Mode
Zur Entwicklung kann HBase im Standalone Modus gestartet
werden
HDFS wird dann nicht verwendet
HBase und ZooKeeper laufen in der selben JVM

Shell
bin/hbase shell
hbase(main):001:0> status
1 servers, 0 dead, 0.0000 average load

25
Exkurs: Ubuntu 11.10 und HBase

/etc/hosts
127.0.0.1
localhost
#127.0.1.1
servername
192.168.178.44 localhost

26
HBase API - Tabellen anlegen
Tabellen m¨ssen explizit angelegt werden
u
Shell
create ’person’, ’cfamily1’

27
HBase API - Tabellen anlegen
Tabellen m¨ssen explizit angelegt werden
u
Shell
create ’person’, ’cfamily1’

Java
Configuration c = new Configuration();
HBaseAdmin admin = new HBaseAdmin(c);
HTableDescriptor person = new
HTableDescriptor("person");
person.addFamily(new HColumnDescriptor("cfamily1"));
admin.createTable(person);

28
HBase API - Daten speichern
Shell
put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’
put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’

29
HBase API - Daten speichern
Shell
put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’
put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’

Java
Configuration c = new Configuration();
HTable person = new HTable(c, "person");
Put put = new Put(Bytes.toBytes("id_1"));
put.add(Bytes.toBytes("cfamily1"),
Bytes.toBytes("firstname"),
Bytes.toBytes("John"));
put.add(Bytes.toBytes("cfamily1"),
Bytes.toBytes("lastname"),
Bytes.toBytes("McCarthy"));
person.put(put);

30
HBase API - Daten lesen

Shell
hbase(main):001:0> scan ’person’
ROW COLUMN+CELL
id_1 column=cfamily1:firstname, timestamp=123,
value=John
id_1 column=cfamily1:lastname, timestamp=123,
value=McCarthy
1 row(s) in 0.1100 seconds

31
HBase API - Daten lesen
Java
Configuration c = new Configuration();
HTable person = new HTable(c, "person");
Get get = new Get(Bytes.toBytes("id_1"));
get.addColumn(Bytes.toBytes("cfamily1"),
Bytes.toBytes("firstname"));
get.addColumn(Bytes.toBytes("cfamily1"),
Bytes.toBytes("lastname"));
Result result = person.get(get);
byte[] firstname =
result.getValue(Bytes.toBytes("cfamily1"),
Bytes.toBytes("firstname"));
..

32
HBase API - Daten l¨schen
o

Shell
delete ’person’, ’id_1’, ’cfamily1:firstname’

33
HBase API - Daten l¨schen
o

Shell
delete ’person’, ’id_1’, ’cfamily1:firstname’

Java
Configuration c = new Configuration();
HTable person = new HTable(c, "person");
Delete delete = new Delete(Bytes.toBytes("id_1"));
delete.setTimestamp(1);
person.delete(delete);

34
HBase API - Scanner
Java
Configuration c = new Configuration();
HTable person = new HTable(c, "person");
Scan s = new Scan(
Bytes.toBytes("id_1"),
Bytes.toBytes("id_5"));
s.addFamily(Bytes.toBytes("cfamily1"));
ResultScanner rs = person.getScanner(s);
// while....
Result r = rs.next();
r.getValue(Bytes.toBytes("cfamily1"),
Bytes.toBytes("firstname"));
...
35
HBase und Web-Anwendungen

36
Web-Anwendungen

Mehrere Threads im Server
API muss (sollte) Thread-safe sein

Synchronisation beim Datenbankzugriff notwendig
Locking, Isolierung, ...

Multi-User Umgebung
Gemeinsame Updates w¨ren w¨nschenswert
a
u

Viele Views auf die selben Daten
Anzahl Reads > Anzahl Writes

Viele, kurzlebige Ausf¨hrungen
u

37
Atomare Operationen, Isolierung

Atomare Operationen sind:
Put, Get, Delete, ...
Keine Gruppierung m¨glich!
o
Jeder Aufruf ist direkt ein RPC-call

38
Atomare Operationen, Isolierung

Atomare Operationen sind:
Put, Get, Delete, ...
Keine Gruppierung m¨glich!
o
Jeder Aufruf ist direkt ein RPC-call

Client-side Buffer
table.setAutoFlush(false)
Put-Operationen werden im Client gepuffert
Explizit senden mit table.flushCommits()
Implizit basierend auf Heap-Verbrauch

39
Atomare Operationen, Isolierung
Batch-Support
List<Row> ops = new LinkedList<Row>();
Put put1 = new Put(Bytes.toBytes("id1");
put1.add(Bytes.toBytes("cf"), Bytes.toBytes("col"),
Bytes.toBytes("abc"));
ops.add(put1);
Put put2 = new Put(Bytes.toBytes("id2");
put2.add(Bytes.toBytes("cf"), Bytes.toBytes("col"),
Bytes.toBytes("def"));
ops.add(put12;
Object[] result = new Object[ops.size()];
table.batch(ops, result);

40
Atomare Operationen, Isolierung

Reihenfolge im Batch-Betrieb ist nicht explizit und wird vom
Client optimiert
Daher sollten keine Put- und Delete-Operationen f¨r die
u
selben Rows gemischt werde
Egal wie und wann, andere Clients sehen Zwischenschritte

41
Compare and Swap
HBase erlaubt atomare compare-and-swap Operationen
Put update = new Put(Bytes.toBytes("id1"));
update.add(
Bytes.toBytes("cfamily1"),
Bytes.toBytes("firstname"),
Bytes.toBytes("Max"));
boolean wasUpdated = person.checkAndPut(
Bytes.toBytes("id1"),
Bytes.toBytes("cfamily1"),
Bytes.toBytes("version"),
Bytes.toBytes("3"),
update);

Erm¨glicht Optimistic-Locking
o
42
Synchronisation uber Locks m¨glich
o
¨

Mehrere Operationen k¨nnen nicht als eine, atomare
o
Operation durchgef¨hrt werden
u
Andere Clients werden immer Zwischenschritte sehen
Wenn Clients sich auf gemeinsame Locks einigen, ist
zumindest eine Synchronisation m¨glich
o
RowLock id1lock =
person.lockRow(Bytes.toBytes("id1"));
...
...
person.unlockRow(id1lock);

43
Synchronisation uber Locks m¨glich
o
¨

Probleme
Welche Rows eignen sich als gemeinsamer Lock?
Gefahr von Deadlocks

44
Thread-Sicherheit der API

HTable
Das Erstellen einer HTable-Instanz kann mehrere Sekunden
dauern
Instanzen sollten daher immer wiederverwendet werden

45
Thread-Sicherheit der API

HTable
Das Erstellen einer HTable-Instanz kann mehrere Sekunden
dauern
Instanzen sollten daher immer wiederverwendet werden
Problem: Instanzen sind nicht Thread-safe

46
Thread-Sicherheit der API

HTable
Das Erstellen einer HTable-Instanz kann mehrere Sekunden
dauern
Instanzen sollten daher immer wiederverwendet werden
Problem: Instanzen sind nicht Thread-safe
L¨sung: HTablePool
o
HTablePool pool = new HTablePool(c,
Integer.MAX_VALUE);
HTable table = pool.getTable("person");
...
table.close();

47
”Transaction per View”

RDBMS + Web-Anwendung
F¨r jeden Request wird eine Transaction erstellt
u
RuntimeExceptions f¨hren zu einem Rollback,
u
... sonst Commit

48
”Transaction per View”

RDBMS + Web-Anwendung
F¨r jeden Request wird eine Transaction erstellt
u
RuntimeExceptions f¨hren zu einem Rollback,
u
... sonst Commit

HBase + Web-Anwendung
Jeder Request braucht eigene HTable-Instanzen

49
”Transaction per View”

RDBMS + Web-Anwendung
F¨r jeden Request wird eine Transaction erstellt
u
RuntimeExceptions f¨hren zu einem Rollback,
u
... sonst Commit

HBase + Web-Anwendung
Jeder Request braucht eigene HTable-Instanzen
Problem: Wir wissen vorher nicht, auf welche Tabellen
zugegriffen wird

50
”Transaction per View”

RDBMS + Web-Anwendung
F¨r jeden Request wird eine Transaction erstellt
u
RuntimeExceptions f¨hren zu einem Rollback,
u
... sonst Commit

HBase + Web-Anwendung
Jeder Request braucht eigene HTable-Instanzen
Problem: Wir wissen vorher nicht, auf welche Tabellen
zugegriffen wird
L¨sung: Proxy Objekt + Thread-local HTable-Zuordnung
o

51
Row IDs erzeugen

ID Erzeugung ist nicht atomar
GET aktueller Wert
+1
PUT neuer Wert

52
Row IDs erzeugen

ID Erzeugung ist nicht atomar
GET aktueller Wert
+1
PUT neuer Wert

Counter
HTable table = new HTable(conf, "IDs");
long counter1 = table.incrementColumnValue(
Bytes.toBytes("person_ids"),
Bytes.toBytes("family"),
Bytes.toBytes("next_id"),
1);

53
Primary Keys

54
Secondary Keys

55
Secondary Keys - Backrefs

56
Secondary Keys und Scanner - St¨dtenamen
a

Java
Configuration c = new Configuration();
HTable person = new HTable(c, "personFK");
Scan s = new Scan(
Bytes.toBytes("FK:Stadt:A"),
Bytes.toBytes("FK:Stadt:L"));
ResultScanner rs = person.getScanner(s);
...

57
Secondary Keys und Scanner - Postleitzahlen

Java
Configuration c = new Configuration();
HTable person = new HTable(c, "personFK");
Scan s = new Scan(
Bytes.toBytes("FK:PLZ:50667"),
Bytes.toBytes("FK:PLZ:51150"));
ResultScanner rs = person.getScanner(s);
...

58
Secondary Keys und Scanner - Alter?
Configuration c = new Configuration();
HTable person = new HTable(c, "personFK");
Scan s = new Scan(
Bytes.toBytes("FK:Alter:2"),
Bytes.toBytes("FK:Alter:51"));
ResultScanner rs = person.getScanner(s);
...

59
Secondary Keys und Scanner - Alter?
Configuration c = new Configuration();
HTable person = new HTable(c, "personFK");
Scan s = new Scan(
Bytes.toBytes("FK:Alter:2"),
Bytes.toBytes("FK:Alter:51"));
ResultScanner rs = person.getScanner(s);
...

Problem: IDs werden Byte-Lexikographisch sortiert
2
3
51
6
7
60
Secondary Keys und Scanner - Alter?

Padding
2 → 0002
12 → 0012
42 → 0042
135 → 0135

61
Secondary Keys und Scanner - Alter?

Padding
2 → 0002
12 → 0012
42 → 0042
135 → 0135

Probleme
Maximale Zahlenl¨nge muss bekannt sein
a

62
Secondary Keys und Scanner - Alter?

Wie w¨re eine andere Zahlendarstellung? (Additionssystem)
a
2→2
12 → 92
42 → 99992
135 → 99999999999995

63
Secondary Keys und Scanner - Alter?

Wie w¨re eine andere Zahlendarstellung? (Additionssystem)
a
2→2
12 → 92
42 → 99992
135 → 99999999999995

Probleme
Sehr ineffizient bzgl. Platzbedarf
Zahl ist nicht lesbar

64
Secondary Keys und Scanner - Alter?

L¨sung: Additionssystem und Stellenwertsystem kombinieren
o
2 → 1#2
12 → 2#12
42 → 2#42
135 → 3#135

65
Fazit 1/6

Entweder man macht es so, wie HBase es will, oder man l¨sst
a
es bleiben!
Bitte keine O/H(Base) Mapper!

66
Fazit 2/6

Kostenargumente sind schwer dem Kunden zu verkaufen,
wenn Oracle und Co. schon im Einsatz ist, Lizenzen
vorhanden sind, etc.

67
Fazit 3/6

HBase kann sehr gut mehrere Rechner nutzen
Jedoch muss man diese Eigenschaft nutzen, um uberhaupt
¨
erst eine gute Performance zu erhalten

68
Fazit 4/6

HBase (& Co.): Imperativ
SQL: Deklarativ

69
Fazit 5/6

Es ist nicht leicht, im Team stabile Tests zu erstellen
Man vermisst jdbc:h2:mem:testdb

70
Fazit 6/6

Die Vorteile von HBase wurden durch Verzicht erm¨glicht
o

71
Wir stellen ein!

Wir suchen professionelle Java-Geeks!
Wir bieten eine gesunde Mischung aus
Programmierer
Berater
Kicker-Profi

Bitte bei mir melden!
roelofsen@weiglewilczek.com

72
Vielen Dank f¨r Ihre Aufmerksamkeit!
u
Fragen?

73

Weitere ähnliche Inhalte

Was ist angesagt?

JBoss EAP clustering
JBoss EAP clustering JBoss EAP clustering
JBoss EAP clustering hwilming
 
Der Datenbank-Backup ist gemacht - was nun?
Der Datenbank-Backup ist gemacht - was nun?Der Datenbank-Backup ist gemacht - was nun?
Der Datenbank-Backup ist gemacht - was nun?FromDual GmbH
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"schellsoft
 
JBoss AS / EAP Clustering
JBoss AS / EAP  ClusteringJBoss AS / EAP  Clustering
JBoss AS / EAP Clusteringhwilming
 
MySQL Performance Tuning für Oracle-DBA's
MySQL Performance Tuning für Oracle-DBA'sMySQL Performance Tuning für Oracle-DBA's
MySQL Performance Tuning für Oracle-DBA'sFromDual GmbH
 
Nagios Conference 2007 | Vmware Monitoring by Ingo Latschner
Nagios Conference 2007 | Vmware Monitoring by Ingo LatschnerNagios Conference 2007 | Vmware Monitoring by Ingo Latschner
Nagios Conference 2007 | Vmware Monitoring by Ingo LatschnerNETWAYS
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...OPEN KNOWLEDGE GmbH
 
AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 PerformanceUlrich Krause
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudAOE
 
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...Christian Wenz
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch CachingAOE
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenLenz Grimmer
 
MySQL Absicherung und Datensicherung
MySQL Absicherung und DatensicherungMySQL Absicherung und Datensicherung
MySQL Absicherung und DatensicherungLenz Grimmer
 
Ladezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript KomprimierenLadezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript KomprimierenJoomla! User Group Fulda
 
MySQL Cluster with Galera Cluster for MySQL
MySQL Cluster with Galera Cluster for MySQLMySQL Cluster with Galera Cluster for MySQL
MySQL Cluster with Galera Cluster for MySQLFromDual GmbH
 
MySQL für Oracle DBA's
MySQL für Oracle DBA'sMySQL für Oracle DBA's
MySQL für Oracle DBA'sFromDual GmbH
 

Was ist angesagt? (18)

JBoss EAP clustering
JBoss EAP clustering JBoss EAP clustering
JBoss EAP clustering
 
Der Datenbank-Backup ist gemacht - was nun?
Der Datenbank-Backup ist gemacht - was nun?Der Datenbank-Backup ist gemacht - was nun?
Der Datenbank-Backup ist gemacht - was nun?
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"
 
JBoss AS / EAP Clustering
JBoss AS / EAP  ClusteringJBoss AS / EAP  Clustering
JBoss AS / EAP Clustering
 
MySQL Performance Tuning für Oracle-DBA's
MySQL Performance Tuning für Oracle-DBA'sMySQL Performance Tuning für Oracle-DBA's
MySQL Performance Tuning für Oracle-DBA's
 
Nagios Conference 2007 | Vmware Monitoring by Ingo Latschner
Nagios Conference 2007 | Vmware Monitoring by Ingo LatschnerNagios Conference 2007 | Vmware Monitoring by Ingo Latschner
Nagios Conference 2007 | Vmware Monitoring by Ingo Latschner
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
 
AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 Performance
 
NoSQL with MySQL
NoSQL with MySQLNoSQL with MySQL
NoSQL with MySQL
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
 
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
Kommunikations-APIs von JavaScript (International PHP Conference/WebTechCon 2...
 
Performance durch Caching
Performance durch CachingPerformance durch Caching
Performance durch Caching
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
 
MySQL Backup
MySQL BackupMySQL Backup
MySQL Backup
 
MySQL Absicherung und Datensicherung
MySQL Absicherung und DatensicherungMySQL Absicherung und Datensicherung
MySQL Absicherung und Datensicherung
 
Ladezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript KomprimierenLadezeiten Verbessern - Css Und JavaScript Komprimieren
Ladezeiten Verbessern - Css Und JavaScript Komprimieren
 
MySQL Cluster with Galera Cluster for MySQL
MySQL Cluster with Galera Cluster for MySQLMySQL Cluster with Galera Cluster for MySQL
MySQL Cluster with Galera Cluster for MySQL
 
MySQL für Oracle DBA's
MySQL für Oracle DBA'sMySQL für Oracle DBA's
MySQL für Oracle DBA's
 

Andere mochten auch

הפסדים ורווחי אנרגיה
הפסדים ורווחי אנרגיההפסדים ורווחי אנרגיה
הפסדים ורווחי אנרגיהIlan Langer
 
Iir Jurisprudentiedag
Iir JurisprudentiedagIir Jurisprudentiedag
Iir Jurisprudentiedagweerokoster
 
A+ Update Endpoint Encryption
A+ Update Endpoint EncryptionA+ Update Endpoint Encryption
A+ Update Endpoint EncryptionOSU - East
 
Mn1 sec 2 - les 2 - (aley imran 190 - 195)
Mn1   sec 2 - les 2 - (aley imran 190 - 195)Mn1   sec 2 - les 2 - (aley imran 190 - 195)
Mn1 sec 2 - les 2 - (aley imran 190 - 195)Fawad Kiyani
 
Google apps and Python para Python Brasil [7]
Google apps and Python para Python Brasil [7]Google apps and Python para Python Brasil [7]
Google apps and Python para Python Brasil [7]Eduardo Maçan
 
Pro Syst Enterprise OSGi
Pro Syst Enterprise OSGiPro Syst Enterprise OSGi
Pro Syst Enterprise OSGiRoman Roelofsen
 
Презентация Гая Ханова
Презентация Гая ХановаПрезентация Гая Ханова
Презентация Гая Хановаguesta73f046
 
Digital dance march 2012
Digital dance march 2012Digital dance march 2012
Digital dance march 2012Sian Jamieson
 
GelişImsel Psikopatoloji Klinikte 2.BöLüM
GelişImsel Psikopatoloji Klinikte 2.BöLüMGelişImsel Psikopatoloji Klinikte 2.BöLüM
GelişImsel Psikopatoloji Klinikte 2.BöLüMGuzel Gunler Poliklinigi
 
PresentacióN Vqv1
PresentacióN Vqv1PresentacióN Vqv1
PresentacióN Vqv1guest084457
 
Crowdfunding for Social Enterprises
Crowdfunding for Social EnterprisesCrowdfunding for Social Enterprises
Crowdfunding for Social EnterprisesSian Jamieson
 
Про розвиток сімейних форм виховання: кількісні та якісні показники
Про розвиток сімейних форм виховання: кількісні та якісні показникиПро розвиток сімейних форм виховання: кількісні та якісні показники
Про розвиток сімейних форм виховання: кількісні та якісні показникиguest274957
 
Mozambique
MozambiqueMozambique
Mozambiqueaviaxis
 
Highland Museum Forum Visitors Survey 2012
Highland Museum Forum Visitors Survey 2012Highland Museum Forum Visitors Survey 2012
Highland Museum Forum Visitors Survey 2012Sian Jamieson
 
Using Social Media for Student Gradutates
Using Social Media for Student GradutatesUsing Social Media for Student Gradutates
Using Social Media for Student GradutatesSian Jamieson
 
Strategia vendita distribuzione per brand
Strategia vendita distribuzione per brandStrategia vendita distribuzione per brand
Strategia vendita distribuzione per brandLuigi Greco
 

Andere mochten auch (20)

הפסדים ורווחי אנרגיה
הפסדים ורווחי אנרגיההפסדים ורווחי אנרגיה
הפסדים ורווחי אנרגיה
 
Iir Jurisprudentiedag
Iir JurisprudentiedagIir Jurisprudentiedag
Iir Jurisprudentiedag
 
A+ Update Endpoint Encryption
A+ Update Endpoint EncryptionA+ Update Endpoint Encryption
A+ Update Endpoint Encryption
 
Mn1 sec 2 - les 2 - (aley imran 190 - 195)
Mn1   sec 2 - les 2 - (aley imran 190 - 195)Mn1   sec 2 - les 2 - (aley imran 190 - 195)
Mn1 sec 2 - les 2 - (aley imran 190 - 195)
 
Google apps and Python para Python Brasil [7]
Google apps and Python para Python Brasil [7]Google apps and Python para Python Brasil [7]
Google apps and Python para Python Brasil [7]
 
Pro Syst Enterprise OSGi
Pro Syst Enterprise OSGiPro Syst Enterprise OSGi
Pro Syst Enterprise OSGi
 
Презентация Гая Ханова
Презентация Гая ХановаПрезентация Гая Ханова
Презентация Гая Ханова
 
Digital dance march 2012
Digital dance march 2012Digital dance march 2012
Digital dance march 2012
 
GelişImsel Psikopatoloji Klinikte 2.BöLüM
GelişImsel Psikopatoloji Klinikte 2.BöLüMGelişImsel Psikopatoloji Klinikte 2.BöLüM
GelişImsel Psikopatoloji Klinikte 2.BöLüM
 
PresentacióN Vqv1
PresentacióN Vqv1PresentacióN Vqv1
PresentacióN Vqv1
 
Crowdfunding for Social Enterprises
Crowdfunding for Social EnterprisesCrowdfunding for Social Enterprises
Crowdfunding for Social Enterprises
 
One Piece 549
One Piece 549One Piece 549
One Piece 549
 
Про розвиток сімейних форм виховання: кількісні та якісні показники
Про розвиток сімейних форм виховання: кількісні та якісні показникиПро розвиток сімейних форм виховання: кількісні та якісні показники
Про розвиток сімейних форм виховання: кількісні та якісні показники
 
Mozambique
MozambiqueMozambique
Mozambique
 
Odev zamani 28.04.12
Odev zamani 28.04.12Odev zamani 28.04.12
Odev zamani 28.04.12
 
Highland Museum Forum Visitors Survey 2012
Highland Museum Forum Visitors Survey 2012Highland Museum Forum Visitors Survey 2012
Highland Museum Forum Visitors Survey 2012
 
Otizmi tanımak
Otizmi tanımakOtizmi tanımak
Otizmi tanımak
 
Using Social Media for Student Gradutates
Using Social Media for Student GradutatesUsing Social Media for Student Gradutates
Using Social Media for Student Gradutates
 
Strategia vendita distribuzione per brand
Strategia vendita distribuzione per brandStrategia vendita distribuzione per brand
Strategia vendita distribuzione per brand
 
Orhidee
OrhideeOrhidee
Orhidee
 

Ähnlich wie Webanwendungen mit Apache HBase entwickeln

Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSRalf Ernst
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenMayflower GmbH
 
Sql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenSql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenCommunardo GmbH
 
Sql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSharepointUGDD
 
Best Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationBest Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationSamuel Zürcher
 
Überblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeÜberblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeAndreas Schreiber
 
mongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - GrundlagenmongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - Grundlageninovex GmbH
 
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudSQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudAWS Germany
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBMario Müller
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro sessionVirttoo org
 
Service Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache MesosService Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache MesosRalf Ernst
 
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenz
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG KonferenzDomino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenz
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenzpanagenda
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdAOE
 
Ajax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestAjax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestBastian Feder
 
Wordpress on steroids
Wordpress on steroidsWordpress on steroids
Wordpress on steroidsBlogwerk AG
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrants0enke
 
Webanwendungen - Installation, Konfiguration und Administration
Webanwendungen - Installation, Konfiguration und AdministrationWebanwendungen - Installation, Konfiguration und Administration
Webanwendungen - Installation, Konfiguration und AdministrationThomas Siegers
 

Ähnlich wie Webanwendungen mit Apache HBase entwickeln (20)

Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OS
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Sql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint AdministratorenSql Server Grundlagen für Sharepoint Administratoren
Sql Server Grundlagen für Sharepoint Administratoren
 
Sql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point AdminsSql Server GrundlagenfüR Share Point Admins
Sql Server GrundlagenfüR Share Point Admins
 
Best Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL InstallationBest Practices SharePoint and SQL Installation
Best Practices SharePoint and SQL Installation
 
Überblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle VersionsmanagementsystemeÜberblick über aktuelle Versionsmanagementsysteme
Überblick über aktuelle Versionsmanagementsysteme
 
mongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - GrundlagenmongoDB im Einsatz - Grundlagen
mongoDB im Einsatz - Grundlagen
 
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudSQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
 
GWT
GWTGWT
GWT
 
Dokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDBDokumentenorientiere Datenbanken am Beispiel CouchDB
Dokumentenorientiere Datenbanken am Beispiel CouchDB
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro session
 
Service Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache MesosService Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache Mesos
 
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenz
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG KonferenzDomino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenz
Domino Statistiken verstehen und nutzen (Teil 1) - 41. DNUG Konferenz
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Ajax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestAjax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google Suggest
 
Wordpress on steroids
Wordpress on steroidsWordpress on steroids
Wordpress on steroids
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Webanwendungen - Installation, Konfiguration und Administration
Webanwendungen - Installation, Konfiguration und AdministrationWebanwendungen - Installation, Konfiguration und Administration
Webanwendungen - Installation, Konfiguration und Administration
 
Daos
DaosDaos
Daos
 

Webanwendungen mit Apache HBase entwickeln

  • 1. Webanwendungen mit Apache HBase entwickeln Roman Roelofsen Managing Director (aka Alpha Geek) Weigle Wilczek GmbH Twitter: romanroe JAX, 19. April 2012 1
  • 2. ¨ WeigleWilczek - Uber Uns IT-Beratung, Software-Entwicklung Typische Anwendungen ”Web-Anwendungen” Lagerverwaltung Kennzahlenanalyse, Dashboards Kein Facebook, Twitter, etc. 2
  • 3. Typischer Stack JVM Jetty/Tomcat/WebSphere Guice/Spring Diverse Web-Frameworks Diverse RDBMS (MySQL, PostreSQL, ...) Ein paar Exoten MongoDB Prevayler 3
  • 4. Probleme mit RDBMS Schlechte horizontale Skalierung Option A) Partitionierung nach Funktion Option B) Partitionierung nach PK, Hash, etc. Vertikale Skalierung ist teuer 4
  • 5. Warum NoSQL? Buzzword! (== Spaß, meistens jedenfalls) Partitionierungsf¨higkeiten sind wirtschaftlich interessant a Skaliert die Abfragezeit mit der Serveranzahl? Kosten f¨r Redundanz k¨nnen berechnet werden u o memcached, etc. wird uberfl¨ssig (weniger Administration) u ¨ NoSQL-Architekturen passen gut zum Cloud-Trend Apache Hadoop wird (in den USA) sehr gehyped → Evaluierung 5
  • 9. Auswahl NoSQL Sammelbegriff f¨r viele Datenbanken u Dokumenten-Datenbank Graph-Datenbank Key/Value Datenbank Objekt-Datenbank Google’s BigTable, Amazon’s Dynamo ... 9
  • 10. Google’s BigTable Verteilte Key/Value Datenbank Basiert auf Google File System Fehlertolerant Skalierbar L¨uft auf ”billiger” Hardware a Erlaubt Parallelisierung (MapReduce & Co.) 10
  • 11. Apache Hadoop Stack Hadoop Verteiltes Dateisystem (HDFS) Hive Abfragen MapReduce Implementierung f¨r das HDFS u HBase BigTable-Implementierung MediaGuardian Innovation Awards: Innovator of the Year Wikipedia: ”...Hervorgehoben wurde, dass Hadoop so vielseitige und weitreichende Anwendungen erm¨glicht, dass es o sich als Beginn einer neuen Datenrevolution erweisen k¨nne.” o 11
  • 12. Exkurs: HBase vs. Cassandra HBase Vorteile Konsistenz Read-Performance > Write-Performance Cassandra Vorteile Write-Performance > Read-Performance Wichtig f¨r Business-Anwendungen u Konsistenz Read-Performance Abfragen 12
  • 13. HBase - Datendesign Key/Value Datenbank java.util.Map Row Map<ROW_ID, DATA> 13
  • 14. HBase - Datendesign Key/Value Datenbank java.util.Map Row Map<ROW_ID, DATA> Column Family Map<ROW_ID, Map<FAMILY_ID, DATA>> 14
  • 15. HBase - Datendesign Key/Value Datenbank java.util.Map Row Map<ROW_ID, DATA> Column Family Map<ROW_ID, Map<FAMILY_ID, DATA>> Column Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>> 15
  • 16. HBase - Datendesign Key/Value Datenbank java.util.Map Row Map<ROW_ID, DATA> Column Family Map<ROW_ID, Map<FAMILY_ID, DATA>> Column Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>> Alle Werte sind byte[] Map<byte[], Map<byte[], Map<byte[], byte[]>>> 16
  • 18. HBase - Datendesign Zeilen IDs werden Byte-Lexikographisch sortiert Innerhalb einer Zeile werden Spalten Byte-Lexikographisch sortiert Zeilen- und Spaltenabschnitte k¨nnen leicht ”gescannt” o werden Wichtige Eigenschaft, um Indizes zu simulieren bzw. Abfragen zu erm¨glichen o 18
  • 19. HBase - Column Families Column Families werden in unterschiedlichen Dateien gespeichert 19
  • 20. HBase - Horizontale Skalierung IDs werden in Regionen aufgeteilt Regionen werden auf Region Servers gespeichert Regionen und Region Server werden je nach Auslastung neu angeordnet 20
  • 21. HBase - Versionierung Jede ”Zelle” wird mit einem Timestamp gespeichert und automatisch versioniert 21
  • 22. HBase - Versionierung Jede ”Zelle” wird mit einem Timestamp gespeichert und automatisch versioniert Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>> 22
  • 23. HBase - Versionierung Jede ”Zelle” wird mit einem Timestamp gespeichert und automatisch versioniert Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>> Default: 3 Versionen Timestamp wird beim Schreiben vom Server gesetzt, kann aber vom Client uberschrieben werden ¨ 23
  • 25. HBase - Getting Started Standalone Mode Zur Entwicklung kann HBase im Standalone Modus gestartet werden HDFS wird dann nicht verwendet HBase und ZooKeeper laufen in der selben JVM Shell bin/hbase shell hbase(main):001:0> status 1 servers, 0 dead, 0.0000 average load 25
  • 26. Exkurs: Ubuntu 11.10 und HBase /etc/hosts 127.0.0.1 localhost #127.0.1.1 servername 192.168.178.44 localhost 26
  • 27. HBase API - Tabellen anlegen Tabellen m¨ssen explizit angelegt werden u Shell create ’person’, ’cfamily1’ 27
  • 28. HBase API - Tabellen anlegen Tabellen m¨ssen explizit angelegt werden u Shell create ’person’, ’cfamily1’ Java Configuration c = new Configuration(); HBaseAdmin admin = new HBaseAdmin(c); HTableDescriptor person = new HTableDescriptor("person"); person.addFamily(new HColumnDescriptor("cfamily1")); admin.createTable(person); 28
  • 29. HBase API - Daten speichern Shell put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’ put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’ 29
  • 30. HBase API - Daten speichern Shell put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’ put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’ Java Configuration c = new Configuration(); HTable person = new HTable(c, "person"); Put put = new Put(Bytes.toBytes("id_1")); put.add(Bytes.toBytes("cfamily1"), Bytes.toBytes("firstname"), Bytes.toBytes("John")); put.add(Bytes.toBytes("cfamily1"), Bytes.toBytes("lastname"), Bytes.toBytes("McCarthy")); person.put(put); 30
  • 31. HBase API - Daten lesen Shell hbase(main):001:0> scan ’person’ ROW COLUMN+CELL id_1 column=cfamily1:firstname, timestamp=123, value=John id_1 column=cfamily1:lastname, timestamp=123, value=McCarthy 1 row(s) in 0.1100 seconds 31
  • 32. HBase API - Daten lesen Java Configuration c = new Configuration(); HTable person = new HTable(c, "person"); Get get = new Get(Bytes.toBytes("id_1")); get.addColumn(Bytes.toBytes("cfamily1"), Bytes.toBytes("firstname")); get.addColumn(Bytes.toBytes("cfamily1"), Bytes.toBytes("lastname")); Result result = person.get(get); byte[] firstname = result.getValue(Bytes.toBytes("cfamily1"), Bytes.toBytes("firstname")); .. 32
  • 33. HBase API - Daten l¨schen o Shell delete ’person’, ’id_1’, ’cfamily1:firstname’ 33
  • 34. HBase API - Daten l¨schen o Shell delete ’person’, ’id_1’, ’cfamily1:firstname’ Java Configuration c = new Configuration(); HTable person = new HTable(c, "person"); Delete delete = new Delete(Bytes.toBytes("id_1")); delete.setTimestamp(1); person.delete(delete); 34
  • 35. HBase API - Scanner Java Configuration c = new Configuration(); HTable person = new HTable(c, "person"); Scan s = new Scan( Bytes.toBytes("id_1"), Bytes.toBytes("id_5")); s.addFamily(Bytes.toBytes("cfamily1")); ResultScanner rs = person.getScanner(s); // while.... Result r = rs.next(); r.getValue(Bytes.toBytes("cfamily1"), Bytes.toBytes("firstname")); ... 35
  • 37. Web-Anwendungen Mehrere Threads im Server API muss (sollte) Thread-safe sein Synchronisation beim Datenbankzugriff notwendig Locking, Isolierung, ... Multi-User Umgebung Gemeinsame Updates w¨ren w¨nschenswert a u Viele Views auf die selben Daten Anzahl Reads > Anzahl Writes Viele, kurzlebige Ausf¨hrungen u 37
  • 38. Atomare Operationen, Isolierung Atomare Operationen sind: Put, Get, Delete, ... Keine Gruppierung m¨glich! o Jeder Aufruf ist direkt ein RPC-call 38
  • 39. Atomare Operationen, Isolierung Atomare Operationen sind: Put, Get, Delete, ... Keine Gruppierung m¨glich! o Jeder Aufruf ist direkt ein RPC-call Client-side Buffer table.setAutoFlush(false) Put-Operationen werden im Client gepuffert Explizit senden mit table.flushCommits() Implizit basierend auf Heap-Verbrauch 39
  • 40. Atomare Operationen, Isolierung Batch-Support List<Row> ops = new LinkedList<Row>(); Put put1 = new Put(Bytes.toBytes("id1"); put1.add(Bytes.toBytes("cf"), Bytes.toBytes("col"), Bytes.toBytes("abc")); ops.add(put1); Put put2 = new Put(Bytes.toBytes("id2"); put2.add(Bytes.toBytes("cf"), Bytes.toBytes("col"), Bytes.toBytes("def")); ops.add(put12; Object[] result = new Object[ops.size()]; table.batch(ops, result); 40
  • 41. Atomare Operationen, Isolierung Reihenfolge im Batch-Betrieb ist nicht explizit und wird vom Client optimiert Daher sollten keine Put- und Delete-Operationen f¨r die u selben Rows gemischt werde Egal wie und wann, andere Clients sehen Zwischenschritte 41
  • 42. Compare and Swap HBase erlaubt atomare compare-and-swap Operationen Put update = new Put(Bytes.toBytes("id1")); update.add( Bytes.toBytes("cfamily1"), Bytes.toBytes("firstname"), Bytes.toBytes("Max")); boolean wasUpdated = person.checkAndPut( Bytes.toBytes("id1"), Bytes.toBytes("cfamily1"), Bytes.toBytes("version"), Bytes.toBytes("3"), update); Erm¨glicht Optimistic-Locking o 42
  • 43. Synchronisation uber Locks m¨glich o ¨ Mehrere Operationen k¨nnen nicht als eine, atomare o Operation durchgef¨hrt werden u Andere Clients werden immer Zwischenschritte sehen Wenn Clients sich auf gemeinsame Locks einigen, ist zumindest eine Synchronisation m¨glich o RowLock id1lock = person.lockRow(Bytes.toBytes("id1")); ... ... person.unlockRow(id1lock); 43
  • 44. Synchronisation uber Locks m¨glich o ¨ Probleme Welche Rows eignen sich als gemeinsamer Lock? Gefahr von Deadlocks 44
  • 45. Thread-Sicherheit der API HTable Das Erstellen einer HTable-Instanz kann mehrere Sekunden dauern Instanzen sollten daher immer wiederverwendet werden 45
  • 46. Thread-Sicherheit der API HTable Das Erstellen einer HTable-Instanz kann mehrere Sekunden dauern Instanzen sollten daher immer wiederverwendet werden Problem: Instanzen sind nicht Thread-safe 46
  • 47. Thread-Sicherheit der API HTable Das Erstellen einer HTable-Instanz kann mehrere Sekunden dauern Instanzen sollten daher immer wiederverwendet werden Problem: Instanzen sind nicht Thread-safe L¨sung: HTablePool o HTablePool pool = new HTablePool(c, Integer.MAX_VALUE); HTable table = pool.getTable("person"); ... table.close(); 47
  • 48. ”Transaction per View” RDBMS + Web-Anwendung F¨r jeden Request wird eine Transaction erstellt u RuntimeExceptions f¨hren zu einem Rollback, u ... sonst Commit 48
  • 49. ”Transaction per View” RDBMS + Web-Anwendung F¨r jeden Request wird eine Transaction erstellt u RuntimeExceptions f¨hren zu einem Rollback, u ... sonst Commit HBase + Web-Anwendung Jeder Request braucht eigene HTable-Instanzen 49
  • 50. ”Transaction per View” RDBMS + Web-Anwendung F¨r jeden Request wird eine Transaction erstellt u RuntimeExceptions f¨hren zu einem Rollback, u ... sonst Commit HBase + Web-Anwendung Jeder Request braucht eigene HTable-Instanzen Problem: Wir wissen vorher nicht, auf welche Tabellen zugegriffen wird 50
  • 51. ”Transaction per View” RDBMS + Web-Anwendung F¨r jeden Request wird eine Transaction erstellt u RuntimeExceptions f¨hren zu einem Rollback, u ... sonst Commit HBase + Web-Anwendung Jeder Request braucht eigene HTable-Instanzen Problem: Wir wissen vorher nicht, auf welche Tabellen zugegriffen wird L¨sung: Proxy Objekt + Thread-local HTable-Zuordnung o 51
  • 52. Row IDs erzeugen ID Erzeugung ist nicht atomar GET aktueller Wert +1 PUT neuer Wert 52
  • 53. Row IDs erzeugen ID Erzeugung ist nicht atomar GET aktueller Wert +1 PUT neuer Wert Counter HTable table = new HTable(conf, "IDs"); long counter1 = table.incrementColumnValue( Bytes.toBytes("person_ids"), Bytes.toBytes("family"), Bytes.toBytes("next_id"), 1); 53
  • 56. Secondary Keys - Backrefs 56
  • 57. Secondary Keys und Scanner - St¨dtenamen a Java Configuration c = new Configuration(); HTable person = new HTable(c, "personFK"); Scan s = new Scan( Bytes.toBytes("FK:Stadt:A"), Bytes.toBytes("FK:Stadt:L")); ResultScanner rs = person.getScanner(s); ... 57
  • 58. Secondary Keys und Scanner - Postleitzahlen Java Configuration c = new Configuration(); HTable person = new HTable(c, "personFK"); Scan s = new Scan( Bytes.toBytes("FK:PLZ:50667"), Bytes.toBytes("FK:PLZ:51150")); ResultScanner rs = person.getScanner(s); ... 58
  • 59. Secondary Keys und Scanner - Alter? Configuration c = new Configuration(); HTable person = new HTable(c, "personFK"); Scan s = new Scan( Bytes.toBytes("FK:Alter:2"), Bytes.toBytes("FK:Alter:51")); ResultScanner rs = person.getScanner(s); ... 59
  • 60. Secondary Keys und Scanner - Alter? Configuration c = new Configuration(); HTable person = new HTable(c, "personFK"); Scan s = new Scan( Bytes.toBytes("FK:Alter:2"), Bytes.toBytes("FK:Alter:51")); ResultScanner rs = person.getScanner(s); ... Problem: IDs werden Byte-Lexikographisch sortiert 2 3 51 6 7 60
  • 61. Secondary Keys und Scanner - Alter? Padding 2 → 0002 12 → 0012 42 → 0042 135 → 0135 61
  • 62. Secondary Keys und Scanner - Alter? Padding 2 → 0002 12 → 0012 42 → 0042 135 → 0135 Probleme Maximale Zahlenl¨nge muss bekannt sein a 62
  • 63. Secondary Keys und Scanner - Alter? Wie w¨re eine andere Zahlendarstellung? (Additionssystem) a 2→2 12 → 92 42 → 99992 135 → 99999999999995 63
  • 64. Secondary Keys und Scanner - Alter? Wie w¨re eine andere Zahlendarstellung? (Additionssystem) a 2→2 12 → 92 42 → 99992 135 → 99999999999995 Probleme Sehr ineffizient bzgl. Platzbedarf Zahl ist nicht lesbar 64
  • 65. Secondary Keys und Scanner - Alter? L¨sung: Additionssystem und Stellenwertsystem kombinieren o 2 → 1#2 12 → 2#12 42 → 2#42 135 → 3#135 65
  • 66. Fazit 1/6 Entweder man macht es so, wie HBase es will, oder man l¨sst a es bleiben! Bitte keine O/H(Base) Mapper! 66
  • 67. Fazit 2/6 Kostenargumente sind schwer dem Kunden zu verkaufen, wenn Oracle und Co. schon im Einsatz ist, Lizenzen vorhanden sind, etc. 67
  • 68. Fazit 3/6 HBase kann sehr gut mehrere Rechner nutzen Jedoch muss man diese Eigenschaft nutzen, um uberhaupt ¨ erst eine gute Performance zu erhalten 68
  • 69. Fazit 4/6 HBase (& Co.): Imperativ SQL: Deklarativ 69
  • 70. Fazit 5/6 Es ist nicht leicht, im Team stabile Tests zu erstellen Man vermisst jdbc:h2:mem:testdb 70
  • 71. Fazit 6/6 Die Vorteile von HBase wurden durch Verzicht erm¨glicht o 71
  • 72. Wir stellen ein! Wir suchen professionelle Java-Geeks! Wir bieten eine gesunde Mischung aus Programmierer Berater Kicker-Profi Bitte bei mir melden! roelofsen@weiglewilczek.com 72
  • 73. Vielen Dank f¨r Ihre Aufmerksamkeit! u Fragen? 73