前書き
Elasticsearchはデータの全文検索を容易にし、MongoDBはデータの保存に優れています。 MongoDBを使用してデータを保存し、検索用にElasticsearchを使用することは一般的なアーキテクチャです。
多くの場合、データをMongoDBからElasticsearchに一括で移行する必要がある場合があります。 このための独自のプログラムを作成することは、良い練習ですが、退屈な作業になる可能性があります。 Compose(データベース用のクラウドプラットフォーム)によって開発されたTransporterという素晴らしいオープンソースユーティリティがあり、このタスクを非常に効率的に処理します。
このチュートリアルでは、オープンソースユーティリティTransporterを使用して、MongoDBからカスタム変換を使用してElasticsearchにデータをすばやくコピーする方法を示します。
目標
この記事では、Transporterユーティリティを使用して、* Ubuntu 14.04 *でMongoDBからElasticsearchにデータをコピーする方法について説明します。
MongoDBとElasticsearchのインストール方法を示す簡単な概要から始めますが、2つのシステムのデータモデリングについては詳しく説明しません。 両方のインストール手順を既にインストールしている場合は、インストール手順を簡単にすばやく確認してください。
次に、Transporterに進みます。
手順は、他のバージョンのUbuntuおよび他のLinuxディストリビューションでも同様です。
ステップ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
Elasticsearchのhttps://www.elastic.co/downloads/elasticsearch [ダウンロードページ]にアクセスして、最新バージョンを確認してください。
Elasticsearchの最新バージョンをダウンロードしてください。 この記事の執筆時点では、最新バージョンは1.5.0でした。
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-.zip
unzipをインストールします。
sudo apt-get install unzip
アーカイブを解凍します。
unzip elasticsearch-.zip
解凍したディレクトリに移動します。
cd elasticsearch-
次のコマンドを発行してElasticsearchを起動します。
bin/elasticsearch
Elasticsearchの起動には数秒かかります。 起動ログがいくつか表示されます。 これで、Elasticsearchがターミナルウィンドウで実行されます。
_ *注意:*ある時点でElasticsearchをサービスとして実行して、 `+ sudo service elasticsearch restart +`および同様のコマンドで制御できるようにすることができます。ヒントについては、https://www.digitalocean.com/community/tutorials/the-upstart-event-system-what-it-is-and-how-to-use-it [Upstart]に関するこのチュートリアルを参照してください。 別の方法として、UbuntuのリポジトリからElasticsearchをインストールできますが、おそらく古いバージョンが入手できます。 _
この端末は開いたままにしてください。 *別のターミナルウィンドウ*でサーバーに別の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のインストール
TransporterはGo言語で書かれています。 したがって、システムに `+ golang +`をインストールする必要があります。
sudo apt-get install golang
Goが正常に機能するには、次の環境変数を設定する必要があります。
`+ $ HOME`ディレクトリからGoのフォルダーを作成します:
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 text editorを使用します。 次のコマンドを入力して、新しいファイルを作成します。
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ソースファイルが含まれています(ディレクトリごとに1つのパッケージ)
-
`+ 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
GCC用に `+ build-essential +`がインストールされていることを確認してください:
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
. . .
これでインストールは完了です。 ここで、Elasticsearchに同期するMongoDBのテストデータが必要です。
トラブルシューティング:
次のエラーが発生した場合
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の_database_は、Elasticsearchの_index_に類似しています
-
MongoDBの_collection_は、Elasticsearchの_type_に類似しています
最終的な目標は、MongoDBの* foo データベースの bar コレクションのデータをElasticsearchの foo インデックスの bar *タイプに同期することです。
手順9-トランスポーターの構成
これで、構成の変更に移って、データを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エディターを再度使用します。
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 +」ノードを少し調整しました。 _Nodes_は、さまざまなデータソースおよび宛先です。 _Type_はノードのタイプを定義します。 例えば。、
-
`+ mongo +`は、MongoDBインスタンス/クラスターであることを意味します
-
`+ elasticsearch +`は、Elasticsearchノードであることを意味します
-
`+ file +`はプレーンテキストファイルであることを意味します
`+ uri +`は、ノードに接続するためのAPIエンドポイントを提供します。 指定しない場合、デフォルトのポートがMongoDB(27017)に使用されます。 MongoDBの* foo *データベースからデータをキャプチャする必要があるため、URIは次のようになります。
mongodb://localhost/foo
同様に、ElasticsearchのURIは次のようになります。
http://localhost:9200/
`+ config.yaml +`ファイルを保存します。 他の変更を加える必要はありません。
アプリケーションファイル
次に、 + test`ディレクトリの
+ application.js`ファイルを開きます。
nano test/application.js
ファイルのサンプルコンテンツを以下に示すコンテンツに置き換えます。
Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});
ファイルを保存して終了します。 パイプラインの簡単な説明を次に示します。
-
`+ Source()+`は、データを取得するソースを識別します
-
`+ transform +`は、各レコードに適用する変換を指定します
-
`+ save()+`はデータを保存する場所を識別します
オプションは次のとおりです。
-
`+ config.yaml `ファイルに表示されるノードの ` name:+`名
-
`+ namespace:+`はデータベースとテーブル名を識別します;ドット(。)で修飾する必要があります
変換ファイル
さて、パズルの最後のピースは変換です。 思い出すと、MongoDBに2つのレコードを `+ 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()`フィールドを処理する方法に取り組むには、最初の行が必要です。 2行目は、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
Transporterの `+ run +`コマンドには2つの引数が必要です。 1つ目は設定ファイルで、2つ目はアプリケーションファイルです。 すべてがうまくいけば、コマンドはエラーなしで完了します。
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にデータをコピーする方法、および同期中にデータに変換を適用する方法がわかりました。 同じ方法で、はるかに複雑な変換を適用できます。 また、パイプラインで複数の変換をチェーンできます。
複数の変換を行う場合は、それらを別々のファイルに保持し、連鎖させることをお勧めします。 このようにして、各変換を将来独立して使用できるようにします。
だから、それはほとんどそれです。 APIの最新の変更については、https://github.com/compose/transporter [GitHubのトランスポータープロジェクト]をご覧ください。
基本的なhttps://www.digitalocean.com/community/tutorials/how-to-interact-with-data-in-elasticsearch-using-crud-operations[ElasticsearchのCRUD操作]に関するこのチュートリアルもご覧ください。 。