Ubuntu 16.04でトランスポーターを使用してMongoDBからElasticsearchに変換されたデータを同期する方法

前書き

Transporterは、異なるデータストア間でデータを移動するためのオープンソースツールです。 開発者は多くの場合、データベース間でのデータの移動、ファイルからデータベースへのデータの移動、またはその逆などのタスク用の1回限りのスクリプトを記述しますが、Transporterなどのツールを使用するといくつかの利点があります。

Transporterで、pipelines_を構築します。これは、_source(データが読み取られる)から_sink_(データが書き込まれる)へのデータの流れを定義します。 ソースとシンクは、SQLまたはNoSQLデータベース、フラットファイル、またはその他のリソースです。 Transporterは、プラグ可能な拡張機能である_adaptors_を使用してこれらのリソースと通信し、プロジェクトにはデフォルトで一般的なデータベース用のhttps://github.com/compose/transporter#adaptors [複数のアダプター]が含まれています。

Transporterでは、データの移動に加えて、_transformer_を使用してパイプラインを移動するときにデータを変更することもできます。 アダプターと同様に、デフォルトでhttps://github.com/compose/transporter/wiki/Transformers [複数のトランスフォーマー]が含まれています。 独自のトランスフォーマーを作成して、データの変更をカスタマイズすることもできます。

このチュートリアルでは、Transporterの組み込みアダプターとJavaScriptで記述されたカスタムトランスフォーマーを使用して、MongoDBデータベースからElasticsearchにデータを移動および処理する例を紹介します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

トランスポーターパイプラインはJavaScriptで記述されています。 このチュートリアルを進めるためにJavaScriptの事前の知識や経験は必要ありませんが、https://www.digitalocean.com/community/tags/javascript?type = tutorials [これらのJavaScriptチュートリアル]で詳細を確認できます。

手順1-Transporterのインストール

Transporterは、最も一般的なオペレーティングシステムのバイナリを提供します。 Ubuntuのインストールプロセスには、Linuxバイナリをダウンロードして実行可能にするという2つのステップが含まれます。

まず、https://github.com/compose/transporter/releases/latest [GitHubのトランスポーターの最新リリースページ]から最新バージョンのリンクを取得します。 「+ -linux-amd64 +」で終わるリンクをコピーします。 このチュートリアルでは、執筆時点で最新のv0.5.2を使用します。

バイナリをホームディレクトリにダウンロードします。

cd
wget https://github.com/compose/transporter/releases/download/v/transporter--linux-amd64

http://do.co/techguide#preferred-installation-locations [それを `+ / usr / local / bin +`に移動する]または好みのインストールディレクトリ。

mv transporter-*-linux-amd64 /usr/local/bin/transporter

次に、実行できるように実行可能にします。

chmod +x /usr/local/bin/

バイナリを実行することにより、Transporterが正しくセットアップされていることをテストできます。

transporter

使用方法のヘルプ出力とバージョン番号が表示されます。

OutputUSAGE
 transporter <command> [flags]

COMMANDS
 run       run pipeline loaded from a file
 . . .

VERSION

Transporterを使用してMongoDBからElasticsearchにデータを移動するには、移動するMongoDB内のデータと、Transporterに移動方法を指示するパイプラインが必要です。 次の手順ではサンプルデータを作成しますが、移動するMongoDBデータベースが既にある場合は、次の手順をスキップして手順3に進んでください。

ステップ2-MongoDBへのサンプルデータの追加(オプション)

このステップでは、MongoDBに単一のコレクションを持つサンプルデータベースを作成し、そのコレクションにいくつかのドキュメントを追加します。 次に、チュートリアルの残りの部分で、Transporterパイプラインを使用してこのサンプルデータを移行および変換します。

まず、MongoDBデータベースに接続します。

mongo

これにより、プロンプトが「+ mongo> +」に変更され、MongoDBシェルを使用していることが示されます。

ここから、作業するデータベースを選択します。 これを「+ my_application +」と呼びます。

use my_application

`+ MongoDB +`では、データベースまたはコレクションを明示的に作成する必要はありません。 名前で選択したデータベースへのデータの追加を開始すると、そのデータベースが自動的に作成されます。

したがって、 `+ my_application `データベースを作成するには、2つのドキュメントを ` users +`コレクションに保存します。1つはSammy Sharkを表し、もう1つはGilly Glowfishを表します。 これがテストデータになります。

db.users.save({"firstName": "Sammy", "lastName": "Shark"});
db.users.save({"firstName": "Gilly", "lastName": "Glowfish"});

ドキュメントを追加した後、 `+ users +`コレクションにクエリを実行してレコードを表示できます。

db.users.find().pretty();

出力は以下の出力に似ていますが、 `+ _id +`カラムは異なります。 MongoDBはオブジェクトIDを自動的に追加して、コレクション内のドキュメントを一意に識別します。

output{
 "_id" : ObjectId("59299ac7f80b31254a916456"),
 "firstName" : "Sammy",
 "lastName" : "Shark"
}
{
 "_id" : ObjectId("59299ac7f80b31254a916457"),
 "firstName" : "Gilly",
 "lastName" : "Glowfish"
}

`+ CTRL + C +`を押して、MongoDBシェルを終了します。

次に、このデータをMongoDBからElasticsearchに移動するTransporterパイプラインを作成しましょう。

ステップ3-基本的なパイプラインの作成

Transporterのパイプラインは、デフォルトで `+ pipeline.js `という名前のJavaScriptファイルによって定義されます。 組み込みの ` init +`コマンドは、ソースとシンクを指定して、正しいディレクトリに基本的なhttps://github.com/compose/transporter/wiki/Configuration [設定ファイル]を作成します。

MongoDBをソース、Elasticsearchをシンクとして、スターター `+ pipeline.js +`を初期化します。

transporter init mongodb elasticsearch

次の出力が表示されます。

OutputWriting pipeline.js...

このステップで「+ pipeline.js +」を変更する必要はありませんが、どのように機能するかを見てみましょう。

ファイルは次のようになりますが、コマンド「+ cat pipeline.js 」、「 less pipeline.js 」(「 q 」を押して「 less +」を終了)、またはお気に入りのテキストエディタで開きます。

pipeline.js

var source = mongodb({
 "uri": "${MONGODB_URI}"
 // "timeout": "30s",
 // "tail": false,
 // "ssl": false,
 // "cacerts": ["/path/to/cert.pem"],
 // "wc": 1,
 // "fsync": false,
 // "bulk": false,
 // "collection_filters": "{}",
 // "read_preference": "Primary"
})

var sink = elasticsearch({
 "uri": "${ELASTICSEARCH_URI}"
 // "timeout": "10s", // defaults to 30s
 // "aws_access_key": "ABCDEF", // used for signing requests to AWS Elasticsearch service
 // "aws_access_secret": "ABCDEF" // used for signing requests to AWS Elasticsearch service
 // "parent_id": "elastic_parent" // defaults to "elastic_parent" parent identifier for Elasticsearch
})

t.Source("source", source, "/.*/").Save("sink", sink, "/.*/")

`+ var source `と ` var sink `で始まる行は、MongoDBのhttps://www.digitalocean.com/community/tutorials/understanding-variables-scope-hoisting-in-javascript[JavaScript variables]を定義し、それぞれElasticsearchアダプター。 これらのアダプターがこのステップの後半で必要とする ` MONGODB_URI `および ` ELASTICSEARCH_URI +`環境変数を定義します。

`+ // +`で始まる行はコメントです。 パイプラインに設定できる一般的な設定オプションを強調していますが、ここで作成している基本的なパイプラインには使用していません。

最後の行は、ソースとシンクを接続します。 変数「+ transporter 」または「 t 」により、パイプラインにアクセスできます。 ` .Source()`および ` .Save()` https://www.digitalocean.com/community/tutorials/how-to-define-functions-in-javascript[functions]を使用して追加しますファイルで以前に定義された ` source `と ` sink +`変数を使用してソースとシンク。

`+ Source()`および ` Save()`関数の3番目の引数は ` namespace。`です。最後の引数として ` /。* / +`を渡すと、すべてのMongoDBからデータを取得し、Elasticsearchの同じ名前空間に保存します。

このパイプラインを実行する前に、https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-を設定する必要がありますhttps://docs.mongodb.com/manual/reference/connection-string/[MongoDB URI]およびhttps://www.elastic.co/guide/en/elasticsearch/reference/current/のvps [環境変数] modules-network.html [Elasticsearch URI]。 使用している例では、両方ともデフォルト設定でローカルにホストされていますが、既存のMongoDBまたはElasticsearchインスタンスを使用している場合は、これらのオプションをカスタマイズしてください。

export MONGODB_URI='mongodb://localhost/my_application'
export ELASTICSEARCH_URI='http://localhost:9200/my_application'

これで、パイプラインを実行する準備ができました。

transporter run pipeline.js

次のように終わる出力が表示されます。

Output. . .
INFO[0001] metrics source records: 2                     path=source ts=1522942118483391242
INFO[0001] metrics source/sink records: 2                path="source/sink" ts=1522942118483395960
INFO[0001] exit map[source:mongodb sink:elasticsearch]   ts=1522942118483396878

最後から2番目と3番目の行では、この出力は、ソースに2つのレコードが存在し、2つのレコードがシンクに移動したことを示しています。

両方のレコードが処理されたことを確認するために、Elasticsearchに、現在存在するはずの `+ my_application +`データベースのコンテンツを照会できます。

curl $ELASTICSEARCH_URI/_search?pretty=true

`+?pretty = true +`パラメーターは出力を読みやすくします:

Output{
 "took" : 5,
 "timed_out" : false,
 "_shards" : {
   "total" : 5,
   "successful" : 5,
   "skipped" : 0,
   "failed" : 0
 },
 "hits" : {
   "total" : 2,
   "max_score" : 1.0,
   "hits" : [
     {
       "_index" : "my_application",
       "_type" : "users",
       "_id" : "5ac63e9c6687d9f638ced4fe",
       "_score" : 1.0,
       "_source" : {
         "firstName" : "Gilly",
         "lastName" : "Glowfish"
       }
     },
     {
       "_index" : "my_application",
       "_type" : "users",
       "_id" : "5ac63e986687d9f638ced4fd",
       "_score" : 1.0,
       "_source" : {
         "firstName" : "Sammy",
         "lastName" : "Shark"
       }
     }
   ]
 }
}

MongoDBのデータベースとコレクションは、Elasticsearchのインデックスとタイプに類似しています。 それを念頭に置いて、以下を確認する必要があります。

  • `+ _index `フィールドは ` my_application、+`元のMongoDBデータベースの名前に設定されます)。

  • + _type +`フィールドは、 `+ users、+ MongoDBコレクションの名前に設定されます。

  • `+ firstName `および ` lastName +`フィールドは、それぞれ「Sammy」「Shark」および「Gilly」「Glowfish」で埋められました。

これにより、MongoDBの両方のレコードがTransporterを介して正常に処理され、Elasticsearchにロードされたことが確認されます。 この基本的なパイプラインの上に構築するために、入力データを変換できる中間処理ステップを追加します。

ステップ4-トランスフォーマーの作成

名前が示すように、_transformers_は、シンクにロードする前にソースデータを変更します。 たとえば、新しいフィールドの追加、フィールドの削除、またはフィールドのデータの変更ができます。 Transporterには、いくつかの事前定義済みのトランスフォーマーと、カスタムトランスフォーマーのサポートが付属しています。

通常、カスタムトランスフォーマーはJavaScript関数として記述され、別のファイルに保存されます。 それらを使用するには、 `+ pipeline.js +`でトランスフォーマファイルへの参照を追加します。 Transporterには、OttoおよびGoja JavaScriptエンジンの両方が含まれています。 Gojaはより新しく、一般的に高速なので、ここで使用します。 唯一の機能的な違いは構文です。

「+ transform.js +」というファイルを作成します。このファイルを使用して、変換関数を記述します。

nano transform.js

ここで使用する関数は、 `+ fullName `という名前の新しいフィールドを作成します。その値は、スペースで区切られた( Sammy Shark のような) `)。

transform.js

function transform(msg) {
   msg.data.fullName = msg.data.firstName + " " + msg.data.lastName;
   return msg
}

このファイルの行を見ていきましょう。

  • ファイルの最初の行、「+ function transform(msg)、+」はhttps://www.digitalocean.com/community/tutorials/how-to-define-functions-in-javascript[function definition]です。

  • `+ msg +`はhttps://www.digitalocean.com/community/tutorials/understanding-data-types-in-javascript#objects[JavaScriptオブジェクト]であり、ソースドキュメントの詳細が含まれています。 このオブジェクトを使用して、https://www.digitalocean.com/community/tutorials/understanding-objects-in-javascript#accessing-object-properties [データにアクセス]パイプラインを通過します。

  • 関数の最初の行https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-javascript#string-concatenation[concatenates] 2つの既存のフィールドとhttps:// www .digitalocean.com / community / tutorials / understanding-objects-in-javascript#adding-and-modifying-object-properties [その値を割り当てる]を新しい「+ fullName +」フィールドに追加します。

  • 関数の最後の行は、パイプラインの残りが使用するために新しく変更された `+ msg +`オブジェクトを返します。

ファイルを保存して閉じます。

次に、このトランスフォーマーを使用するようにパイプラインを変更する必要があります。 編集のために `+ pipeline.js +`ファイルを開きます。

nano pipeline.js

最後の行では、次のように、 `+ Source()`と ` Save()`の呼び出し間のパイプラインにトランスフォーマーを追加するために、 ` Transform()+`関数の呼び出しを追加する必要があります。 :

〜/ transporter / pipeline.js

. . .
t.Source("source", source, "/.*/")

.Save("sink", sink, "/.*/")

`+ Transform()`に渡される引数は変換のタイプであり、この場合はGojaです。 ` goja +`関数を使用して、https://www.digitalocean.com/community/tutorials/basic-linux-navigation-and-file-management#moving-around-the-を使用してトランスフォーマーのファイル名を指定しますfile-with-quot-cd-quot [相対パス]。

ファイルを保存して閉じます。 パイプラインを再実行してトランスフォーマーをテストする前に、前のテストからElasticsearchの既存のデータを消去しましょう。

curl -XDELETE $ELASTICSEARCH_URI

コマンドの成功を確認するこの出力が表示されます。

Output{"acknowledged":true}

次に、パイプラインを再実行します。

transporter run pipeline.js

出力は前のテストと非常によく似ており、最後の数行でパイプラインが以前のように正常に完了したかどうかを確認できます。 確かに、Elasticsearchを再度チェックして、期待する形式でデータが存在するかどうかを確認できます。

curl $ELASTICSEARCH_URI/_search?pretty=true

新しい出力に「+ fullName +」フィールドが表示されます。

Output{
 "took" : 9,
 "timed_out" : false,
 "_shards" : {
   "total" : 5,
   "successful" : 5,
   "skipped" : 0,
   "failed" : 0
 },
 "hits" : {
   "total" : 2,
   "max_score" : 1.0,
   "hits" : [
     {
       "_index" : "my_application",
       "_type" : "users",
       "_id" : "5ac63e9c6687d9f638ced4fe",
       "_score" : 1.0,
       "_source" : {
         "firstName" : "Gilly",

         "lastName" : "Glowfish"
       }
     },
     {
       "_index" : "my_application",
       "_type" : "users",
       "_id" : "5ac63e986687d9f638ced4fd",
       "_score" : 1.0,
       "_source" : {
         "firstName" : "Sammy",

         "lastName" : "Shark"
       }
     }
   ]
 }
}

値が正しく設定された両方のドキュメントに「+ fullName +」フィールドが追加されていることに注意してください。 これで、Transporterパイプラインにカスタム変換を追加する方法がわかりました。

結論

MongoDBからElasticsearchにデータをコピーおよび変更するためのトランスフォーマーを備えた基本的なTransporterパイプラインを構築しました。 同じ方法でより複雑な変換を適用したり、同じパイプラインで複数の変換をチェーンしたりできます。 MongoDBとElasticsearchは、Transporterがサポートするアダプターの2つだけです。 また、フラットファイル、PostgresなどのSQLデータベース、および他の多くのデータソースもサポートしています。

GitHubのトランスポータープロジェクトをチェックして、APIの最新の変更を確認し、https://github.com/compose/transporter/wiki [theトランスポーターwiki]アダプター、トランスフォーマー、およびTransformerのその他の機能の使用方法に関する詳細情報。

前の投稿:Python 2 vs Python 3:実用的な考慮事項
次の投稿:Ubuntu 16.04でApacheのmod_rewriteを使用してURLを書き換える方法