Ubuntu14.04でTransporterを使用して変換されたデータをMongoDBからElasticsearchに同期する方法
ステータス:非推奨
このチュートリアルは、古いバージョンのTransporter用に作成されています。 代わりに、このチュートリアルの Ubuntu 16.04バージョンを読むことができます。これは、より新しいバージョンのTransporterを使用しています。
序章
Elasticsearchはデータの全文検索を容易にし、MongoDBはデータの保存に優れています。 MongoDBを使用してデータを保存し、Elasticsearchを使用して検索するのが一般的なアーキテクチャです。
多くの場合、MongoDBからElasticsearchにデータを一括で移行する必要があるかもしれません。 このための独自のプログラムを作成することは、良い演習ではありますが、退屈な作業になる可能性があります。 Compose (データベース用のクラウドプラットフォーム)によって開発されたTransporterと呼ばれる素晴らしいオープンソースユーティリティがあり、このタスクを非常に効率的に処理します。
このチュートリアルでは、オープンソースユーティリティのTransporterを使用して、カスタム変換を使用してMongoDBからElasticsearchにデータをすばやくコピーする方法を示します。
目標
この記事では、Transporterユーティリティを使用して、MongoDBから Ubuntu14.04のElasticsearchにデータをコピーする方法について説明します。
まず、MongoDBとElasticsearchのインストール方法を示す簡単な概要から始めますが、2つのシステムでのデータモデリングについては詳しく説明しません。 両方をすでにインストールしている場合は、インストール手順をすばやく確認してください。
次に、トランスポーターに移ります。
手順は、他のバージョンのUbuntuや他のLinuxディストリビューションでも同様です。
前提条件
以下の前提条件を満たしてください。
- Ubuntu14.04ドロップレット
- 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
Elasticsearchのダウンロードページにアクセスして、最新バージョンを確認してください。
次に、Elasticsearchの最新バージョンをダウンロードします。 この記事を書いている時点では、最新バージョンは1.5.0でした。
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がターミナルウィンドウで実行されます。
注:ある時点で、Elasticsearchをサービスとして実行して、次のコマンドで制御できるようにすることができます。
sudo service elasticsearch restart
および同様のコマンド。 ヒントについては、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を正しく機能させるには、次の環境変数を設定する必要があります。
から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/sammy/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ソースファイルが含まれています(ディレクトリごとに1つのパッケージ)pkg
パッケージオブジェクトが含まれていますbin
実行可能コマンドが含まれています
ステップ6—Gitをインストールする
Gitを使用してTransporterをインストールします。 次のコマンドでGitをインストールします。
sudo apt-get install git
ステップ7—トランスポーターのインストール
次に、Transporterの新しいディレクトリを作成して移動します。 ユーティリティはComposeによって開発されたため、ディレクトリを呼び出します compose
.
mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose
これはどこです compose/transporter
インストールされます。
TransporterGitHubリポジトリのクローンを作成します。
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
. . .
これでインストールは完了です。 ここで、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のデータベースは、Elasticsearchのインデックスに類似しています
- MongoDBのコレクションは、Elasticsearchのタイプに類似しています
私たちの最終的な目標は、MongoDBのfooデータベースのbarコレクションのデータをfooインデックスのbarタイプに同期することです。 Elasticsearchで。
ステップ9—トランスポーターの構成
これで、構成の変更に進み、データをMongoDBからElasticsearchに移行できます。 Transporterには構成ファイルが必要です(config.yaml
)、変換ファイル(myTransformation.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
元のファイルとわずかに比較してノード。 ノードは、さまざまなデータソースと宛先です。 Type は、ノードのタイプを定義します。 例えば、
mongo
それがMongoDBインスタンス/クラスターであることを意味しますelasticsearch
Elasticsearchノードであることを意味しますfile
プレーンテキストファイルであることを意味します
uri
ノードに接続するためのAPIエンドポイントを提供します。 指定しない場合、デフォルトのポートがMongoDB(27017)に使用されます。 MongoDBのfooデータベースからデータをキャプチャする必要があるため、URIは次のようになります。
mongodb://localhost/foo
同様に、ElasticsearchのURIは次のようになります。
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(options)
データをフェッチするソースを識別しますtransform
各レコードに適用する変換を指定しますsave(options)
データを保存する場所を特定します
オプションは次のとおりです。
name:
に表示されるノードの名前config.yaml
ファイル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行目は、トランスポーターに連結するように指示しています 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
The run
Transporterのコマンドは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にデータをコピーする方法と、同期中にデータに変換を適用する方法がわかりました。 同じ方法で、はるかに複雑な変換を適用できます。 また、パイプラインで複数の変換を連鎖させることができます。
複数の変換を行う場合は、それらを別々のファイルに保持し、チェーン化することをお勧めします。 このようにして、変換のそれぞれを将来のために独立して使用できるようにします。
だから、それはほとんどそれです。 GitHubでTransporterプロジェクトをチェックアウトして、APIの最新の変更について最新情報を入手できます。
Elasticsearchでの基本的なCRUD操作に関するこのチュートリアルも確認してください。