金钱(警告)
状态: 被剥夺
此教程是为过时版本的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
,pkg
和bin
子目录,这些目录构成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
请注意节点
部分. 我们与原始文件相比稍微调整了localmongo
和es
节点。 _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中存储了两个记录,其中包括firstName
和lastName
。
假设我们希望在 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将firstName
和lastName
合并成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
字段,其中包含firstName
和lastName
字段,其中包含一个间隙 - 我们的转换工作。
结论
现在我们知道如何使用Transporter将数据从MongoDB复制到Elasticsearch,以及如何在同步过程中将转换应用于我们的数据。
这是一个很好的做法,如果你正在做多个转换,将它们保存在单独的文件中,并链接它们。
您可以查看GitHub上的Transporter项目(https://github.com/compose/transporter),以了解API的最新更改。
您可能还想查看有关基本的本教程 CRUD 操作在 Elasticsearch。