如何在 Ubuntu 14.04 上使用 Transporter 将转换后的数据从 MongoDB 同步到 Elasticsearch

金钱(警告)

状态: 被剥夺

此教程是为过时版本的Transporter编写的. 您可以阅读本教程的 Ubuntu 16.04 版本 相反,它使用了更新的版本的Transporter。

介绍

Elasticsearch 可轻松对数据进行完整的文本搜索,而 MongoDB 则擅长存储数据,使用 MongoDB 存储数据和 Elasticsearch 进行搜索是一种常见的架构。

很多时候,你可能会发现需要大量将数据从MongoDB迁移到Elasticsearch。为此编写自己的程序,尽管这是一个很好的练习,但可能是一个无聊的任务。有一个名为Transporter的奇妙的开源实用程序,由 Compose开发(数据库的云平台),它非常有效地处理这个任务。

本教程将向您展示如何使用开源工具 Transporter 快速将数据从 MongoDB 复制到 Elasticsearch 以自定义转换。

目标

在本文中,我们将讨论如何将数据从MongoDB复制到Ubuntu 14.04**上的Elasticsearch,使用Transporter实用程序。

我们将从快速概述开始,向您展示如何安装 MongoDB 和 Elasticsearch,尽管我们不会详细介绍两种系统中的数据建模。

接下来,我们将转向运输。

指令类似于其他版本的Ubuntu,以及其他Linux发行版。

前提条件

请满足下列前提条件。

  • Ubuntu 14.04 Droplet
  • sudo用户

步骤1:安装 MongoDB

导入 MongoDB 存储库的公共密钥。

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

创建 MongoDB 列表文件。

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

重新加载本地包数据库。

1sudo apt-get update

安装 MongoDB 包:

1sudo apt-get install -y mongodb-org

请注意,每个包包含相关版本号。

一旦安装完成,您可以开始,停止,并检查服务的状态. 它将在安装后自动启动。

尝试连接到作为服务运行的 MongoDB 实例:

1mongo

如果它升起并运行,你会看到这样的东西:

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

这意味着数据库服务器正在运行!您现在可以退出:

1exit

第2步:安装Java

Java 是 Elasticsearch 的先决条件,让我们现在安装它。

首先,添加存储器:

1sudo apt-add-repository ppa:webupd8team/java

再次更新您的包列表:

1sudo apt-get update

安装Java:

1sudo apt-get install oracle-java8-installer

当被提示接受许可证时,选择OK,然后选择Yes

步骤 3 – 安装 Elasticsearch

现在我们将安装Elasticsearch。

首先,创建一个新的目录,在那里你将安装搜索软件,并进入它。

1mkdir ~/utils
2cd ~/utils

请访问 Elasticsearch 的 下载页面以查看最新版本。

现在下载最新版本的 Elasticsearch. 在写这篇文章的时候,最新版本是 1.5.0。

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

安裝 Unzip:

1sudo apt-get install unzip

Unzip 檔案:

1unzip elasticsearch-1.5.0.zip

导航到您提取的目录:

1cd elasticsearch-1.5.0

通过发出以下命令启动 Elasticsearch:

1bin/elasticsearch

Elasticsearch 将需要几秒钟才能启动,你会看到一些启动日志,就像它一样。

注意:在某个时候,你可能想要运行Elasticsearch作为一个服务,所以你可以用sudo服务Elasticsearch重新启动和类似的命令来控制它;请参阅这个关于Upstart的教程(https://andsky.com/tech/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it)的提示。

另一个终端窗口中连接到您的服务器,并检查您的实例是否正在运行:

1curl -XGET http://localhost:9200

9200 是 Elasticsearch 的默认端口. 如果一切顺利,您将看到类似于下面显示的输出:

 1{
 2  "status" : 200,
 3  "name" : "Northstar",
 4  "cluster_name" : "elasticsearch",
 5  "version" : {
 6    "number" : "1.5.0",
 7    "build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c",
 8    "build_timestamp" : "2015-03-23T14:30:58Z",
 9    "build_snapshot" : false,
10    "lucene_version" : "4.10.4"
11  },
12  "tagline" : "You Know, for Search"
13}

注:对于本文的后期部分,当您要复制数据时,请确保 Elasticsearch 正在运行(并在端口 9200 上)。

步骤 4 - 安装 Mercurial

接下来,我们将安装 Mercurial 修订控制工具。

1sudo apt-get install mercurial

請確定 Mercurial 是否正確安裝:

1hg

如果正确安装,您将收到以下输出:

1Mercurial Distributed SCM
2
3basic commands:
4
5. . .

步骤五:安装

Transporter是用Go语言写的,所以你需要在你的系统上安装golang

1sudo apt-get install golang

要正常工作,您需要设置以下环境变量:

从您的$HOME目录创建 Go 文件夹:

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

更新你的路径:

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

** 退出当前 SSH 会话并再次登录** 您可以关闭您一直在工作的会话,并保持 Elasticsearch 会话运行。

1echo $GOPATH

这应该显示Go的新路径,在我们的情况下,它将是:

1/home/sammy/go

如果它不正确显示路径,请重复检查本节中的步骤。

一旦我们的$GOPATH设置正确,我们需要通过构建一个简单的程序来检查Go是否正确安装。

创建一个名为hello.go的文件,并将以下程序放入其中. 您可以使用您想要的任何文本编辑器. 我们将在本文中使用纳米文本编辑器。

1nano ~/hello.go

现在将下面这个简短的Hello, world程序复制到新打开的文件中。

1package main;
2import "fmt"
3
4func main() {
5    fmt.Printf("Hello, world\n")
6}

一旦完成,请按CTRL+X退出文件. 它会提示您保存文件. 按Y,然后按ENTER。 它会询问您是否要更改文件名。

然后,从您的主目录中,使用 Go 运行文件:

1go run hello.go

你应该看到这个输出:

1Hello, world

如果您看到你好,世界消息,则 Go 安装正确。

现在,进入$GOPATH目录,创建src,pkgbin子目录,这些目录构成Go的工作空间。

1cd $GOPATH
2mkdir src pkg bin
  • src 包含 Go 源文件,分组成包(每个目录每包)
  • pkg 包含包对象
  • bin 包含可执行的命令

步骤 6 - 安装 Git

我们将使用 Git 来安装 Transporter. 使用以下命令安装 Git:

1sudo apt-get install git

步骤7 - 安装运输机

现在创建并移动到 Transporter 的新目录. 由于该实用程序由 Compose 开发,我们将将目录称为构成

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

这就是组装/运输将安装的地方。

克隆 Transporter GitHub 存储库:

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

进入新目录:

1cd transporter

接收 /usr/lib/go 目录的所有权:

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

请确保为 GCC 安装build-essential:

1sudo apt-get install build-essential

运行go get命令来获取所有依赖:

1go get -a ./cmd/...

此步骤可能需要一段时间,所以要耐心!一旦完成,您可以构建 Transporter。

1go build -a ./cmd/...

如果一切顺利,它将完成,没有任何错误或警告. 通过运行此命令检查 Transporter 是否正确安装:

1transporter

你应该看到这样的输出:

1usage: transporter [--version] [--help] <command> [<args>]
2
3Available commands are:
4    about Show information about database adaptors
5    eval Eval javascript to build and run a transporter application
6
7. . .

现在,我们需要一些测试数据在MongoDB中,我们想要同步到Elasticsearch。

解决问题:**

如果您遇到以下错误:

1transporter: command not found

这意味着你的$GOPATH没有被添加到你的PATH变量中,检查你是否正确执行了命令:

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

尝试退出并再次登录. 如果错误仍然存在,请使用以下命令:

1$GOPATH/bin/transporter

步骤 8 - 创建样本数据

现在我们已经安装了一切,我们可以转到数据同步部分。

连接到 MongoDB:

1mongo

您现在应该看到 MongoDB 提示, >. 创建一个名为 foo 的数据库。

1use foo

将一些样本文档插入一个名为bar的集合:

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

选择你刚刚输入的内容:

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

这应该显示下面的结果(‘ObjectId’将在您的机器上有所不同):

 1{
 2    "_id" : ObjectId("549c3ef5a0152464dde10bc4"),
 3    "firstName" : "Robert",
 4    "lastName" : "Baratheon"
 5}
 6{
 7    "_id" : ObjectId("549c3f03a0152464dde10bc5"),
 8    "firstName" : "John",
 9    "lastName" : "Snow"
10}

现在你可以离开数据库:

1exit

略有术语:

  • MongoDB 中的 database 与 Elasticsearch 中的 index 相似 * MongoDB 中的 collection 与 Elasticsearch 中的 type 相似

我们的最终目标是将数据从 MongoDB 中的 foo数据库的 bar 集合同步到 Elasticsearch 中的 foo 索引的 bar 类型。

步骤 9 - 配置传输器

现在,我们可以转移到配置更改,将我们的数据从MongoDB迁移到Elasticsearch。Transporter需要一个配置文件(config.yaml),一个转换文件(myTransformation.js)和一个应用程序文件(application.js)

  • 配置文件指定节点、类型和 URI
  • 应用文件指定从源到目的地的数据流和可选的转换步骤
  • 转换文件将转换应用于数据

注意:本节中的所有命令都假定您正在执行从传输器目录中的命令。

转到运输目录:

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

配置文件

如果您喜欢,您可以查看例子 config.yaml 文件. 我们将备份原始文件,然后用我们自己的内容替换它。

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

新文件类似,但更新了一些URI和其他一些设置,以匹配我们的服务器上的内容. 让我们从这里复制内容,并粘贴到新的 config.yaml 文件。

1nano test/config.yaml

将下面的内容复制到文件中。完成后,如上所述,将文件保存。

 1# api:
 2#   interval: 60s
 3#   uri: "http://requestb.in/13gerls1"
 4#   key: "48593282-b38d-4bf5-af58-f7327271e73d"
 5#   pid: "something-static"
 6nodes:
 7  localmongo:
 8    type: mongo
 9    uri: mongodb://localhost/foo
10  es:
11    type: elasticsearch
12    uri: http://localhost:9200/
13  timeseries:
14    type: influx
15    uri: influxdb://root:root@localhost:8086/compose
16  debug:
17    type: file
18    uri: stdout://
19  foofile:
20    type: file
21    uri: file:///tmp/foo

请注意节点部分. 我们与原始文件相比稍微调整了localmongoes节点。 _Nodes_是各种数据源和目的地。

  • mongo 意思是 MongoDB 实例/群集
  • elasticsearch 意思是 Elasticsearch 节点
  • file 意思是简单文本文件

uri会给 API 端点连接到节点.默认端口将用于 MongoDB (27017) 如果没有指定,我们需要从 MongoDB 的 foo 数据库中捕获数据,所以 URI 应该是这样的:

1mongodb://localhost/foo

同样,Elasticsearch 的 URI 将看起来像:

1http://localhost:9200/

保存「config.yaml」文件,您不需要做出任何其他更改。

应用文件

现在,在测试目录中打开application.js文件。

1nano test/application.js

用下面的内容替换文件的样本内容:

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

保存文件和退出. 这里是我们管道的简要解释。

  • Source(options) 标识了从哪个来源获取数据
  • transform 指定了对每个记录应用的转换
  • save(options) 标识了保存数据的位置

选项包括:

  • name: 节点的名称,如在 config.yaml 文件中出现
  • namespace: 识别数据库和表名称;它必须通过点( . )

转换档案

如果你记得,我们在MongoDB中存储了两个记录,其中包括firstNamelastName

假设我们希望在 Elasticsearch 中存储的文档中有另一个名为fullName的字段,因此我们需要创建一个新的转换文件,即test/transformers/addFullName.js

1nano test/transformers/addFullName.js

将下面的内容粘贴到文件中. 保存和退出如上所述。

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

第一行是必要的,以解决Transporter处理MongoDB的ObjectId()字段的方式;第二行告诉Transporter将firstNamelastName合并成fullName

这是一个简单的转换,例如,但用一点JavaScript你可以做更复杂的数据操纵,当你准备你的数据搜索。

第10步 - 执行转型

现在我们已经完成了设置,是时候同步和转换我们的数据了。

** 确保 Elasticsearch 运行!** 如果没有,请在 **新终端 ** 窗口中重新启动:

1~/utils/elasticsearch-1.5.0/bin/elasticsearch

在您的原始终端中,请确保您位于运输员目录中:

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

执行以下命令来复制数据:

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

Transporter 的运行命令预计有两个参数. 首先是 config 文件,第二是应用程序文件. 如果一切顺利,命令将完成,没有任何错误。

检查Elasticsearch以验证数据是否被复制,与我们的转换:

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

你会得到这样的结果:

 1{
 2  "took" : 10,
 3  "timed_out" : false,
 4  "_shards" : {
 5    "total" : 5,
 6    "successful" : 5,
 7    "failed" : 0
 8  },
 9  "hits" : {
10    "total" : 2,
11    "max_score" : 1.0,
12    "hits" : [ {
13      "_index" : "foo",
14      "_type" : "bar_full_name",
15      "_id" : "549c3ef5a0152464dde10bc4",
16      "_score" : 1.0,
17      "_source":{"_id":"549c3ef5a0152464dde10bc4","firstName":"Robert","fullName":"Robert Baratheon","lastName":"Baratheon"}
18    }, {
19      "_index" : "foo",
20      "_type" : "bar_full_name",
21      "_id" : "549c3f03a0152464dde10bc5",
22      "_score" : 1.0,
23      "_source":{"_id":"549c3f03a0152464dde10bc5","firstName":"John","fullName":"John Snow","lastName":"Snow"}
24    } ]
25  }
26}

注意fullName字段,其中包含firstNamelastName字段,其中包含一个间隙 - 我们的转换工作。

结论

现在我们知道如何使用Transporter将数据从MongoDB复制到Elasticsearch,以及如何在同步过程中将转换应用于我们的数据。

这是一个很好的做法,如果你正在做多个转换,将它们保存在单独的文件中,并链接它们。

您可以查看GitHub上的Transporter项目(https://github.com/compose/transporter),以了解API的最新更改。

您可能还想查看有关基本的本教程 CRUD 操作在 Elasticsearch

Published At
Categories with 技术
comments powered by Disqus