Top Banner
1 Webanwendungen mit Apache HBase entwickeln Roman Roelofsen Managing Director (aka Alpha Geek) Weigle Wilczek GmbH Twitter: romanroe JAX, 19. April 2012
73

Webanwendungen mit Apache HBase entwickeln

Jul 27, 2015

Download

Technology

Roman Roelofsen
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Webanwendungen mit Apache HBase entwickeln

1

Webanwendungen mit Apache HBase entwickeln

Roman RoelofsenManaging Director (aka Alpha Geek)

Weigle Wilczek GmbH

Twitter: romanroe

JAX, 19. April 2012

Page 2: Webanwendungen mit Apache HBase entwickeln

2

WeigleWilczek - Uber Uns

I IT-Beratung, Software-Entwicklung

I Typische AnwendungenI ”Web-Anwendungen”I LagerverwaltungI Kennzahlenanalyse, Dashboards

I Kein Facebook, Twitter, etc.

Page 3: Webanwendungen mit Apache HBase entwickeln

3

Typischer Stack

I JVM

I Jetty/Tomcat/WebSphere

I Guice/Spring

I Diverse Web-Frameworks

I Diverse RDBMS (MySQL, PostreSQL, ...)I Ein paar Exoten

I MongoDBI Prevayler

Page 4: Webanwendungen mit Apache HBase entwickeln

4

Probleme mit RDBMS

I Schlechte horizontale SkalierungI Option A) Partitionierung nach FunktionI Option B) Partitionierung nach PK, Hash, etc.

I Vertikale Skalierung ist teuer

Page 5: Webanwendungen mit Apache HBase entwickeln

5

Warum NoSQL?

I Buzzword! (== Spaß, meistens jedenfalls)I Partitionierungsfahigkeiten sind wirtschaftlich interessant

I Skaliert die Abfragezeit mit der Serveranzahl?I Kosten fur Redundanz konnen berechnet werdenI memcached, etc. wird uberflussig (weniger Administration)

I NoSQL-Architekturen passen gut zum Cloud-Trend

I Apache Hadoop wird (in den USA) sehr gehyped

I → Evaluierung

Page 6: Webanwendungen mit Apache HBase entwickeln

6

Warum NoSQL?

Page 7: Webanwendungen mit Apache HBase entwickeln

7

Warum NoSQL?

Page 8: Webanwendungen mit Apache HBase entwickeln

8

Warum NoSQL?

Page 9: Webanwendungen mit Apache HBase entwickeln

9

Auswahl NoSQL

I Sammelbegriff fur viele DatenbankenI Dokumenten-DatenbankI Graph-DatenbankI Key/Value DatenbankI Objekt-DatenbankI Google’s BigTable, Amazon’s DynamoI ...

Page 10: Webanwendungen mit Apache HBase entwickeln

10

Google’s BigTable

I Verteilte Key/Value Datenbank

I Basiert auf Google File System

I Fehlertolerant

I Skalierbar

I Lauft auf ”billiger” Hardware

I Erlaubt Parallelisierung (MapReduce & Co.)

Page 11: Webanwendungen mit Apache HBase entwickeln

11

Apache Hadoop Stack

I HadoopI Verteiltes Dateisystem (HDFS)

I HiveI Abfragen

I MapReduceI Implementierung fur das HDFS

I HBaseI BigTable-Implementierung

I MediaGuardian Innovation Awards: Innovator of the YearI Wikipedia: ”...Hervorgehoben wurde, dass Hadoop so

vielseitige und weitreichende Anwendungen ermoglicht, dass essich als Beginn einer neuen Datenrevolution erweisen konne.”

Page 12: Webanwendungen mit Apache HBase entwickeln

12

Exkurs: HBase vs. Cassandra

I HBase VorteileI KonsistenzI Read-Performance > Write-Performance

I Cassandra VorteileI Write-Performance > Read-Performance

I Wichtig fur Business-AnwendungenI KonsistenzI Read-PerformanceI Abfragen

Page 13: Webanwendungen mit Apache HBase entwickeln

13

HBase - Datendesign

I Key/Value DatenbankI java.util.Map

I Row

Map<ROW_ID, DATA>

I Column Family

Map<ROW_ID, Map<FAMILY_ID, DATA>>

I Column

Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

I Alle Werte sind byte[]

Map<byte[], Map<byte[], Map<byte[], byte[]>>>

Page 14: Webanwendungen mit Apache HBase entwickeln

14

HBase - Datendesign

I Key/Value DatenbankI java.util.Map

I Row

Map<ROW_ID, DATA>

I Column Family

Map<ROW_ID, Map<FAMILY_ID, DATA>>

I Column

Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

I Alle Werte sind byte[]

Map<byte[], Map<byte[], Map<byte[], byte[]>>>

Page 15: Webanwendungen mit Apache HBase entwickeln

15

HBase - Datendesign

I Key/Value DatenbankI java.util.Map

I Row

Map<ROW_ID, DATA>

I Column Family

Map<ROW_ID, Map<FAMILY_ID, DATA>>

I Column

Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

I Alle Werte sind byte[]

Map<byte[], Map<byte[], Map<byte[], byte[]>>>

Page 16: Webanwendungen mit Apache HBase entwickeln

16

HBase - Datendesign

I Key/Value DatenbankI java.util.Map

I Row

Map<ROW_ID, DATA>

I Column Family

Map<ROW_ID, Map<FAMILY_ID, DATA>>

I Column

Map<ROW_ID, Map<FAMILY_ID, Map<COLUMN_ID, DATA>>>

I Alle Werte sind byte[]

Map<byte[], Map<byte[], Map<byte[], byte[]>>>

Page 17: Webanwendungen mit Apache HBase entwickeln

17

HBase - Datendesign

Page 18: Webanwendungen mit Apache HBase entwickeln

18

HBase - Datendesign

I Zeilen IDs werden Byte-Lexikographisch sortiert

I Innerhalb einer Zeile werden Spalten Byte-Lexikographischsortiert

I Zeilen- und Spaltenabschnitte konnen leicht ”gescannt”werden

I Wichtige Eigenschaft, um Indizes zu simulieren bzw. Abfragenzu ermoglichen

Page 19: Webanwendungen mit Apache HBase entwickeln

19

HBase - Column Families

I Column Families werden in unterschiedlichen Dateiengespeichert

Page 20: Webanwendungen mit Apache HBase entwickeln

20

HBase - Horizontale Skalierung

I IDs werden in Regionen aufgeteilt

I Regionen werden auf Region Servers gespeichert

I Regionen und Region Server werden je nach Auslastung neuangeordnet

Page 21: Webanwendungen mit Apache HBase entwickeln

21

HBase - Versionierung

I Jede ”Zelle” wird mit einem Timestamp gespeichert undautomatisch versioniert

Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>

I Default: 3 Versionen

I Timestamp wird beim Schreiben vom Server gesetzt,

I kann aber vom Client uberschrieben werden

Page 22: Webanwendungen mit Apache HBase entwickeln

22

HBase - Versionierung

I Jede ”Zelle” wird mit einem Timestamp gespeichert undautomatisch versioniert

Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>

I Default: 3 Versionen

I Timestamp wird beim Schreiben vom Server gesetzt,

I kann aber vom Client uberschrieben werden

Page 23: Webanwendungen mit Apache HBase entwickeln

23

HBase - Versionierung

I Jede ”Zelle” wird mit einem Timestamp gespeichert undautomatisch versioniert

Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>

I Default: 3 Versionen

I Timestamp wird beim Schreiben vom Server gesetzt,

I kann aber vom Client uberschrieben werden

Page 24: Webanwendungen mit Apache HBase entwickeln

24

HBase API Grundlagen

Page 25: Webanwendungen mit Apache HBase entwickeln

25

HBase - Getting Started

I Standalone ModeI Zur Entwicklung kann HBase im Standalone Modus gestartet

werdenI HDFS wird dann nicht verwendetI HBase und ZooKeeper laufen in der selben JVM

I ShellI bin/hbase shell

hbase(main):001:0> status

1 servers, 0 dead, 0.0000 average load

Page 26: Webanwendungen mit Apache HBase entwickeln

26

Exkurs: Ubuntu 11.10 und HBase

I /etc/hosts

127.0.0.1 localhost

#127.0.1.1 servername

192.168.178.44 localhost

Page 27: Webanwendungen mit Apache HBase entwickeln

27

HBase API - Tabellen anlegen

I Tabellen mussen explizit angelegt werden

I Shell

create ’person’, ’cfamily1’

I Java

Configuration c = new Configuration();

HBaseAdmin admin = new HBaseAdmin(c);

HTableDescriptor person = new

HTableDescriptor("person");

person.addFamily(new HColumnDescriptor("cfamily1"));

admin.createTable(person);

Page 28: Webanwendungen mit Apache HBase entwickeln

28

HBase API - Tabellen anlegen

I Tabellen mussen explizit angelegt werden

I Shell

create ’person’, ’cfamily1’

I Java

Configuration c = new Configuration();

HBaseAdmin admin = new HBaseAdmin(c);

HTableDescriptor person = new

HTableDescriptor("person");

person.addFamily(new HColumnDescriptor("cfamily1"));

admin.createTable(person);

Page 29: Webanwendungen mit Apache HBase entwickeln

29

HBase API - Daten speichern

I Shell

put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’

put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’

I 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);

Page 30: Webanwendungen mit Apache HBase entwickeln

30

HBase API - Daten speichern

I Shell

put ’person’, ’id_1’, ’cfamily1:firstname’, ’John’

put ’person’, ’id_1’, ’cfamily1:lastname’, ’McCarthy’

I 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);

Page 31: Webanwendungen mit Apache HBase entwickeln

31

HBase API - Daten lesen

I 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

Page 32: Webanwendungen mit Apache HBase entwickeln

32

HBase API - Daten lesen

I 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"));

..

Page 33: Webanwendungen mit Apache HBase entwickeln

33

HBase API - Daten loschen

I Shell

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

I 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);

Page 34: Webanwendungen mit Apache HBase entwickeln

34

HBase API - Daten loschen

I Shell

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

I 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);

Page 35: Webanwendungen mit Apache HBase entwickeln

35

HBase API - Scanner

I 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"));

...

Page 36: Webanwendungen mit Apache HBase entwickeln

36

HBase und Web-Anwendungen

Page 37: Webanwendungen mit Apache HBase entwickeln

37

Web-Anwendungen

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

I Synchronisation beim Datenbankzugriff notwendigI Locking, Isolierung, ...

I Multi-User UmgebungI Gemeinsame Updates waren wunschenswert

I Viele Views auf die selben DatenI Anzahl Reads > Anzahl Writes

I Viele, kurzlebige Ausfuhrungen

Page 38: Webanwendungen mit Apache HBase entwickeln

38

Atomare Operationen, Isolierung

I Atomare Operationen sind:I Put, Get, Delete, ...I Keine Gruppierung moglich!I Jeder Aufruf ist direkt ein RPC-call

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

Page 39: Webanwendungen mit Apache HBase entwickeln

39

Atomare Operationen, Isolierung

I Atomare Operationen sind:I Put, Get, Delete, ...I Keine Gruppierung moglich!I Jeder Aufruf ist direkt ein RPC-call

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

Page 40: Webanwendungen mit Apache HBase entwickeln

40

Atomare Operationen, Isolierung

I 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);

Page 41: Webanwendungen mit Apache HBase entwickeln

41

Atomare Operationen, Isolierung

I Reihenfolge im Batch-Betrieb ist nicht explizit und wird vomClient optimiert

I Daher sollten keine Put- und Delete-Operationen fur dieselben Rows gemischt werde

I Egal wie und wann, andere Clients sehen Zwischenschritte

Page 42: Webanwendungen mit Apache HBase entwickeln

42

Compare and Swap

I 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);

I Ermoglicht Optimistic-Locking

Page 43: Webanwendungen mit Apache HBase entwickeln

43

Synchronisation uber Locks moglich

I Mehrere Operationen konnen nicht als eine, atomareOperation durchgefuhrt werden

I Andere Clients werden immer Zwischenschritte sehen

I Wenn Clients sich auf gemeinsame Locks einigen, istzumindest eine Synchronisation moglich

RowLock id1lock =

person.lockRow(Bytes.toBytes("id1"));

...

...

person.unlockRow(id1lock);

Page 44: Webanwendungen mit Apache HBase entwickeln

44

Synchronisation uber Locks moglich

I ProblemeI Welche Rows eignen sich als gemeinsamer Lock?I Gefahr von Deadlocks

Page 45: Webanwendungen mit Apache HBase entwickeln

45

Thread-Sicherheit der API

I HTableI Das Erstellen einer HTable-Instanz kann mehrere Sekunden

dauernI Instanzen sollten daher immer wiederverwendet werden

I Problem: Instanzen sind nicht Thread-safeI Losung: HTablePool

HTablePool pool = new HTablePool(c,

Integer.MAX_VALUE);

HTable table = pool.getTable("person");

...

table.close();

Page 46: Webanwendungen mit Apache HBase entwickeln

46

Thread-Sicherheit der API

I HTableI Das Erstellen einer HTable-Instanz kann mehrere Sekunden

dauernI Instanzen sollten daher immer wiederverwendet werdenI Problem: Instanzen sind nicht Thread-safe

I Losung: HTablePool

HTablePool pool = new HTablePool(c,

Integer.MAX_VALUE);

HTable table = pool.getTable("person");

...

table.close();

Page 47: Webanwendungen mit Apache HBase entwickeln

47

Thread-Sicherheit der API

I HTableI Das Erstellen einer HTable-Instanz kann mehrere Sekunden

dauernI Instanzen sollten daher immer wiederverwendet werdenI Problem: Instanzen sind nicht Thread-safeI Losung: HTablePool

HTablePool pool = new HTablePool(c,

Integer.MAX_VALUE);

HTable table = pool.getTable("person");

...

table.close();

Page 48: Webanwendungen mit Apache HBase entwickeln

48

”Transaction per View”

I RDBMS + Web-AnwendungI Fur jeden Request wird eine Transaction erstelltI RuntimeExceptions fuhren zu einem Rollback,I ... sonst Commit

I HBase + Web-AnwendungI Jeder Request braucht eigene HTable-InstanzenI Problem: Wir wissen vorher nicht, auf welche Tabellen

zugegriffen wirdI Losung: Proxy Objekt + Thread-local HTable-Zuordnung

Page 49: Webanwendungen mit Apache HBase entwickeln

49

”Transaction per View”

I RDBMS + Web-AnwendungI Fur jeden Request wird eine Transaction erstelltI RuntimeExceptions fuhren zu einem Rollback,I ... sonst Commit

I HBase + Web-AnwendungI Jeder Request braucht eigene HTable-Instanzen

I Problem: Wir wissen vorher nicht, auf welche Tabellenzugegriffen wird

I Losung: Proxy Objekt + Thread-local HTable-Zuordnung

Page 50: Webanwendungen mit Apache HBase entwickeln

50

”Transaction per View”

I RDBMS + Web-AnwendungI Fur jeden Request wird eine Transaction erstelltI RuntimeExceptions fuhren zu einem Rollback,I ... sonst Commit

I HBase + Web-AnwendungI Jeder Request braucht eigene HTable-InstanzenI Problem: Wir wissen vorher nicht, auf welche Tabellen

zugegriffen wird

I Losung: Proxy Objekt + Thread-local HTable-Zuordnung

Page 51: Webanwendungen mit Apache HBase entwickeln

51

”Transaction per View”

I RDBMS + Web-AnwendungI Fur jeden Request wird eine Transaction erstelltI RuntimeExceptions fuhren zu einem Rollback,I ... sonst Commit

I HBase + Web-AnwendungI Jeder Request braucht eigene HTable-InstanzenI Problem: Wir wissen vorher nicht, auf welche Tabellen

zugegriffen wirdI Losung: Proxy Objekt + Thread-local HTable-Zuordnung

Page 52: Webanwendungen mit Apache HBase entwickeln

52

Row IDs erzeugen

I ID Erzeugung ist nicht atomarI GET aktueller WertI +1I PUT neuer Wert

I Counter

HTable table = new HTable(conf, "IDs");

long counter1 = table.incrementColumnValue(

Bytes.toBytes("person_ids"),

Bytes.toBytes("family"),

Bytes.toBytes("next_id"),

1);

Page 53: Webanwendungen mit Apache HBase entwickeln

53

Row IDs erzeugen

I ID Erzeugung ist nicht atomarI GET aktueller WertI +1I PUT neuer Wert

I Counter

HTable table = new HTable(conf, "IDs");

long counter1 = table.incrementColumnValue(

Bytes.toBytes("person_ids"),

Bytes.toBytes("family"),

Bytes.toBytes("next_id"),

1);

Page 54: Webanwendungen mit Apache HBase entwickeln

54

Primary Keys

Page 55: Webanwendungen mit Apache HBase entwickeln

55

Secondary Keys

Page 56: Webanwendungen mit Apache HBase entwickeln

56

Secondary Keys - Backrefs

Page 57: Webanwendungen mit Apache HBase entwickeln

57

Secondary Keys und Scanner - Stadtenamen

I 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);

...

Page 58: Webanwendungen mit Apache HBase entwickeln

58

Secondary Keys und Scanner - Postleitzahlen

I 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);

...

Page 59: Webanwendungen mit Apache HBase entwickeln

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);

...

I Problem: IDs werden Byte-Lexikographisch sortiertI 2I 3I 51I 6I 7

Page 60: Webanwendungen mit Apache HBase entwickeln

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);

...

I Problem: IDs werden Byte-Lexikographisch sortiertI 2I 3I 51I 6I 7

Page 61: Webanwendungen mit Apache HBase entwickeln

61

Secondary Keys und Scanner - Alter?

I PaddingI 2 → 0002I 12 → 0012I 42 → 0042I 135 → 0135

I ProblemeI Maximale Zahlenlange muss bekannt sein

Page 62: Webanwendungen mit Apache HBase entwickeln

62

Secondary Keys und Scanner - Alter?

I PaddingI 2 → 0002I 12 → 0012I 42 → 0042I 135 → 0135

I ProblemeI Maximale Zahlenlange muss bekannt sein

Page 63: Webanwendungen mit Apache HBase entwickeln

63

Secondary Keys und Scanner - Alter?

I Wie ware eine andere Zahlendarstellung? (Additionssystem)I 2 → 2I 12 → 92I 42 → 99992I 135 → 99999999999995

I ProblemeI Sehr ineffizient bzgl. PlatzbedarfI Zahl ist nicht lesbar

Page 64: Webanwendungen mit Apache HBase entwickeln

64

Secondary Keys und Scanner - Alter?

I Wie ware eine andere Zahlendarstellung? (Additionssystem)I 2 → 2I 12 → 92I 42 → 99992I 135 → 99999999999995

I ProblemeI Sehr ineffizient bzgl. PlatzbedarfI Zahl ist nicht lesbar

Page 65: Webanwendungen mit Apache HBase entwickeln

65

Secondary Keys und Scanner - Alter?

I Losung: Additionssystem und Stellenwertsystem kombinierenI 2 → 1#2I 12 → 2#12I 42 → 2#42I 135 → 3#135

Page 66: Webanwendungen mit Apache HBase entwickeln

66

Fazit 1/6

I Entweder man macht es so, wie HBase es will, oder man lasstes bleiben!

I Bitte keine O/H(Base) Mapper!

Page 67: Webanwendungen mit Apache HBase entwickeln

67

Fazit 2/6

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

Page 68: Webanwendungen mit Apache HBase entwickeln

68

Fazit 3/6

I HBase kann sehr gut mehrere Rechner nutzen

I Jedoch muss man diese Eigenschaft nutzen, um uberhaupterst eine gute Performance zu erhalten

Page 69: Webanwendungen mit Apache HBase entwickeln

69

Fazit 4/6

I HBase (& Co.): Imperativ

I SQL: Deklarativ

Page 70: Webanwendungen mit Apache HBase entwickeln

70

Fazit 5/6

I Es ist nicht leicht, im Team stabile Tests zu erstellen

I Man vermisst jdbc:h2:mem:testdb

Page 71: Webanwendungen mit Apache HBase entwickeln

71

Fazit 6/6

I Die Vorteile von HBase wurden durch Verzicht ermoglicht

Page 72: Webanwendungen mit Apache HBase entwickeln

72

Wir stellen ein!

I Wir suchen professionelle Java-Geeks!I Wir bieten eine gesunde Mischung aus

I ProgrammiererI BeraterI Kicker-Profi

I Bitte bei mir melden!I [email protected]

Page 73: Webanwendungen mit Apache HBase entwickeln

73

Vielen Dank fur Ihre Aufmerksamkeit!

Fragen?