Как синхронизировать преобразованные данные из MongoDB в Elasticsearch с помощью Transporter в Ubuntu 14.04

Вступление

Elasticsearch облегчает полнотекстовый поиск ваших данных, в то время как MongoDB превосходно хранит их. Использование MongoDB для хранения ваших данных и Elasticsearch для поиска является распространенной архитектурой.

Много раз вы можете столкнуться с необходимостью массового переноса данных из MongoDB в Elasticsearch. Написание собственной программы для этого, хотя и является хорошим упражнением, может быть утомительным занятием. Есть замечательная утилита с открытым исходным кодом под названием Transporter, разработанная Compose (облачная платформа для баз данных), которая очень эффективно справляется с этой задачей.

В этом руководстве показано, как использовать утилиту с открытым исходным кодом Transporter для быстрого копирования данных из MongoDB в Elasticsearch с помощью пользовательских преобразований.

цели

В этой статье мы рассмотрим, как копировать данные из MongoDB в Elasticsearch в * Ubuntu 14.04 *, используя утилиту Transporter.

Мы начнем с краткого обзора, показывающего, как установить MongoDB и Elasticsearch, хотя мы не будем вдаваться в подробности о моделировании данных в двух системах. Не стесняйтесь быстро просмотреть шаги установки, если вы уже установили оба из них.

Тогда мы перейдем к Transporter.

Инструкции аналогичны для других версий Ubuntu, а также для других дистрибутивов Linux.

Предпосылки

Пожалуйста, заполните следующие условия.

  • Ubuntu 14.04 Droplet

  • sudo пользователь

Шаг 1 - Установка MongoDB

Импортируйте открытый ключ хранилища MongoDB.

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

Создайте файл списка для MongoDB.

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

Перезагрузите локальную базу данных пакетов.

sudo apt-get update

Установите пакеты MongoDB:

sudo apt-get install -y mongodb-org

Обратите внимание, что каждый пакет содержит соответствующий номер версии.

После завершения установки вы можете запустить, остановить и проверить состояние службы. Он запустится автоматически после установки.

Попробуйте подключиться к экземпляру MongoDB, работающему как служба:

mongo

Если он запущен и работает, вы увидите что-то вроде этого:

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

Это означает, что сервер базы данных работает! Вы можете выйти сейчас:

exit

Шаг 2 - Установка Java

Java является обязательным условием для Elasticsearch. Давайте установим это сейчас.

Сначала добавьте репозиторий:

sudo apt-add-repository ppa:webupd8team/java

Обновите свои списки пакетов снова:

sudo apt-get update

Установите Java:

sudo apt-get install oracle-java8-installer

Когда будет предложено принять лицензию, выберите + <Ok> +, а затем + <Yes> +.

Шаг 3 - Установка Elasticsearch

Теперь мы установим Elasticsearch.

Сначала создайте новый каталог, в который вы будете устанавливать поисковое программное обеспечение, и перейдите в него.

mkdir ~/utils
cd ~/utils

Посетите downloadload страницу Elasticsearch, чтобы увидеть последнюю версию.

Теперь загрузите последнюю версию Elasticsearch. На момент написания этой статьи последняя версия была 1.5.0.

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

Установить распаковать:

sudo apt-get install unzip

Распакуйте архив:

unzip elasticsearch-.zip

Перейдите в каталог, куда вы его распаковали:

cd elasticsearch-

Запустите Elasticsearch, введя следующую команду:

bin/elasticsearch

Запуск Elasticsearch займет несколько секунд. Вы увидите некоторые журналы запуска, как это происходит. Elasticsearch теперь будет работать в окне терминала.

_ * Примечание: * В какой-то момент вы можете запустить Elasticsearch как сервис, чтобы вы могли управлять им с помощью + sudo serviceasticsearch restart + и аналогичных команд; см. этот учебник о Upstart для получения советов. Кроме того, вы можете установить Elasticsearch из репозиториев Ubuntu, хотя вы, вероятно, получите более старую версию. _

Держите этот терминал открытым. Сделайте еще одно SSH-подключение к вашему серверу в * другом окне терминала * и проверьте, работает ли ваш экземпляр:

curl -XGET http://localhost:9200

9200 порт по умолчанию для Elasticsearch. Если все пойдет хорошо, вы увидите вывод, аналогичный показанному ниже:

{
 "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"
}

_ * Примечание *: В следующей части этой статьи, когда вы будете копировать данные, убедитесь, что Elasticsearch запущен (и на порту 9200). _

Шаг 4 - Установка Mercurial

Далее мы установим инструмент управления версиями Mercurial.

sudo apt-get install mercurial

Убедитесь, что Mercurial установлен правильно:

hg

Вы получите следующий вывод, если он установлен правильно:

Mercurial Distributed SCM

basic commands:

. . .

Шаг 5 - Установка Go

Транспортер написан на языке Go. Итак, вам нужно установить + golang + в вашей системе.

sudo apt-get install golang

Для правильной работы Go необходимо установить следующие переменные среды:

Создайте папку для Go из каталога + $ HOME:

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

Обновите свой путь:

echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
  • Выйдите из текущего сеанса SSH и войдите снова. * Вы можете закрыть только сеанс, в котором вы работали, и продолжить сеанс Elasticsearch. Этот шаг очень важен для обновления переменных среды. Войдите снова и убедитесь, что ваша переменная была добавлена:

echo $GOPATH

Это должно отобразить новый путь для Go. В нашем случае это будет:

/home//go

Если путь не отображается правильно, перепроверьте шаги в этом разделе.

Как только наша + $ GOPATH + установлена ​​правильно, мы должны проверить, что Go установлен правильно, создав простую программу.

Создайте файл с именем + hello.go + и поместите в него следующую программу. Вы можете использовать любой текстовый редактор, который вы хотите. Мы собираемся использовать текстовый редактор nano в этой статье. Введите следующую команду, чтобы создать новый файл:

nano ~/hello.go

Теперь скопируйте эту краткую программу «Hello, world» ниже во вновь открытый файл. Весь смысл этого файла в том, чтобы помочь нам убедиться, что Go работает.

package main;
import "fmt"

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

Когда закончите, нажмите + CTRL + X +, чтобы выйти из файла. Он предложит вам сохранить файл. Нажмите + Y +, а затем нажмите + ENTER. он спросит вас, хотите ли вы изменить имя файла. Нажмите + ENTER + еще раз, чтобы сохранить текущий файл.

Затем из вашего домашнего каталога запустите файл с помощью Go:

go run hello.go

Вы должны увидеть этот вывод:

Hello, world

Если вы видите сообщение «Hello, world», значит Go установлен правильно.

Теперь перейдите в каталог + $ GOPATH и создайте подкаталоги` + src`, + pkg и` + bin + `. Эти каталоги составляют рабочее пространство для Go.

cd $GOPATH
mkdir src pkg bin
  • + src + содержит исходные файлы Go, организованные в пакеты (один пакет на каталог)

  • + pkg + содержит объекты пакета

  • + bin + содержит исполняемые команды

Шаг 6 - Установка Git

Мы будем использовать Git для установки Transporter. Установите Git с помощью следующей команды:

sudo apt-get install git

Шаг 7 - Установка Transporter

Теперь создайте и перейдите в новый каталог для Transporter. Поскольку утилита была разработана Compose, мы будем называть каталог + compose +.

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

Это где + compose / transporter + будет установлен.

Клонируйте репозиторий Transporter GitHub:

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

Перейдите в новый каталог:

cd transporter

Станьте владельцем каталога + / usr / lib / go +:

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

Убедитесь, что + build-essential + установлен для GCC:

sudo apt-get install build-essential

Запустите команду + go get +, чтобы получить все зависимости:

go get -a ./cmd/...

Этот шаг может занять некоторое время, так что наберитесь терпения. Как только это будет сделано, вы можете построить Transporter.

go build -a ./cmd/...

Если все пойдет хорошо, он будет завершен без каких-либо ошибок или предупреждений. Убедитесь, что Transporter установлен правильно, выполнив эту команду:

transporter

Вы должны увидеть результат примерно так:

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

. . .

Итак, установка завершена. Теперь нам нужны некоторые тестовые данные в MongoDB, которые мы хотим синхронизировать с Elasticsearch.

Поиск неисправностей:

Если вы получите следующую ошибку:

transporter: command not found

Это означает, что ваш + $ GOPATH + не был добавлен в вашу переменную + PATH +. Убедитесь, что вы правильно выполнили команду:

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

Попробуйте выйти и войти снова. Если ошибка все еще сохраняется, используйте следующую команду:

$GOPATH/bin/transporter

Шаг 8 - Создание образца данных

Теперь, когда у нас все установлено, мы можем перейти к части синхронизации данных.

Подключиться к MongoDB:

mongo

Теперь вы должны увидеть приглашение MongoDB +> +. Создайте базу данных с именем + foo +.

use foo

Вставьте несколько примеров документов в коллекцию с именем + bar +:

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

Выберите содержимое, которое вы только что ввели:

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

Это должно отобразить результаты, показанные ниже (+ ObjectId + будет отличаться на вашем компьютере):

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

Теперь вы можете выйти из базы данных:

exit

Немного терминологии:

  • Database в MongoDB аналогичен index в Elasticsearch

  • Collection в MongoDB аналогична type в Elasticsearch

Наша конечная цель - синхронизировать данные из коллекции * bar * базы данных * foo * из MongoDB с типом * bar * индекса * foo * в Elasticsearch.

Шаг 9 - Настройка Transporter

Теперь мы можем перейти к изменениям конфигурации, чтобы перенести наши данные из MongoDB в Elasticsearch. Для Transporter требуется файл конфигурации (+ config.yaml +), файл преобразования (+ .js +) и файл приложения (+ application.js +)

  • Файл конфигурации определяет узлы, типы и URI

  • Файл приложения определяет поток данных от источника к месту назначения и необязательные шаги преобразования

  • Файл преобразования применяет преобразования к данным

_ * Примечание: * Все команды в этом разделе предполагают, что вы выполняете команды из каталога транспорта. _

Перейдите в каталог + transporter +:

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

Файл конфигурации

Вы можете взглянуть на пример файла + config.yaml +, если хотите. Мы собираемся создать резервную копию оригинала, а затем заменить его собственным содержимым.

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

Новый файл аналогичен, но обновляет некоторые URI и некоторые другие параметры в соответствии с тем, что находится на нашем сервере. Давайте скопируем содержимое отсюда и вставим в новый файл + config.yaml +. Используйте нано редактор снова.

nano test/config.yaml

Скопируйте содержимое ниже в файл. После этого сохраните файл, как описано ранее.

# 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

Обратите внимание на раздел + узлы . Мы немного подправили узлы ` localmongo ` и ` es +` по сравнению с исходным файлом. Nodes - это различные источники данных и места назначения. Type определяет тип узла. Например.,

  • + mongo + означает, что это экземпляр / кластер MongoDB

  • +asticsearch + означает, что это узел Elasticsearch

  • + file + означает, что это простой текстовый файл

+ uri + даст конечную точку API для соединения с узлом. Порт по умолчанию будет использоваться для MongoDB (27017), если он не указан. Так как нам нужно собирать данные из базы данных * foo * MongoDB, URI должен выглядеть следующим образом:

mongodb://localhost/foo

Аналогично, URI для Elasticsearch будет выглядеть так:

http://localhost:9200/

Сохраните файл + config.yaml +. Вам не нужно вносить какие-либо другие изменения.

Файл приложения

Теперь откройте файл + application.js в каталоге` + test`.

nano test/application.js

Замените образец содержимого файла содержимым, показанным ниже:

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

Сохраните файл и выйдите. Вот краткое объяснение нашего трубопровода.

  • + Source () + определяет источник, из которого можно получить данные

  • + transform + указывает, какое преобразование применить к каждой записи

  • + save () + определяет, куда сохранять данные

Варианты включают в себя:

  • + name: + имя узла, как оно выглядит в файле + config.yaml +

  • + namespace: + идентифицирует базу данных и имя таблицы; оно должно быть квалифицировано точкой (*. *)

Файл преобразования

Теперь последний кусок головоломки - это трансформация. Если вы помните, мы сохранили две записи в MongoDB с + firstName + и + lastName +. Именно здесь вы можете увидеть реальную силу преобразования данных при их синхронизации из MongoDB в Elasticsearch.

Допустим, мы хотим, чтобы документы, хранящиеся в Elasticsearch, имели другое поле с именем + fullName +. Для этого нам нужно создать новый файл преобразования, + test / transformers / addFullName.js +.

nano test/transformers/addFullName.js

Вставьте содержимое ниже в файл. Сохраните и выйдите, как описано ранее.

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

Первая строка необходима для описания способа, которым Transporter обрабатывает поле MongoDB + ObjectId () +. Вторая строка указывает Transporter объединить + firstName + и + lastName + для формирования + fullName +.

Это простое преобразование для примера, но с небольшим количеством JavaScript вы можете выполнять более сложные манипуляции с данными, подготавливая данные к поиску.

Шаг 10 - Выполнение преобразования

Теперь, когда мы закончили настройку, пришло время синхронизировать и преобразовать наши данные.

  • Убедитесь, что Elasticsearch запущен! * Если это не так, запустите его снова в * новом терминале * окне:

~/utils/elasticsearch-/bin/elasticsearch

В вашем * исходном терминале * убедитесь, что вы находитесь в каталоге + transporter +:

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

Выполните следующую команду, чтобы скопировать данные:

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

Команда + run + в Transporter ожидает два аргумента. Первый - это файл конфигурации, а второй - файл приложения. Если все пойдет хорошо, команда выполнит без ошибок.

Проверьте Elasticsearch, чтобы убедиться, что данные были скопированы с нашим преобразованием:

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

Вы получите такой результат:

{
 "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"}
   } ]
 }
}

Обратите внимание на поле + fullName +, которое содержит + firstName + и + lastName +, соединенные пробелом между ними - наше преобразование сработало.

Заключение

Теперь мы знаем, как использовать Transporter для копирования данных из MongoDB в Elasticsearch и как применять преобразования к нашим данным при синхронизации. Вы можете применить гораздо более сложные преобразования таким же образом. Также вы можете объединить несколько преобразований в конвейер.

Рекомендуется, если вы выполняете несколько преобразований, храните их в отдельных файлах и объединяйте в цепочки. Таким образом, вы делаете каждую из ваших трансформаций пригодной для использования в будущем.

Так что это в значительной степени так. Вы можете проверить Transporter проект на GitHub, чтобы оставаться в курсе последних изменений в API.

Вы также можете проверить этот учебник об основных CRUD операций в Elasticsearch ,

Related