Синхронизация преобразованных данных между MongoDB и Elasticsearch с помощью Transporter в Ubuntu 14.04
Ubuntu | Комментировать запись
Elasticsearch упрощает полнотекстовый поиск по данным, а MongoDB – хранение данных. эти приложения часто используются в связке.
Transporter – это инструмент Compose с открытым исходным кодом для перемещения данных между разными хранилищами данных. Разработчики часто пишут одноразовые скрипты для выполнения таких задач, как перемещение данных между несколькими базами данных, перемещение данных из файлов в БД или наоборот. Но использование такого инструмента, как Transporter, имеет ряд преимуществ.
Transporter позволяет создавать конвейеры, которые определяют поток из источника (source, откуда читаются данные) в приемник данных (sink, куда записываются данные). Источниками и приемниками могут быть базы данных SQL или NoSQL, плоские файлы и другие ресурсы.
Кроме перемещения данных Transporter также позволяет изменять данные при прохождении через конвейер с помощью трансформаторов.
В этом мануале мы рассмотрим пример перемещения и обработки данных из БД MongoDB в Elasticsearch с помощью Transporter в Ubuntu 14.04.
Читайте также: Синхронизация преобразованных данных между MongoDB и Elasticsearch с помощью Transporter в Ubuntu 16.04
Требования
Для работы вам нужен сервер Ubuntu 14.04, настроенный по этому мануалу.
1: Установка MongoDB
Импортируйте открытый ключ репозитория MongoDB:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Создайте list-файл для 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
Создайте новый каталог для установки программы и перейдите в него:
mkdir ~/utils
cd ~/utils
На сайте Elasticsearch найдите нужную вам версию (лучше использовать последнюю).
Загрузите выбранную версию:
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.5.0.zip
Установите unzip:
sudo apt-get install unzip
Распакуйте архив:
unzip elasticsearch-1.5.0.zip
Перейдите в полученный каталог:
cd elasticsearch-1.5.0
Запустите Elasticsearch:
bin/elasticsearch
На это уйдет пара секунд. После этого Elasticsearch запустится в терминале.
Примечание: Возможно, вы захотите запустить Elasticsearch как сервис, чтобы иметь доступ к команде sudo service elasticsearch restart. Больше информации вы найдете в мануале Система инициализации Upstart: что это такое и как это работает. Также вы можете установить Elasticsearch из репозитория Ubuntu.
Оставьте этот терминал открытым. Создайте новое SSH-подключение в новом окне терминала и убедитесь, что экземпляр работает:
curl -XGET http://localhost:9200
По умолчанию Elasticsearch использует порт 9200. Если все работает правильно, вы увидите такой вывод:
{
"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"
}
4: Установка Mercurial
Теперь нужно установить инструмент управления версиями Mercurial.
sudo apt-get install mercurial
Убедитесь, что установка прошла успешно:
hg
Mercurial Distributed SCM
basic commands:
. . .
5: Установка Go
Transporter написан на языке 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/8host/go
Если путь отображается неправильно, просмотрите предыдущие разделы мануала, чтобы найти ошибку.
Установив $GOPATH, нужно убедиться, что Go установлен правильно. Для этого соберите простую программу.
Создайте файл hello.go и поместите в него следующую программу.
nano ~/hello.go
Скопируйте и вставьте короткую программу «Hello, world».
package main;
import "fmt"
func main() {
fmt.Printf("Hello, world\n")
}
Нажмите CTRL+X, чтобы закрыть, и Y+ENTER, чтобы сохранить файл.
В домашнем каталоге запустите файл Go:
go run hello.go
Hello, world
Если вы видите такое сообщение, установка Go прошла успешно.
Перейдите в каталог $GOPATH и создайте подкаталоги src, pkg и bin. Они образуют рабочее пространство Go.
cd $GOPATH
mkdir src pkg bin
- src хранит исходные файлы Go, собранные в пакеты (по пакету на каждый каталог).
- pkg содержит объекты пакетов.
- bin содержит исполняемые команды.
6: Установка Git
Git понадобится для установки Transporter:
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.
Клонируйте GitHub репозиторий.
git clone https://github.com/compose/transporter.git
Перейдите в новый каталог:
cd transporter
Передайте права на каталог /usr/lib/go:
sudo chown -R $USER /usr/lib/go
Убедитесь, что build-essential установлен в систему:
sudo apt-get install build-essential
Чтобы загрузить все зависимости, запустите:
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
По терминологии MongoDB:
- База данных – это аналог индексов в Elasticsearch.
- Коллекция – аналог типов в Elasticsearch.
Теперь нужно синхронизировать данные коллекции bar БД foo из MongoDB в тип bar индекса foo в Elasticsearch.
9: Настройка Transporter
Теперь нужно настроить синхронизацию данных. Transporter нужен конфигурационный файл config.yaml, трансформатор myTransformation.js и файл приложения application.js.
- В конфигурационном файле хранятся данные о нодах, типах и URI.
- В файле приложения определяется поток данных, его источник и приемник, а также опциональные параметры трансформации.
- Трансформатор определяет, как будут преобразовываться данные.
Примечание: Все команды в данном разделе нужно выполнить в каталоге transporter.
Перейдите в каталог 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
Сохраните и закройте файл.
Обратите внимание на раздел nodes. В отличие от оригинала, здесь немного изменены ноды localmongo и es. Ноды – это различные источники и приемники данных. type – это тип ноды.
- mongo указывает на экземпляр MongoDB.
- elasticsearch указывает на ноду Elasticsearch.
- file значит, что это простой текстовый файл.
uri предоставит конечную точку API для соединения с нодой. MongoDB будет использовать порт по умолчанию (27017), если не указан другой порт. Поскольку нам нужно извлечь данные из базы данных foo MongoDB, URI должен выглядеть так:
mongodb://localhost/foo
URI Elasticsearch имеет такой вид:
http://localhost:9200/
Сохраните файл config.yaml.
Файл приложения
Откройте application.js:
nano test/application.js
Замените его содержимое такими строками:
Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});
Сохраните и закройте файл.
- Source(options) указывает источник данных.
- transform определяет, как преобразовывать данные.
- save(options) указывает, куда сохранять данные.
- Опция 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(). Вторая строка объединяет firstName и lastName в поле fullName.
Это простой пример преобразования, но, имея базовые навыки работы с JavaScript, вы сможете выполнять более сложные манипуляции с данными.
10: Преобразование данных
Теперь, когда настройка завершена, пришло время синхронизировать и преобразовать данные.
Убедитесь, что Elasticsearch запущен! Если это не так, запустите его снова в новом окне терминала:
~/utils/elasticsearch-1.5.0/bin/elasticsearch
В исходном терминале убедитесь, что вы находитесь в каталоге transporter:
cd ~/go/src/github.com/compose/transporter
Чтобы скопировать данные, введите:
transporter run --config ./test/config.yaml ./test/application.js
Команда run принимаетдва аргумента. Сначала идет файл конфигурации, а затем – файл приложения. Если все будет хорошо, команда выполнится без каких-либо ошибок.
Проверьте 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 на GitHub
Tags: ElasticSearch, Git, Go, Java, Mercurial, MongoDB, Transporter, Ubuntu 14.04