2016-03-30 25 views
0

Spark v.1.6.0'da aslında çeşitli işlevleri bir araya getiren bir scala uygulaması oluşturdum. Belirli girişler için bir veri çerçevesini taramak için kodum var, bir dataframe üzerinde belirli bir hesaplamayı yapan bir kodum var, bir çıktı oluşturmak için kodum var, vb.Paralel boru hattı nasıl yapılır?

Şu anda bileşenler 'statik olarak', yani, kodum, bir hesaplama yaparak bir bileşen X kodunu çağırıyorum, sonuçta elde edilen verileri alıyorum ve verileri girdi olarak alan bir Y bileşenini çağırıyorum.

Bunu daha esnek hale getirmek istiyorum, bir kullanıcı sadece bir boru hattı (muhtemelen paralel yürütme ile bir tane) belirtmelidir. Ben iş akışları aşağıdaki resimdeki gibi, oldukça küçük ve basit olduğu varsayılabilir:

exemplary workflow

Ancak, ben en iyi bu sorunu yaklaşım nasıl bilmiyorum.

    Herhalde ve muhtemelen bazı hatalar da ...
  • Apache Kıvılcım ML paketinde bir Pipeline sınıfla geldiğini gördük oldukça işe neden olacaktır bütün boru hattı mantığı kendim inşa edebileceğini
  • , ancak, doğru bir şekilde anladığım takdirde paralel yürütmeyi desteklemiyor (örneğin, iki ParquetReader, verileri aynı anda okuyabildiği ve işleyebildiği örnekte)
  • , tam olarak bunu yapabilecek Luigi project görünürdür (ancak Luigi'nin uzun süredir devam eden iş akışları için olduğu, kısa süreli iş akışlarına ihtiyaç duyduğum sayfa, Luigi aşırı olabilir mi?)?

Spark'de iş/veri akışı oluşturmak için neler önerirsiniz?

cevap

1

Spark'un MLlib boru hattı işlevini kullanmasını öneririm. Bununla ilgili güzel bir şey de Spark'un sizin için akışı optimize etmesine izin vermesidir.

İki Parke dosyasını paralel olarak okuyamayacağından bahsetmişsinizdir, ancak her ayrı dosyayı dağıtılmış şekilde okuyabilir. Dolayısıyla, N/2 düğümleri her dosyayı ayrı ayrı işlemekten ziyade, N düğümleri bunları seri halinde işleyebilir, bu da size benzer bir çalışma zamanı vermeyi beklerdi, özellikle de y-c ile eşleme 1'e 1 ise. Temel olarak, Spark'in kaynaklarınızı yetersiz kılması konusunda endişelenmeniz gerekmez (verileriniz doğru şekilde bölümlenmişse).

Ama aslında her şey daha iyi olabilir, çünkü Spark, akışınızı optimize etmekten daha akıllıdır. Akılda tutulması gereken önemli bir şey de Spark'in, sizin de tanımladığınız gibi, tam olarak bu şekilde ve ayrı adımlarda hiçbir şey yapamayacağıdır: y-c'u hesapladığınızda bunu hemen yapmazsınız. Bu, tembeldir (iyi bir şekilde!) Ve tüm akışı oluşturup cevaplar için sorduğunuza kadar bekler, bu noktada akışı analiz eder, optimizasyonlar uygular (örneğin, bir ihtimal, bunu çözebilmesinin mümkün olduğunu gösterir). Parquet dosyalarının birini veya her ikisini de, özellikle partition discovery ile okumak ve işlemek zorundadır, ve ancak son planı yürütür.

+0

Kodunuzu gerçekten optimize etmenin iyi bir yoludur. Ancak, burada ücretsiz öğle yemeği yok! Kıvılcım borularını süper paralel olarak optimize etmek için kullanmıyorum. Tahminci olarak lojistik regresyon ile basit bir çapraz doğrulama boru hattı için, 4 EC2 üzerinde 3 slave'in CPU kullanımı% 50'nin altındadır. Harika değil! Ancak her şey RAM'de önbellektir. Bunu nasıl optimize edeceğimi araştırıyorum. – Boris