ステータス:非推奨

このチュートリアルは、古いバージョンの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, pkgbin. これらのディレクトリは、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:[email protected]:8086/compose
  debug:
    type: file
    uri: stdout://
  foofile:
    type: file
    uri: file:///tmp/foo

に注意してください nodes セクション。 微調整しました localmongoes 元のファイルとわずかに比較してノード。 ノードは、さまざまなデータソースと宛先です。 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つのレコードを保存しました。 firstNamelastName. ここで、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行目は、トランスポーターに連結するように指示しています firstNamelastName 申込用紙へ 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、が含まれています firstNamelastName 間にあるスペースによって連結されます—私たちの変換は機能しました。

結論

これで、Transporterを使用してMongoDBからElasticsearchにデータをコピーする方法と、同期中にデータに変換を適用する方法がわかりました。 同じ方法で、はるかに複雑な変換を適用できます。 また、パイプラインで複数の変換を連鎖させることができます。

複数の変換を行う場合は、それらを別々のファイルに保持し、チェーン化することをお勧めします。 このようにして、変換のそれぞれを将来のために独立して使用できるようにします。

だから、それはほとんどそれです。 GitHubTransporterプロジェクトをチェックアウトして、APIの最新の変更について最新情報を入手できます。

Elasticsearchでの基本的なCRUD操作に関するこのチュートリアルも確認してください。