So synchronisieren Sie transformierte Daten von MongoDB zu Elasticsearch mit Transporter unter Ubuntu 14.04

Einführung

Elasticsearch erleichtert die Volltextsuche in Ihren Daten, MongoDB zeichnet sich durch die Speicherung aus. Die Verwendung von MongoDB zum Speichern Ihrer Daten und Elasticsearch für die Suche ist eine gängige Architektur.

Möglicherweise müssen Sie häufig Daten von MongoDB nach Elasticsearch migrieren. Es kann eine mühsame Aufgabe sein, ein eigenes Programm dafür zu schreiben, obwohl dies eine gute Übung ist. Es gibt ein wunderbares Open-Source-Dienstprogramm namens Transporter, das von Compose (einer Cloud-Plattform für Datenbanken) entwickelt wurde und diese Aufgabe sehr effizient erledigt.

In diesem Tutorial erfahren Sie, wie Sie mit dem Open-Source-Dienstprogramm Transporter Daten mit benutzerdefinierten Transformationen schnell aus MongoDB in Elasticsearch kopieren können.

Tore

In diesem Artikel wird erläutert, wie Sie mit dem Transporter-Dienstprogramm Daten aus MongoDB in Elasticsearch unter * Ubuntu 14.04 * kopieren.

Wir beginnen mit einem kurzen Überblick über die Installation von MongoDB und Elasticsearch, gehen jedoch nicht näher auf die Datenmodellierung in beiden Systemen ein. Sie können die Installationsschritte schnell durchgehen, wenn Sie beide bereits installiert haben.

Dann fahren wir mit Transporter fort.

Die Anweisungen sind für andere Versionen von Ubuntu sowie für andere Linux-Distributionen ähnlich.

Voraussetzungen

Bitte erfüllen Sie die folgenden Voraussetzungen.

  • Ubuntu 14.04 Droplet

  • sudo user

Schritt 1 - MongoDB installieren

Importieren Sie den öffentlichen Schlüssel des MongoDB-Repositorys.

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Erstellen Sie eine Listendatei für MongoDB.

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

Laden Sie die lokale Paketdatenbank neu.

sudo apt-get update

Installieren Sie die MongoDB-Pakete:

sudo apt-get install -y mongodb-org

Beachten Sie, dass jedes Paket die zugehörige Versionsnummer enthält.

Nach Abschluss der Installation können Sie den Dienst starten, stoppen und den Status überprüfen. Es wird nach der Installation automatisch gestartet.

Versuchen Sie, eine Verbindung zur MongoDB-Instanz herzustellen, die als Dienst ausgeführt wird:

mongo

Wenn es läuft, sehen Sie etwa Folgendes:

MongoDB shell version: 2.6.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
   http://docs.mongodb.org/
Questions? Try the support group
   http://groups.google.com/group/mongodb-user

Dies bedeutet, dass der Datenbankserver ausgeführt wird! Sie können jetzt beenden:

exit

Schritt 2 - Java installieren

Java ist eine Voraussetzung für Elasticsearch. Lassen Sie es uns jetzt installieren.

Fügen Sie zunächst das Repository hinzu:

sudo apt-add-repository ppa:webupd8team/java

Aktualisieren Sie Ihre Paketlisten erneut:

sudo apt-get update

Installieren Sie Java:

sudo apt-get install oracle-java8-installer

Wenn Sie aufgefordert werden, die Lizenz zu akzeptieren, wählen Sie "+ <Ok> " und dann " <Ja> +".

Schritt 3 - Elasticsearch installieren

Jetzt installieren wir Elasticsearch.

Erstellen Sie zunächst ein neues Verzeichnis, in dem Sie die Suchsoftware installieren und in dieses Verzeichnis verschieben möchten.

mkdir ~/utils
cd ~/utils

Besuchen Sie die download page von Elasticsearch, um die neueste Version zu erhalten.

Laden Sie jetzt die neueste Version von Elasticsearch herunter. Zum Zeitpunkt des Schreibens dieses Artikels war die neueste Version 1.5.0.

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-.zip

Installieren Sie unzip:

sudo apt-get install unzip

Entpacke das Archiv:

unzip elasticsearch-.zip

Navigieren Sie zu dem Verzeichnis, in das Sie es extrahiert haben:

cd elasticsearch-

Starten Sie Elasticsearch mit dem folgenden Befehl:

bin/elasticsearch

Es dauert einige Sekunden, bis Elasticsearch startet. Es werden einige Startprotokolle angezeigt. Elasticsearch wird jetzt im Terminalfenster ausgeführt.

_ * Hinweis: * Irgendwann möchten Sie Elasticsearch möglicherweise als Dienst ausführen, damit Sie es mit + sudo service elasticsearch restart + und ähnlichen Befehlen steuern können. In diesem Tutorial zu Upstart finden Sie Tipps. Alternativ können Sie Elasticsearch aus den Ubuntu-Repositorys installieren, obwohl Sie wahrscheinlich eine ältere Version erhalten. _

Halten Sie dieses Terminal offen. Stellen Sie in * einem anderen Terminalfenster * eine weitere SSH-Verbindung zu Ihrem Server her und prüfen Sie, ob Ihre Instanz aktiv ist:

curl -XGET http://localhost:9200

9200 ist der Standardport für Elasticsearch. Wenn alles gut geht, sehen Sie eine Ausgabe ähnlich der unten gezeigten:

{
 "status" : 200,
 "name" : "Northstar",
 "cluster_name" : "elasticsearch",
 "version" : {
   "number" : "1.5.0",
   "build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c",
   "build_timestamp" : "2015-03-23T14:30:58Z",
   "build_snapshot" : false,
   "lucene_version" : "4.10.4"
 },
 "tagline" : "You Know, for Search"
}

_ * Hinweis *: Stellen Sie für den späteren Teil dieses Artikels sicher, dass Elasticsearch ausgeführt wird (und auf Port 9200), wenn Sie Daten kopieren. _

Schritt 4 - Mercurial installieren

Als Nächstes installieren wir das Revision Control Tool Mercurial.

sudo apt-get install mercurial

Stellen Sie sicher, dass Mercurial korrekt installiert ist:

hg

Sie erhalten die folgende Ausgabe, wenn es richtig installiert ist:

Mercurial Distributed SCM

basic commands:

. . .

Schritt 5 - Go installieren

Transporter ist in der Sprache Go geschrieben. Sie müssen also "+ golang +" auf Ihrem System installieren.

sudo apt-get install golang

Damit Go ordnungsgemäß funktioniert, müssen Sie die folgenden Umgebungsvariablen festlegen:

Erstellen Sie einen Ordner für Go aus Ihrem + $ HOME-Verzeichnis:

mkdir ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc

Aktualisieren Sie Ihren Pfad:

echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
  • Melden Sie sich von Ihrer aktuellen SSH-Sitzung ab und erneut an. * Sie können nur die Sitzung schließen, in der Sie gearbeitet haben, und die Elasticsearch-Sitzung ausführen. Dieser Schritt ist entscheidend, damit Ihre Umgebungsvariablen aktualisiert werden. Melden Sie sich erneut an und vergewissern Sie sich, dass Ihre Variable hinzugefügt wurde:

echo $GOPATH

Dies sollte den neuen Pfad für Go anzeigen. In unserem Fall wird es sein:

/home//go

Wenn der Pfad nicht korrekt angezeigt wird, überprüfen Sie die Schritte in diesem Abschnitt.

Sobald unser + $ GOPATH + richtig eingestellt ist, müssen wir überprüfen, ob Go richtig installiert ist, indem wir ein einfaches Programm erstellen.

Erstellen Sie eine Datei mit dem Namen "+ hello.go +" und fügen Sie das folgende Programm ein. Sie können einen beliebigen Texteditor verwenden. In diesem Artikel verwenden wir den Nano-Texteditor. Geben Sie den folgenden Befehl ein, um eine neue Datei zu erstellen:

nano ~/hello.go

Kopieren Sie nun dieses kurze Programm "Hallo Welt" in die neu geöffnete Datei. Diese Datei soll uns helfen, zu überprüfen, ob Go funktioniert.

package main;
import "fmt"

func main() {
   fmt.Printf("Hello, world\n")
}

Wenn Sie fertig sind, drücken Sie "+ STRG + X ", um die Datei zu verlassen. Sie werden aufgefordert, die Datei zu speichern. Drücken Sie ` Y ` und dann ` ENTER`. Sie werden gefragt, ob Sie den Dateinamen ändern möchten. Drücken Sie erneut + ENTER +, um die aktuelle Datei zu speichern.

Führen Sie dann in Ihrem Ausgangsverzeichnis die Datei mit Go aus:

go run hello.go

Sie sollten diese Ausgabe sehen:

Hello, world

Wenn die Meldung "Hallo Welt" angezeigt wird, ist Go ordnungsgemäß installiert.

Wechseln Sie nun in das Verzeichnis "+ $ GOPATH" und erstellen Sie die Unterverzeichnisse "+ src", "+ pkg" und "+ bin +". Diese Verzeichnisse bilden einen Arbeitsbereich für Go.

cd $GOPATH
mkdir src pkg bin
  • + src + enthält Go-Quelldateien, die in Paketen organisiert sind (ein Paket pro Verzeichnis)

  • + pkg + enthält Paketobjekte

  • + bin + enthält ausführbare Befehle

Schritt 6 - Git installieren

Wir werden Git verwenden, um Transporter zu installieren. Installiere Git mit dem folgenden Befehl:

sudo apt-get install git

Schritt 7 - Transporter installieren

Erstellen Sie nun ein neues Verzeichnis für Transporter und verschieben Sie es in dieses Verzeichnis. Da das Dienstprogramm von Compose entwickelt wurde, rufen wir das Verzeichnis "+ compose +" auf.

mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose

Hier wird + compose / transporter + installiert.

Klonen Sie das Transporter GitHub-Repository:

git clone https://github.com/compose/transporter.git

In das neue Verzeichnis verschieben:

cd transporter

Übernehmen Sie den Besitz des Verzeichnisses "+ / usr / lib / go +":

sudo chown -R $USER /usr/lib/go

Stellen Sie sicher, dass "+ build-essential +" für GCC installiert ist:

sudo apt-get install build-essential

Führen Sie den Befehl + go get + aus, um alle Abhängigkeiten abzurufen:

go get -a ./cmd/...

Dieser Schritt kann eine Weile dauern, seien Sie also geduldig. Sobald dies erledigt ist, können Sie den Transporter erstellen.

go build -a ./cmd/...

Wenn alles gut geht, wird es ohne Fehler oder Warnungen abgeschlossen. Überprüfen Sie, ob der Transporter korrekt installiert ist, indem Sie diesen Befehl ausführen:

transporter

Sie sollten die Ausgabe so sehen:

usage: transporter [--version] [--help] <command> [<args>]

Available commands are:
   about    Show information about database adaptors
   eval     Eval javascript to build and run a transporter application

. . .

Damit ist die Installation abgeschlossen. Jetzt benötigen wir einige Testdaten in MongoDB, die wir mit Elasticsearch synchronisieren möchten.

Fehlerbehebung:

Wenn Sie den folgenden Fehler erhalten:

transporter: command not found

Dies bedeutet, dass Ihr "+ $ GOPATH " nicht zu Ihrer " PATH +" - Variablen hinzugefügt wurde. Überprüfen Sie, ob Sie den Befehl korrekt ausgeführt haben:

echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc

Versuchen Sie, sich abzumelden und erneut anzumelden. Wenn der Fehler weiterhin besteht, verwenden Sie stattdessen den folgenden Befehl:

$GOPATH/bin/transporter

Schritt 8 - Beispieldaten erstellen

Nachdem wir alles installiert haben, können wir mit der Datensynchronisierung fortfahren.

Verbinden Sie sich mit MongoDB:

mongo

Sie sollten jetzt die MongoDB-Eingabeaufforderung +> + sehen. Erstellen Sie eine Datenbank mit dem Namen "+ foo +".

use foo

Fügen Sie einige Beispieldokumente in eine Sammlung mit dem Namen "+ bar +" ein:

db.bar.save({"firstName": "Robert", "lastName": "Baratheon"});
db.bar.save({"firstName": "John", "lastName": "Snow"});

Wählen Sie den Inhalt, den Sie gerade eingegeben haben:

db.bar.find().pretty();

Daraufhin sollten die unten gezeigten Ergebnisse angezeigt werden ("+ ObjectId +" unterscheidet sich auf Ihrem Computer):

{
   "_id" : ObjectId("549c3ef5a0152464dde10bc4"),
   "firstName" : "Robert",
   "lastName" : "Baratheon"
}
{
   "_id" : ObjectId("549c3f03a0152464dde10bc5"),
   "firstName" : "John",
   "lastName" : "Snow"
}

Jetzt können Sie die Datenbank verlassen:

exit

Ein bisschen Terminologie:

  • Eine Datenbank in MongoDB ist analog zu einem Index in Elasticsearch

  • Eine Sammlung in MongoDB ist analog zu einem Typ in Elasticsearch

Unser letztendliches Ziel ist es, die Daten aus der * bar * -Sammlung der * foo * -Datenbank von MongoDB mit dem * bar * -Typ des * foo * -Index in Elasticsearch zu synchronisieren.

Schritt 9 - Transporter konfigurieren

Jetzt können wir mit den Konfigurationsänderungen fortfahren, um unsere Daten von MongoDB nach Elasticsearch zu migrieren. Transporter benötigt eine Konfigurationsdatei (+ config.yaml +), eine Transformationsdatei (+ .js +) und eine Anwendungsdatei (+ application.js +)

  • Die Konfigurationsdatei gibt die Knoten, Typen und URIs an

  • Die Anwendungsdatei gibt den Datenfluss von der Quelle zum Ziel und optionale Transformationsschritte an

  • Die Transformationsdatei wendet Transformationen auf die Daten an

_ * Hinweis: * Alle Befehle in diesem Abschnitt setzen voraus, dass Sie die Befehle aus dem Transporterverzeichnis ausführen. _

Wechseln Sie in das Verzeichnis + transporter +:

cd ~/go/src/github.com/compose/transporter

Konfigurationsdatei

Sie können sich die Beispieldatei + config.yaml + ansehen, wenn Sie möchten. Wir werden das Original sichern und es dann durch unseren eigenen Inhalt ersetzen.

mv test/config.yaml test/config.yaml.00

Die neue Datei ist ähnlich, aktualisiert jedoch einige der URIs und einige der anderen Einstellungen, um mit denen auf unserem Server übereinzustimmen. Kopieren Sie den Inhalt von hier und fügen Sie ihn in die neue Datei "+ config.yaml +" ein. Verwenden Sie erneut den Nano-Editor.

nano test/config.yaml

Kopieren Sie den folgenden Inhalt in die Datei. Speichern Sie die Datei anschließend wie oben beschrieben.

# api:
#   interval: 60s
#   uri: "http://requestb.in/13gerls1"
#   key: "48593282-b38d-4bf5-af58-f7327271e73d"
#   pid: "something-static"
nodes:
 localmongo:
   type: mongo
   uri: mongodb://localhost/foo
 es:
   type: elasticsearch
   uri: http://localhost:9200/
 timeseries:
   type: influx
   uri: influxdb://root:root@localhost:8086/compose
 debug:
   type: file
   uri: stdout://
 foofile:
   type: file
   uri: file:///tmp/foo

Beachten Sie den Abschnitt "+ node ". Wir haben die Knoten ` localmongo ` und ` es +` im Vergleich zur Originaldatei leicht überarbeitet. Nodes sind die verschiedenen Datenquellen und -ziele. Type definiert den Knotentyp. Z.B.,

  • + mongo + bedeutet, dass es sich um eine MongoDB-Instanz / einen MongoDB-Cluster handelt

  • "+ elasticsearch +" bedeutet, dass es sich um einen Elasticsearch-Knoten handelt

  • "+ Datei +" bedeutet, dass es sich um eine reine Textdatei handelt

+ uri + gibt dem API-Endpunkt die Möglichkeit, sich mit dem Knoten zu verbinden. Der Standardport wird für MongoDB (27017) verwendet, wenn nichts angegeben ist. Da wir Daten aus der * foo * -Datenbank von MongoDB erfassen müssen, sollte der URI folgendermaßen aussehen:

mongodb://localhost/foo

In ähnlicher Weise sieht die URI für Elasticsearch folgendermaßen aus:

http://localhost:9200/

Speichern Sie die Datei + config.yaml +. Sie müssen keine weiteren Änderungen vornehmen.

Anwendungsdatei

Öffnen Sie nun die Datei "+ application.js" im Verzeichnis "+ test".

nano test/application.js

Ersetzen Sie den Beispielinhalt der Datei durch den folgenden Inhalt:

Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});

Speichern Sie die Datei und beenden Sie sie. Hier finden Sie eine kurze Erläuterung unserer Pipeline.

  • + Source () + gibt die Quelle an, von der Daten abgerufen werden sollen

  • + transform + gibt an, welche Transformation auf jeden Datensatz angewendet werden soll

  • + save () + gibt an, wo Daten gespeichert werden sollen

Zu den Optionen gehören:

  • + name: + Name des Knotens, wie er in der Datei + config.yaml + erscheint

  • + Namespace: + identifiziert den Datenbank- und Tabellennamen; es muss durch einen Punkt (*. *) gekennzeichnet sein

Transformationsdatei

Jetzt ist das letzte Puzzleteil die Transformation. Wenn Sie sich erinnern, haben wir zwei Datensätze in MongoDB mit "+ firstName " und " lastName +" gespeichert. Hier können Sie sehen, wie effektiv es ist, Daten zu transformieren, wenn Sie sie von MongoDB nach Elasticsearch synchronisieren.

Angenommen, wir möchten, dass die in Elasticsearch gespeicherten Dokumente ein anderes Feld mit dem Namen "+ fullName " haben. Dazu müssen wir eine neue Transformationsdatei erstellen, ` test / transformers / addFullName.js +`.

nano test/transformers/addFullName.js

Fügen Sie den folgenden Inhalt in die Datei ein. Speichern und beenden Sie wie zuvor beschrieben.

module.exports = function(doc) {
 doc._id = doc._id['$oid'];
 doc["fullName"] = doc["firstName"] + " " + doc["lastName"];
 return doc
}

Die erste Zeile ist notwendig, um die Art und Weise zu behandeln, wie Transporter das + ObjectId () + - Feld von MongoDB behandelt. Die zweite Zeile weist Transporter an, "+ firstName " und " lastName " zu verketten, um " fullName +" zu bilden.

Dies ist eine einfache Transformation für das Beispiel, aber mit etwas JavaScript können Sie komplexere Datenmanipulationen durchführen, während Sie Ihre Daten für die Suche vorbereiten.

Schritt 10 - Ausführen der Transformation

Jetzt, da wir mit der Einrichtung fertig sind, ist es Zeit, unsere Daten zu synchronisieren und zu transformieren.

  • Stellen Sie sicher, dass Elasticsearch ausgeführt wird. * Wenn dies nicht der Fall ist, starten Sie es erneut in einem * neuen * Terminalfenster:

~/utils/elasticsearch-/bin/elasticsearch

Vergewissern Sie sich in Ihrem * Original-Terminal *, dass Sie sich im Verzeichnis + transporter + befinden:

cd ~/go/src/github.com/compose/transporter

Führen Sie den folgenden Befehl aus, um die Daten zu kopieren:

transporter run --config ./test/config.yaml ./test/application.js

Der Befehl + run + von Transporter erwartet zwei Argumente. Erstens die Konfigurationsdatei und zweitens die Anwendungsdatei. Wenn alles gut geht, wird der Befehl ohne Fehler ausgeführt.

Überprüfen Sie Elasticsearch, um sicherzustellen, dass die Daten mit unserer Transformation kopiert wurden:

curl -XGET localhost:9200/foo/bar/_search?pretty=true

Sie erhalten folgendes Ergebnis:

{
 "took" : 10,
 "timed_out" : false,
 "_shards" : {
   "total" : 5,
   "successful" : 5,
   "failed" : 0
 },
 "hits" : {
   "total" : 2,
   "max_score" : 1.0,
   "hits" : [ {
     "_index" : "foo",
     "_type" : "bar_full_name",
     "_id" : "549c3ef5a0152464dde10bc4",
     "_score" : 1.0,
     "_source":{"_id":"549c3ef5a0152464dde10bc4","firstName":"Robert","fullName":"Robert Baratheon","lastName":"Baratheon"}
   }, {
     "_index" : "foo",
     "_type" : "bar_full_name",
     "_id" : "549c3f03a0152464dde10bc5",
     "_score" : 1.0,
     "_source":{"_id":"549c3f03a0152464dde10bc5","firstName":"John","fullName":"John Snow","lastName":"Snow"}
   } ]
 }
}

Beachten Sie das Feld "+ fullName ", das die durch ein Leerzeichen dazwischen verketteten Zeichen " firstName " und " lastName +" enthält - unsere Transformation hat funktioniert.

Fazit

Jetzt wissen wir, wie wir mit Transporter Daten aus MongoDB in Elasticsearch kopieren und beim Synchronisieren Transformationen auf unsere Daten anwenden. Sie können auf die gleiche Weise komplexere Transformationen anwenden. Sie können auch mehrere Transformationen in der Pipeline verketten.

Es empfiehlt sich, mehrere Transformationen in separaten Dateien zu speichern und zu verketten. Auf diese Weise machen Sie jede Ihrer Transformationen unabhängig für die Zukunft nutzbar.

Also, das ist so ziemlich alles. Sie können das https://github.com/compose/transporter[Transporter-Projekt auf GitHub abrufen, um über die neuesten Änderungen in der API auf dem Laufenden zu bleiben.

Möglicherweise möchten Sie auch dieses Tutorial über grundlegende CRUD operations in Elasticsearch lesen. .