2015-08-04 17 views
9

Biz birkaç iş hesaplamak için yarn-client gibi bir Spark küme kullanmak, ama bazen bir görev çok uzun süre çalıştırmak: Biz zaman aşımı set yok ama varsayılan zaman aşımı bir kıvılcım görevi olmadığını düşünüyorumİplik istemcisinde çok uzun süren işlerle (işteki diğer işlerle karşılaştırıldığında) nasıl baş edilir?

enter image description here

Burada çok uzun (1,7h).

Herkes bu sorunu çözmek için bana bir ideal verir ??

+0

Belki de bunun neden olduğunu anlamaya biraz zaman ayırmak ve bundan kaçınmak isteyip istemediğini görmek iyidir. Çoğu zaman, bu bölümleme, anahtarlar arasında eşit olarak dengelenmediği için olur. Bazı tuşlar, birkaç değere ve bazılarının devasa değerlere sahip olmasına neden olur. – hveiga

cevap

13

Çok uzun sürüyorsa, kıvılcım görevlerini öldürmenin bir yolu yoktur.

Ama speculation kullanarak bu işlemek için bir yolunu, bir veya daha fazla görevler aşamada yavaş çalışıyor, bu demektir

, onlar yeniden başlatılacak.

spark.speculation     true 
spark.speculation.multiplier  2 
spark.speculation.quantile   0 

Not: spark.speculation.quantile ilk görevden devreye girer "spekülasyon" anlamına gelir. Bu yüzden dikkatli kullanın. Bunu kullanıyorum çünkü zamanla GC nedeniyle bazı işler yavaşladı. Bu yüzden bunu ne zaman kullanacağınızı bilmelisiniz - gümüş bir kurşun değil.

Bazı alakalı linkler: http://apache-spark-user-list.1001560.n3.nabble.com/Does-Spark-always-wait-for-stragglers-to-finish-running-td14298.html ve http://mail-archives.us.apache.org/mod_mbox/spark-user/201506.mbox/%[email protected].com%3E

Güncelleme

benim soruna yönelik bir düzeltme (herkes için işe yaramayabilir) bulundu. Görev başına bir grup simülasyon yaptım, bu yüzden koşunun etrafında zaman aşımı ekledim. Bir simülasyon daha uzun sürüyorsa (bu spesifik çalışma için bir veri çarpıklığı nedeniyle), zaman aşımı olacaktır.

ExecutorService executor = Executors.newCachedThreadPool(); 
Callable<SimResult> task =() -> simulator.run(); 

Future<SimResult> future = executor.submit(task); 
try { 
    result = future.get(1, TimeUnit.MINUTES); 
} catch (TimeoutException ex) { 
    future.cancel(true); 
    SPARKLOG.info("Task timed out"); 
} 

Eğer simulator 'in ana döngü gibi içeri bir kesme kolu emin olun:

if(Thread.currentThread().isInterrupted()){ 
    throw new InterruptedException(); 
} 
0

burada hüner işçisi düğüme doğrudan giriş ve süreci öldürmek. Genellikle, top, ps ve grep birleşimiyle rahatsız edici süreci bulabilirsiniz. Sonra sadece bir kill pid yapın.

İlgili konular