Ubuntu'da Transporter ile MongoDB'den Elasticsearch'e Dönüştürülen Verileri Eşitleme 16.04

Giriş

Transporter, farklı veri depoları arasında veri taşımak için açık kaynaklı bir araçtır. Geliştiriciler genellikle veritabanları arasında veri taşımak, verileri bir veritabanına taşımak ya da tam tersini yapmak gibi işlemler için tek seferlik komut dosyaları yazarlar, ancak Transporter gibi bir aracın çeşitli avantajları vardır.

Transporter'da, bir kaynaktan (verilerin okunduğu yerde) veri akışını bir veri havuzuna (verilerin yazıldığı yere) tanımlayan boru hatları oluşturursunuz. Kaynaklar ve havuzlar SQL veya NoSQL veritabanları, düz dosyalar veya diğer kaynaklar olabilir. Transporter, bu kaynaklarla iletişim kurmak için takılabilir eklentileri olan bağdaştırıcıları kullanır ve proje varsayılan olarak popüler veritabanları için birkaç bağdaştırıcı içerir.

Transporter, hareketli veriye ek olarak, bir transformatör kullanarak bir boru hattından geçerken verileri değiştirmenize de olanak tanır. Adaptörler gibi, varsayılan olarak birkaç tane transformatör vardır. Verilerinizin değiştirilmesini özelleştirmek için kendi transformatörlerinizi de yazabilirsiniz.

Bu derste, MongoDB veritabanından Transporter'ın yerleşik adaptörlerini ve JavaScript'te yazılmış özel bir transformatörü kullanarak Elasticsearch'e veri taşıma ve işleme örneği vereceğiz.

Ön şartlar

Bu eğiticiyi takip etmek için ihtiyacınız olacak:

  • Bir Ubuntu 16.04 sunucusu, bu Ubuntu 16.04 ilk sunucu kurulum eğiticisini takip ederek, bir sudo root kullanıcısı ve bir güvenlik duvarı da dahil olmak üzere kuruldu.
  • MongoDB, Ubuntu 16.04 dersinde veya mevcut bir MongoDB kurulumunda bu MongoDB'yi takip ederek kuruldu.
  • Elasticsearch, bu Elastics Search'ü Ubuntu 16.04 eğitimini veya mevcut bir Elasticsearch yüklemesini izleyerek yüklendi.

Taşıyıcı boru hatları JavaScript ile yazılmıştır. Bu eğiticiyi takip etmek için önceden herhangi bir JavaScript bilgisine veya deneyimine ihtiyacınız olmayacak, ancak bu JavaScript öğreticilerinde daha fazla bilgi edinebilirsiniz.

Adım 1 – Taşıyıcıyı Takma

Taşıyıcı en yaygın işletim sistemleri için ikili sağlar. Ubuntu için kurulum süreci iki adımı içerir: Linux binary'sini indirmek ve çalıştırılabilir hale getirmek.

Öncelikle, Transporter'ın GitHub'daki en son sürümleri sayfasından en son sürümün bağlantısını edinin. -linux-amd64 ile -linux-amd64 bağlantıyı kopyalayın. Bu eğitim yazının en yeni sürümü olan v0.5.2'yi kullanır.

İkiliyi ev dizininize indirin.

  • CD
  • https://github.com/compose/transporter/releases/download/v0.5.2/transporter-0.5.2-linux-amd64

/usr/local/bin veya tercih ettiğiniz kurulum dizinine taşıyın.

  • mv taşıyıcısı - * - linux-amd64 / usr / local / bin / transporter

Ardından çalıştırılabilir hale getirin, böylece çalıştırabilirsiniz.

  • chmod + x / usr / yerel / bin / taşıyıcı

Taşıyıcıyı ikili çalıştırarak doğru şekilde ayarlandığını test edebilirsiniz.

  • taşıyıcı

Kullanım yardımı çıktısını ve sürüm numarasını görürsünüz:

OutputUSAGE
transporter <command> [flags]

COMMANDS
run run pipeline loaded from a file
. . .

VERSION
0.5.2

Taşıyıcıyı MongoDB'den Elasticsearch'e taşımak için kullanmak için iki şeye ihtiyacımız var: MongoDB'de taşımak istediğimiz veriler ve Transporter'a nasıl hareket edeceğini söyleyen bir boru hattı. Bir sonraki adımda bazı örnek veriler oluşturulur, ancak taşımak istediğiniz bir MongoDB veritabanınız varsa, bir sonraki adıma geçip doğrudan 3. adıma geçebilirsiniz.

Adım 2 – MongoDB'ye Örnek Veri Ekleme (İsteğe Bağlı)

Bu adımda, MongoDB'de tek bir koleksiyona sahip bir örnek veritabanı oluşturacağız ve bu koleksiyona birkaç belge ekleyeceğiz. Daha sonra, öğreticinin geri kalanında, geçişi kullanacağız ve bu örnek verileri bir Taşıyıcı boru hattı ile değiştireceğiz.

İlk önce MongoDB veritabanınıza bağlanın.

  • Mongo

Bu, MongoDB kabuğunu kullandığınızı gösteren komut isteminizi mongo> değiştirecektir.

Buradan, üzerinde çalışmak için bir veritabanı seçin. Bizim my_application .

  • my_application kullan

MongoDB , açıkça bir veritabanı veya koleksiyon oluşturmanıza gerek yoktur. Adına seçtiğiniz bir veritabanına veri eklemeye başladığınızda, bu veritabanı otomatik olarak oluşturulacaktır.

Bu nedenle, my_application veritabanını oluşturmak için users koleksiyonuna iki belge kaydedin: biri Sammy Shark'u temsil eden ve bir tanesi Gilly Glowfish'i temsil eden. Bu bizim test verilerimiz olacak.

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

Belgeleri ekledikten sonra, kayıtlarınızı görmek için users koleksiyonunu sorgulayabilirsiniz.

  • db.users.find () oldukça (.);

Çıkış aşağıdaki çıktıya benzer görünecektir, ancak _id sütunları farklı olacaktır. MongoDB, bir koleksiyondaki belgeleri benzersiz şekilde tanımlamak için nesne kimliklerini otomatik olarak ekler.

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

MongoDB kabuğundan çıkmak için CTRL+C tuşlarına basın.

Daha sonra, bu verileri MongoDB'den Elasticsearch'e taşımak için bir Transporter boru hattı oluşturalım.

Adım 3 – Temel Boru Hattı Oluşturma

Transporter'daki bir pipeline.js , varsayılan olarak pipeline.js adında bir JavaScript dosyası tarafından tanımlanır. init komutu, bir kaynak ve havuz verildiğinde doğru dizinde temel bir yapılandırma dosyası oluşturur.

Başlangıç ​​olarak bir başlangıç pipeline.js kaynağını MongoDB ve kaynak olarak Elasticsearch olarak başlatın.

  • transporter init mongodb elasticsearch

Aşağıdaki çıktıyı göreceksiniz:

OutputWriting pipeline.js...

Bu adım için pipeline.js değiştirmeniz gerekmeyecek, ancak nasıl çalıştığını görmek için bir göz atalım.

Dosya buna benzer, ancak dosyanın içeriğini cat pipeline.js , less pipeline.js ( q düğmesine basarak less ) veya en sevdiğiniz metin düzenleyicisiyle açarak da görüntüleyebilirsiniz.

pipeline.jsvar 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 ve var sink ile başlayan satırlar sırasıyla MongoDB ve Elasticsearch bağdaştırıcıları için JavaScript değişkenlerini tanımlar. Bu adımda bu adaptörlerin daha sonra ihtiyaç duyacağı MONGODB_URI ve ELASTICSEARCH_URI ortam değişkenlerini tanımlayacağız.

// ile başlayan satırlar yorumlar. Boru hattınız için belirleyebileceğiniz bazı ortak yapılandırma seçeneklerine dikkat çekiyorlar, ancak biz bunları burada oluşturduğumuz temel boru hattı için kullanmıyoruz.

Son satır kaynağı ve havuzu birleştirir. Değişken transporter veya t , boru hattımıza erişmemizi sağlar. Kaynak eklemek ve dosyada daha önce tanımlanan source ve sink değişkenlerini kullanarak batmak için .Source() ve .Save() işlevlerini kullanırız.

Source() ve Save() işlevlerinin üçüncü argümanı namespace. alanıdır namespace. Son argüman olarak /.*/ , tüm verileri /.*/ ve /.*/ aynı ad alanı altında kaydetmek istediğimiz anlamına gelir.

Bu boru hattını çalıştırmadan önce MongoDB URI ve Elasticsearch URI için ortam değişkenlerini ayarlamamız gerekiyor. Kullandığımız örnekte, her ikisi de varsayılan olarak yerel ayarlarla barındırılıyor, ancak mevcut MongoDB veya Elasticsearch örneklerini kullanıyorsanız bu seçenekleri özelleştirdiğinizden emin olun.

  • export MONGODB_URI = 'mongodb: // localhost / my_application'
  • ELASTICSEARCH_URI dışa aktarma = 'http: // localhost: 9200 / my_application'

Şimdi boru hattını çalıştırmaya hazırız.

  • transporter run pipeline.js

Bu şekilde sonuçlanan çıktı görürsünüz:

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

İkinci ve üçüncü son satırlarda bu çıktı, kaynakta 2 kayıt bulunduğunu ve 2 kaydın lavaboya taşındığını gösterir.

Kayıtların her ikisi de işlendiğini onaylamak için, şimdi var olan my_application veritabanının içeriği için my_application .

  • curl $ ELASTICSEARCH_URI / _search? pretty = true

?pretty=true parametresi, çıktının okunmasını daha kolay hale getirir:

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'deki veritabanları ve koleksiyonlar, Elasticsearch'teki endekslere ve türlere benzer. Bunu düşünerek şunu görmelisiniz:

  • _index ayarlı alan my_application, orijinal MongoDB veritabanının adı).
  • users, ayarlanan _type alanı, MongoDB koleksiyonunun adı.
  • Sırasıyla "Sammy" "Shark" ve "Gilly" "Glowfish" ile doldurulmuş firstName ve lastName alanları.

Bu, MongoDB'den gelen kayıtların Transporter aracılığıyla başarılı bir şekilde işlendiğini ve Elasticsearch'e yüklendiğini doğrulamaktadır. Bu temel boru hattını inşa etmek için, giriş verilerini dönüştürebilecek bir ara işlem adımı ekleyeceğiz.

Adım 4 – Bir Dönüşüm Ekleme

İsminden de anlaşılacağı gibi, transformatörler kaynak verisini lavaboya yüklemeden önce değiştirirler. Örneğin, yeni bir alan eklemenize, bir alanı kaldırmanıza veya bir alanın verilerini değiştirmenize izin verir. Taşıyıcı önceden tanımlanmış bazı transformatörlerin yanı sıra özel olanlar için destek ile birlikte gelir.

Tipik olarak, özel transformatörler ayrı bir dosyada kaydedilmiş JavaScript fonksiyonları olarak yazılır. Bunları kullanmak için pipeline.js transformatör dosyasına bir referans eklersiniz. Taşıyıcı hem Otto hem de Goja JavaScript motorlarını içerir. Goja daha yeni ve genel olarak daha hızlı olduğu için burada kullanacağız. Tek fonksiyonel farklılık sözdizimi.

Dönüşüm işlevimizi yazmak için kullanacağımız transform.js adlı bir dosya oluşturun.

  • nano transform.js

İşte adlandırılan yeni bir alan yaratacak kullanacağımız fonksiyon, var fullName olacak değeri olan, firstName ve lastName (gibi bir boşlukla ayrılmış birlikte birleştirilmiş alanlar, Sammy Shark ).

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

Bu dosyanın satırlarından geçelim:

  • Dosyanın ilk satırı, function transform(msg), işlev tanımlamasıdır.
  • msg , kaynak belgenin ayrıntılarını içeren bir JavaScript nesnesidir. Bu nesneyi boru hattından geçen verilere erişmek için kullanıyoruz.
  • Fonksiyonun ilk satırı mevcut iki alanı birleştirir ve bu değeri yeni fullName alanına atar.
  • Fonksiyonun son satırı, kullanılacak boru hattının geri kalanı için yeni değiştirilmiş msg nesnesini döndürür.

Dosyayı kaydedin ve kapatın.

Daha sonra, bu trafoyu kullanmak için boru hattını değiştirmeliyiz. Düzenlemek için pipeline.js dosyasını açın.

  • nano pipeline.js

Son satırda, Transform() aşağıdaki gibi Source() ve Save() çağrıları arasındaki boru hattına eklemek için Transform() işlevine bir çağrı eklemeliyiz:

~/transporter/pipeline.js. . .
t.Source("source", source, "/.*/")
.Transform(goja({"filename": "transform.js"}))
.Save("sink", sink, "/.*/")

Transform() geçen argüman, bu durumda Goja olan dönüşüm türüdür. goja işlevini kullanarak, transformatörün dosya goja göreceli yolunu kullanarak belirtiriz.

Dosyayı kaydedin ve kapatın. Trafoyu test etmek için boru hattını tekrar çalıştırmadan önce, Elastics Search'teki mevcut verileri önceki testten temizleyelim.

  • curl -XDELETE $ ELASTICSEARCH_URI

Komutun başarısını kabul eden bu çıkışı göreceksiniz.

Output{"acknowledged":true}

Şimdi boru hattını tekrar çalıştırın.

  • transporter run pipeline.js

Çıktı önceki teste çok benzeyecek ve son birkaç satırda boru hattının daha önce olduğu gibi başarılı bir şekilde tamamlanıp tamamlanmadığını görebilirsiniz. Emin olmak gerekirse, verilerin beklediğimiz formatta olup olmadığını görmek için Elastics Search'ü tekrar kontrol edebiliriz.

  • curl $ ELASTICSEARCH_URI / _search? pretty = true

fullName alanını yeni çıktıda görebilirsiniz:

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",
"fullName" : "Gilly Glowfish",
"lastName" : "Glowfish"
}
},
{
"_index" : "my_application",
"_type" : "users",
"_id" : "5ac63e986687d9f638ced4fd",
"_score" : 1.0,
"_source" : {
"firstName" : "Sammy",
"fullName" : "Sammy Shark",
"lastName" : "Shark"
}
}
]
}
}

Hem belgelerde hem de değerlerinde eklenen fullName alanına dikkat edin. Bununla, şimdi bir Transporter boru hattına nasıl özel dönüşümler ekleyeceğimizi biliyoruz.

Sonuç

MongoDB'den Elasticsearch'e veri kopyalamak ve değiştirmek için bir transformatör ile temel bir Transporter boru hattı inşa ettiniz. Aynı şekilde daha karmaşık dönüşümler uygulayabilir, aynı boru hattında çoklu dönüşümleri zincirleyebilir ve daha fazlasını yapabilirsiniz. MongoDB ve Elasticsearch, Transporter desteklerinden sadece ikisidir. Ayrıca düz dosyaları, Postgres gibi SQL veritabanlarını ve diğer birçok veri kaynağını destekler.

AP'deki son değişikliklerden haberdar olmak için GitHub'daki Transporter projesine göz atabilir ve adaptörlerin, transformatörlerin ve Transformer'in diğer özelliklerinin nasıl kullanılacağı hakkında daha ayrıntılı bilgi için Transporter wiki sayfasını ziyaret edebilirsiniz.

Bir önceki yazımız olan Laravel Live UK başlıklı makalemizi de okumanızı öneririz.

About This Author

Comments are closed

%d blogcu bunu beğendi: