Download pdf - OOP 2013 NoSQL Suche

Transcript
Page 1: OOP 2013 NoSQL Suche

Datensuche mit NoSQL

Kai Spichale

27.01.2013

Page 2: OOP 2013 NoSQL Suche

Über mich

► Kai Spichale

► Softwarearchitekt und -entwickler bei adesso AG

► Schwerpunkt: Java-Technologien

► Autor verschiedener Fachartikel, Sprecher auf Konferenzen

27.01.2013 OOP 2013 Kai Spichale 1

► adesso gehört zu den führenden IT-Dienstleistern im deutschsprachigen Raum

► Beratung und individuelle Softwareentwicklung

► Mehr als 1000 Mitarbeiter

► Zu den wichtigsten Kunden zählen die Allianz, Hannover Rück, Union Investment, Westdeutsche Lotterie, Zurich Versicherung, DEVK und DAK

Page 3: OOP 2013 NoSQL Suche

Motivation

NoSQL

► Exponentielles Datenwachstum

► Semistrukturierte Daten

► Stärker vernetzt

► 80% der unternehmensrelevanten Informationen in unstrukturierter Form, hauptsächlich Text

Suche

► Datenzugriff ändert sich:

> Volltextsuche wird wichtiger

> Benutzererwartungen steigen

► Suche über bekannte Schlüsselbegriffe oder über ein Katalogsystem sind für große Datenbestände unpraktisch

27.01.2013 OOP 2013 Kai Spichale 2

Page 4: OOP 2013 NoSQL Suche

Agenda

► Lucene Volltextsuchen

► NoSQL:

> Architekturtreiber

> MongoDB

> Neo4j

> Apache Cassandra

> Apache Hadoop

► Schlussbemerkung

27.01.2013 OOP 2013 Kai Spichale 3

Page 5: OOP 2013 NoSQL Suche

Volltextsuchen

► Aufgabe: Auffinden von Texten in einer Vielzahl von Dateien oder Datensätzen

► Naiver Ansatz mit linearer Suche à la grep:

> O(n), langsam

> Negation ist schwierig

> Fehlende Unterscheidung von Phrasen und Schlüsselwörtern

► Invertierter Index:

> Term Dokument

> Jedem Term werden Informationen über das Vorkommen des Terms in den Dokumenten zugeordnet

27.01.2013 OOP 2013 Kai Spichale 4

Page 6: OOP 2013 NoSQL Suche

Apache Lucene

► Java-Bibliothek für Volltextsuchen

► De-facto-Standard im Bereich Open-Source-Suchlösungen

► Merkmale:

> Anwendungsneutral

> Gute Performance

► Funktionalität:

> Bewertete und nach Rang sortierte Suchen

> Viele Abfragetypen, Facettennavigation

> Suche nach einzelnen Feldern

> Sortierung

> Multi-Index-Suchen

> Parallele Suche und Update

27.01.2013 OOP 2013 Kai Spichale 5

Page 7: OOP 2013 NoSQL Suche

Textanalyse

27.01.2013 OOP 2013 Kai Spichale 6

Extrahieren,

Parsen

Character

Filter

Tokenizer

Token Filter

Dokumente

de.GermanAnalyzer:

StandardTokenizer > StandardFilter

> LowerCaseFilter > StopFilter > GermanStemFilter

Invertierter

Index

Page 8: OOP 2013 NoSQL Suche

Textanalyse

27.01.2013 OOP 2013 Kai Spichale 7

ID Term Document

1 come 2

2 dog 1

3 eat 1

4 exception 3

5 first 2

5 food 1

6 own 1

7 prove 3

8 rule 3

9 serve 2

10 your 1

Eat your

own dog

food.

First

come,

first

served.

The

exception

proves the

rule.

a

and

around

every

for

from

in

is

it

not

on

one

the

to

under

Stopword List

Page 9: OOP 2013 NoSQL Suche

Abfragetypen

Abfrage Beispiel

Termsuche

(MUST, MUST_NOT, SHOULD)

+dog –snoopy

Phrasensuche „foo bar“

Wildcard fo*a?

Fuzzy fobar~

Range [A TO Z]

27.01.2013 OOP 2013 Kai Spichale 8

Page 10: OOP 2013 NoSQL Suche

NoSQL und Datensuche

„One size fits all“-Ansatz

► Welche NoSQL-Datenbank erfüllt die Anforderungen am besten?

► Wird Volltextsuche unterstützt?

27.01.2013 OOP 2013 Kai Spichale 9

Datenstruktur Datenzugriff

Volumen Performance

Verfügbarkeit Änderungen

Konsistenz

Page 11: OOP 2013 NoSQL Suche

NoSQL und Datensuche

27.01.2013 OOP 2013 Kai Spichale 10

Was bieten diese Datenbanken?

► MongoDB

► Neo4j

► Apache Cassandra

► Apache Hadoop

Page 12: OOP 2013 NoSQL Suche

Dokumentenorientierte Datenbanken

{ "_id" : ObjectId(„42"),

"firstname" : "John",

"lastname" : "Lennon",

"address" : { "city" : "Liverpool",

"street" : "251 Menlove Avenue“ }

}

27.01.2013 OOP 2013 Kai Spichale 11

► Speichern Daten in Form von Dokumenten

► Semistrukturierte Inhalte

► JSON, YAML, XML

Page 13: OOP 2013 NoSQL Suche

MongoDB

► Ad-hoc-Abfragen für Dokumente oder einzelne Felder

db.things.find({firstname:"John"})

► Abfragen mit serverseitig ausgeführten JavaScript-Funktionen

► Aggregationen, MapReduce

► Einfache Textsuchen

> Mit Multikeys können Werte eines Arrays indiziert werden

27.01.2013 OOP 2013 Kai Spichale 12

{ article : “some long text",

_keywords : [ “some" , “long" , “text“]

}

Page 14: OOP 2013 NoSQL Suche

MongoDB

► Mongo-Connector synchronisiert Daten aus MongoDB mit einem Zielsystem (z.B.: Solr, Elastic Search)

► Architektur mit separaten Suchserver möglich

27.01.2013 OOP 2013 Kai Spichale 13

MongoDB SolrMongo

Connector

1 2 3 4 5

update syncDocerstellen indizieren suchen

Page 15: OOP 2013 NoSQL Suche

MongoDB

MongoDB MongoDB + Lucene Lucene

Kein Ergebnis-Mergen

Komplexe Queries mit

Aggregationen

Nur einfache

Textsuchen

Volltextsuchen mit

Stemming, Faceting

Komplexe Queries mit

Aggregationen

Mergen notwendig

Erhöhte Komplexität

(Entwicklung, Betrieb)

Kein Ergebnis-Mergen

Volltextsuchen mit

Stemming, Faceting

Keine Transaktion

Keine partiellen

Dokumentupdates

Verwendet Schema

27.01.2013 OOP 2013 Kai Spichale 14

Page 16: OOP 2013 NoSQL Suche

Graphendatenbanken

► Informationen werden als Graphen modelliert

> Knoten

> Kanten (auch Relationships)

> Eigenschaften (auch Properties)

► Universelles Datenmodell

► Traversierung

► Beispiel: Neo4j

27.01.2013 OOP 2013 Kai Spichale 15

id=1

name=“John“

id=2

name=“George“

id=3

name=“Paul“

friend friend

Page 17: OOP 2013 NoSQL Suche

Neo4j

► Traversierung:

> Tiefensuche, Breitensuche

> Gremlin, Cypher

Ergebnis = George

27.01.2013 OOP 2013 Kai Spichale 16

START person=node:peoplesearch(name=‘John’)

MATCH person<-[:friends]->afriend RETURN afriend

Page 18: OOP 2013 NoSQL Suche

Neo4j

► Ganze Datenbank ist natürlicher Index bestehend aus Knoten oder Beziehungen

> Beispiele: „name“, „city“

► Auto-Indexing verfolgt alle Property-Änderungen

27.01.2013 OOP 2013 Kai Spichale 17

personRepository.findByPropertyValue("name", "John");

Page 19: OOP 2013 NoSQL Suche

Neo4j

► Unterstützt Lucene-basierte Volltextindizes

27.01.2013 OOP 2013 Kai Spichale 18

Index<PropertyContainer> index = template.getIndex("peoplesearch");

index.query("name", "Jo*");

@NodeEntity class Person {

@Indexed(indexName="peoplesearch", indexType=IndexType.FULLTEXT) private String name;

..

}

Page 20: OOP 2013 NoSQL Suche

Wide Column Store

► Google BigTable: „a sparse, distributed multi-dimensional sorted map“

► Daten organisiert in Zeilen, Spaltenfamilien und Spalten

► Ideal für zeilenweises Sharding (horizontale Skalierung)

27.01.2013 OOP 2013 Kai Spichale 19

jlennon

pmccart

gharris

name

„Lennon“

name

„McCartney“

name

„Harrison“

state

„UK“

address

„Liverpool ..“

address

„Liverpool ..“

Unterschiedliche Spalten

pro Zeile möglich

Eindeutige

Zeilenschlüssel

Page 21: OOP 2013 NoSQL Suche

Apache Cassandra

► BigTable-Klon

► Distributed Hash Table (Amazon Dynamo)

► Schlussendlich konsistent, konfigurierbar

► Datenabfrage:

> Cassandra Query Language (CQL) = SQL-Dialekt ohne Joins

> Hadoop-Integration

27.01.2013 OOP 2013 Kai Spichale 20

SELECT name FROM user WHERE firstname=„John“;

Page 22: OOP 2013 NoSQL Suche

Apache Cassandra

► Solandra: Solr mit Cassandra als Backend statt Dateisystem

► DataStax Enterprise Search

> Daten in Cassandra werden lokal in Solr indiziert und umgekehrt

> Integration durch Secondary Index API

> CQL unterstützt Solr-Queries

> Dokumentenweise werden die Daten im Cluster verteilt

> Nutzt Cassandra Ringinformationen für Solr Distributed Search Query

27.01.2013 OOP 2013 Kai Spichale 21

Cassandra Solr

Column Family Core

Row Document

Row Key Unique

Column Field

Node Shard

SELECT title FROM solr WHERE solr_query=‘name:jo*';

Page 23: OOP 2013 NoSQL Suche

Apache Hadoop

► Open Source Projekt zur Verarbeitung von großen Datenmengen (BigData) im Computercluster

► Skalierbar, ausfallsicher

► Umfangreiches Hadoop Ökosystem

► Hadoop Distributed File System, Hadoop MapReduce

27.01.2013 OOP 2013 Kai Spichale 22

Page 24: OOP 2013 NoSQL Suche

Hadoop MapReduce

27.01.2013 23

Persistente Daten

Map Map Map Map

Transiente Daten

Persistente Daten

Reduce Reduce Reduce

► Map Phase:

> Datensätze werden in Map-Funktion verarbeitet

► Shuffle/Combine Phase:

> Verteilte Sortierung und Gruppierung

► Reduce Phase:

> Verarbeitung des Zwischenergebnisses in Reduce-Funktion

OOP 2013 Kai Spichale

Page 25: OOP 2013 NoSQL Suche

Hadoop MapReduce

► Allgemeine Funktionsweise eines MapReduce-Jobs

27.01.2013 OOP 2013 Kai Spichale 24

map(k, v) -> [(K1,V1), (K2,V2), ... ]

reduce(Kn, [Vi, Vj, …]) ->

(Km, R)

Daten

Mapper

Shuffle Reducer Ergebnis

Page 26: OOP 2013 NoSQL Suche

Wie löst man Probleme mit MapReduce?

► Problemklassen ohne Reduce-Phase

> Suchen

> Massenkonvertierung

> Sortieren

> Map-Side Join

► Problemklassen mit Reduce-Phase

> Gruppieren und Aggregieren

> Reduce-Side Join

27.01.2013 OOP 2013 Kai Spichale 25

Page 27: OOP 2013 NoSQL Suche

Hadoop MapReduce: Suchen

► Suche nach „A“

27.01.2013 OOP 2013 Kai Spichale 26

1

2 1

Daten

1: A,B,C

3

4

5

Mapper emittiert nur Records

mit Suchkriterium

4

5

2: D,E

3: B,E

4: A,D

5: A,C,E

Ergebnis = 1, 4, 5

Page 28: OOP 2013 NoSQL Suche

Hadoop MapReduce: Indizieren

27.01.2013 OOP 2013 Kai Spichale 27

HDFS

MapReduce

Job

Lucene Lucene

Index

► HDFS speichert Rohdaten

► Mapper indiziert Daten mit Lucene

> SolrInputDocument erzeugen und StreamingUpdateSolrServer aufrufen

Page 29: OOP 2013 NoSQL Suche

Hadoop MapReduce: Indizieren

27.01.2013 OOP 2013 Kai Spichale 28

1

2

Daten

1: text

3

4

5

2: text

3: text

4: text

5: text

Ergebnis

ist null

Mapper

@Override public void map( LongWritable key, Text val, OutputCollector<NullWritable, NullWritable> output, Reporter reporter) throws IOException { st = new StringTokenizer(val.toString()); lineCounter = 0; while (st.hasMoreTokens()) { doc= new SolrInputDocument(); doc.addField("id", fileName + key.toString() + lineCounter++); doc.addField("txt", st.nextToken()); try { server.add(doc); } catch (Exception exp) { … } }}

Page 30: OOP 2013 NoSQL Suche

Apache Tika

27.01.2013 OOP 2013 Kai Spichale 29

HDFS

MapReduce

Job

Lucene Lucene

Index

Tika

► Extrahiert Metadaten und strukturierten Text aus Dokumenten:

> HTML, MS Office Dokumente, PDF, etc.

► Stream-Parser auch für große Dokumente geeignet

Page 31: OOP 2013 NoSQL Suche

Apache Solr

27.01.2013 OOP 2013 Kai Spichale 30

HDFS

MapReduce

Job

Lucene Lucene

Index

Tika

Solr

► Lucene ist eine Programmbibliothek, kein Suchserver

► Suchserver:

> Solr

> ElasticSearch

Page 32: OOP 2013 NoSQL Suche

Apache Flume

27.01.2013 OOP 2013 Kai Spichale 31

HDFS

MapReduce

Job

Lucene Lucene

Index

Tika

Solr

Flume

Web Server,Applikationen

► Verteilter Dienst zum Sammeln, Aggregieren und Kopieren großen Datenmengen

► Streaming-Techniken

► Fehlertolerant

Page 33: OOP 2013 NoSQL Suche

Alternativen

27.01.2013 OOP 2013 Kai Spichale 32

HDFS

MapReduce

Job

Lucene Lucene

Index

Tika

Solr

Flume

Web Server,Apps, DBs

Crawler DistCp Sqoop

► Nutch Crawler erzeugt einen Datensatz pro URL in CrawlDB

► Hadoop DistCp kopiert Daten innerhalb/ zwischen Hadoop-Clustern

► Apache Sqoop transferiert Bulk-Daten zwischen Hadoop und RDBMS

Page 34: OOP 2013 NoSQL Suche

Apache Hadoop

27.01.2013 OOP 2013 Kai Spichale 33

Web Content,Intranet

Loading

Werkzeug

Hadoop

Suche Analyse Export Visualisierung

► Fundamentaler Mismatch:

> MapReduce ideal für Batch-Verarbeitung

> Lucene für interaktive Suchen

► MapReduce zum Indizieren von großen Datenmengen

► Geeignet für (offline) Big-Data-Lösung

Page 35: OOP 2013 NoSQL Suche

Zusammenfassung

► Mehr semistrukturierte Daten

► Bedeutung von Volltextsuchen wächst

► Kombination von NoSQL-Store und Lucene:

> MongoDB: Integration mit Mongo Connector

> Neo4j: native Integration

> Cassandra: „Online BigData“

> Hadoop: „Offline BigData“

► Alternative: Suchserver als dokumentenorientierte Datenbank

27.01.2013 OOP 2013 Kai Spichale 34


Recommended