ステータス:非推奨

このチュートリアルは、古いバージョンの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を正しく機能させるには、次の環境変数を設定する必要があります。

$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/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ディレクトリに移動し、サブディレクトリsrcpkg、および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

これは、$GOPATHPATH変数に追加されなかったことを意味します。 コマンドを正しく実行したことを確認してください。

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ファイルを保存します。 他に変更を加える必要はありません。

アプリケーションファイル

次に、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(options)は、データをフェッチするソースを識別します
  • transformは、各レコードに適用する変換を指定します
  • save(options)は、データを保存する場所を識別します

オプションは次のとおりです。

  • name:config.yamlファイルに表示されるノードの名前
  • namespace:はデータベースとテーブル名を識別します。 ドットで修飾する必要があります(

変換ファイル

さて、パズルの最後のピースは変換です。 思い出してください。MongoDBにfirstNamelastNameの2つのレコードを保存しました。 ここで、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に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

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に注目してください。このフィールドには、firstNamelastNameが間にスペースで連結されています。変換は機能しました。

結論

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

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

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

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