Birkaç paralel kabuk işini nasıl çalıştırabilirim ve hepsini bir kerede nasıl izleyebilirim?


3

Bunları filtrelemek ve dönüştürmek için çok sayıda programa aktarmam gereken çok sayıda büyük dosyam (her biri yüzlerce MB) var. Birden fazla CPU çekirdeğinden faydalanıyorum, böylece her dosyada aynı borunun birkaç örneğini çalıştırıyorum (yüz çekirdeğe kadar olabilir ve ssh'yi borunun bir parçası olarak kullanabiliriz; Cevap). Her boruyu izlemek istiyorum ve bunun için kullanıyorum pv. İşte sahip olduklarımın minimal bir örneği:

$ pv file-001.gz | gunzip | xz > file-001.xz
1.58GB 0:00:02 [ 713MB/s] [=================================>] 100%

Gerçekte, ssh üzerinden diğer makinelere veri aktarmak ve bu makinelerdeki filtreler aracılığıyla borulamak dahil olmak üzere boruda başka birçok şey de yapıyorum, ancak boru her zaman ana bilgisayardaki yeni bir dosyaya yeniden yönlendirmeyle sonuçlanacaktı. Ayrıca, borudaki hiçbir aşama tüm veri setini gerektirmez; satır satır veya öbek bazında çalışabilirler.

Şu anda borunun her bir örneği için ayrı bir terminal penceresine ihtiyacım var. Tek yapmak istediğim tek bir uçbirim / kabuktaki borunun paralel örneklerini başlatmak ve her bir pv örneğindeki çıktısını kendi hattında almak. Bunun gibi bir şey:

1.48GB 0:00:54 [ 704MB/s] [===============================>  ]  97% ETA 00:00:06
1.58GB 0:01:00 [ 713MB/s] [=================================>] 100%
0.75GB 0:00:31 [ 709MB/s] [================>                 ]  50% ETA 00:00:29

N'nin değeri, bir terminal penceresine sığabileceğim satır sayısıdır, örneğin 3-50. İlerleme raporunun tam biçimi, hız, yapılan yüzde, geçen süre ve tahmini kalan süreyi kapsadığı sürece önemli değildir. Benim kullanmam da önemli değil pv, başka bir programı kolayca kurabildiğim sürece ya da sadece düz bir kabuk (bash, tercihen) kullanabildiğimde sorun değil. Yine de önemli olan, bir nedenden dolayı borunun bir kısmının çarpması durumunda yöntemin ara sıra kesilmiş olan boruyu idare edebilmesidir. Her iş bittiğinde (başarılı ya da değil) yeni işlere başlamak istiyorum ve hala işlenmemiş dosyalar kalıyor.

Bunun nasıl yapılacağı hakkında bir fikriniz var mı?

GNU Parallel'i zaten denediğimi unutmayın , ancak ssh özellikleri, her bir giriş dosyasının önce uzak ana bilgisayara aktarıldığını, sonra işlendiğini, ardından sonucun geri aktarıldığını, söz konusu veri miktarı nedeniyle kaçınmak istediğimi varsaydığını gösteriyor. ve her işlem düğümü üzerindeki sınırlı miktarda alan.

Yanıtlar:


4

Eğer baktın mı --pipeGNU Parallel için?

cat bigfiles* | pv | parallel --pipe -S server1,server2 'cat | process_pipe'

(vurgu için kedi dahil)

Varsayılan olarak --block ile ayarlanabilen 1 MB blok boyutundadır.

- 1-1 yazışma için düzenleme -

Yukarıdakilere göre, bunun gibi 1-1 yazışma alabilirsiniz:

parallel --eta "cat {} | parallel --pipe -S server1,server2 'cat | process_pipe' > {}.out" ::: bigfiles*

(vurgu için kedi dahil)

İçsel paralel, kardeşleri hakkında bir şey bilmeyeceğinden ve sunucu1'de sunucu2'den daha fazla ortaya çıkabileceğinden, bu oldukça uygun değildir. Bunu engellemenin bir yolu, dış paralelde -j1'dir, ancak iç tarafta yalnızca ilk sunucu için yeterli blok varsa, bu ideal olmaz. Başka bir deyişle: İş yükünüzü mükemmel bir şekilde dengelemek için biraz bunlarla uğraşmak zorunda kalabilirsiniz - belki de --load -% 100 veya benzerini kullanın.

--- düzenleme: Çarpışmalarla mücadele ---

Hata process_pipedöndürürse, komut 2 kez daha denenmelidir:

parallel --retries 3 --eta "cat {} | parallel --pipe -S server1,server2 'cat | process_pipe' > {}.out" ::: bigfiles*

GNU Parallel'i gerçekten seviyorum, ancak bu özel görev için nasıl kullanılacağını bulamadım. Soruda kastedilen, her borunun girdi akışını işleyebilmesi ve hepsini-tümünü-hepsini-tümünü-tümünü yapması gerekmiyordu. Ancak, farklı dosyalardan parçaları karıştıramam. Bir giriş dosyası, bir işleme borusu ve nihai sonuç dosyası arasında birebir yazışmalar yapmam gerekiyor (ve bu gibi birkaç seferde aynı anda çalışmam gerekiyor). Fakat her durumda bunun için + 1, çünkü bu gereksinime sahip olmasaydım, bu GNU Parallel örneği güzel çalışırdı.
Fabian Fagerholm

3

Bunun nasıl yapılacağı hakkında bir fikriniz var mı?

Yok hayır.

pv, istediğinizi yapmanıza olanak sağlayan -c ve -N seçeneklerine sahiptir

$ pv -cN source access.log | gzip | pv -cN gzip > access.log.gz
source:  760MB 0:00:15 [37.4MB/s] [=>     ] 19% ETA 0:01:02
  gzip: 34.5MB 0:00:15 [1.74MB/s] [  <=>  ]

ancak bu özelliğin birden fazla boru hattına nasıl uygulandığını göremiyorum


Ancak, pv'nin man sayfasına bakarsanız, bunu göreceksiniz.

          (tar cf - . \
           | pv -n -s $(du -sb . | awk '{print $1}') \
           | gzip -9 > out.tgz) 2>&1 \
          | dialog --gauge 'Progress' 7 70

Böylece, bir dizi küçük pencerede ilerlemeyi görmek kabul edilebilir olduğu sürece, bir dizi görevi paralel olarak yürütmek için bunu genişletebilirsiniz. Xdialog'u denerdim.

Şu anda, borunun her bir örneği için ayrı bir terminal penceresine ihtiyacım var

Asıl nokta, etkileşimli olarak birçok terminal penceresi açmanızın gerekmediği, bir komut dosyası için çok sayıda iletişim kutusu açabileceğiniz olabilir.



Açılan iletişim kutularını otomatikleştirmek için öneri için +1.
Fabian Fagerholm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.