2015-07-14 18 views

cevap

9

o RDD boyutunu almak doğru değildir bahsettiniz. Bir tahminde bulunabiliriz.

Biz örnek büyüklüğünü elde etmek SizeEstimator kullanmak sonra RDD örneklemek ve edebilirsiniz. diyelim ki, çevrimdışı örneklenmiş boyut verilerine dayanarak Wang ve Justin de belirtildiği gibi, X satırlar çevrimdışı çalışma zamanında Z satırlar Z sürebilir Y GB kullanılan * Y/X GB

İşte

yardımcı olmak üzere örnek scala kodudur RDD'nin boyutu/tahmini.

Scala ve kıvılcım yeniyim. Numune daha iyi bir şekilde

def getTotalSize(rdd: RDD[Row]): Long = { 
    // This can be a parameter 
    val NO_OF_SAMPLE_ROWS = 10l; 
    val totalRows = rdd.count(); 
    var totalSize = 0l 
    if (totalRows > NO_OF_SAMPLE_ROWS) { 
    val sampleRDD = rdd.sample(true, NO_OF_SAMPLE_ROWS) 
    val sampleRDDSize = getRDDSize(sampleRDD) 
    totalSize = sampleRDDSize.*(totalRows)./(NO_OF_SAMPLE_ROWS) 
    } else { 
    // As the RDD is smaller than sample rows count, we can just calculate the total RDD size 
    totalSize = getRDDSize(rdd) 
    } 

    totalSize 
} 

def getRDDSize(rdd: RDD[Row]) : Long = { 
    var rddSize = 0l 
    val rows = rdd.collect() 
    for (i <- 0 until rows.length) { 
     rddSize += SizeEstimator.estimate(rows.apply(i).toSeq.map { value => value.asInstanceOf[AnyRef] }) 
    } 

    rddSize 
} 
+0

YARN RDD boyutunu nasıl alıyor? İşlerim var ve RDD boyutumun GB cinsinden tahminleri var, ancak bu bilgiye kıvılcım kodumun içinden erişemiyorum. –

+0

Üzgünüm, YARN'de Spark kullanmıyorum. Veritabanları kullanıyorum. – sag

+1

hakkında çok fazla şey bilmiyorum value.asInstanceOf [AnyRef] değerini daha iyi tahmin etmek için toString'i degerlendirdikten sonra value.toString değeri null olarak boş bir gösterici atabilir ve bu sorun yok gibi görünüyor. ayrıca daha güvenli. – lockwobr

3

Bu tür serileştirme gibi faktörlere bağlı olacak, bu yüzden kesme ve kuru değildir. Bununla birlikte, bir örnek set alabilir ve o örnek veriler üzerinde bazı deneyler yapabilirsiniz, oradan çıkarım.

+0

size öğelerin sayısını verecektir düşünüyorum İçinde dizeleri ile RDD var düşünün. Tüm RDD'yi yinelemeli ve boyutu almak için String.size() kullanmalı mıdır? – sag

7

Tek yalındır yolu tefrika formda veya değil veri depolamak isteyip bağlı olarak aşağıdakileri çağırmak, sonra UI "Depolama" sayfa kıvılcım gidin size toplam boyutunu anlamaya mümkün olmalıdır RDD (bellek + disk): çalışma zamanında doğru bellek boyutunu hesaplamak kolay değildir. Bununla birlikte, çalışma zamanında bir tahminde bulunmayı deneyebilirsiniz: Çevrimdışında örneklenen boyut verilerine dayanarak, X satırını Y GB çevrimdışı kullandığını, çalışma zamanında Z satırlarının Z * Y/X GB alabileceğini; Bu daha önce Justin'in önerdiği gibi.

Bu yardımcı olabilir umarım.

Justin ve Wang gibi
+0

Cevabınız için teşekkürler. Evet, bu boyutu bulmak için yardımcı olacaktır. Ama bunu benim boru hattı/kod yürütme sırasında kontrol etmek istiyorum. Bu yüzden Spark UI'de manuel olarak kontrol etmek benim için bir seçenek değil. – sag

+1

Çalışma zamanında doğru bellek boyutunu hesaplamanın kolay olmadığını düşünüyorum. Bununla birlikte, çalışma zamanında bir tahminde bulunmayı deneyebilirsiniz: Çevrimdışında örneklenen boyut verilerine dayanarak, X satırını Y GB çevrimdışı kullandığını, çalışma zamanında Z satırlarının Z * Y/X GB alabileceğini; Bu daha önce Justin'in önerdiği gibi. –

+0

Rastgele bir soru, rdd.cache() yaptığımda UI'de göremiyorum. Sadece bellek depolanmıyor mu? – zengr

6

yazılmış olabilir Aşağıda ben RDD.count() RDD

+2

Hello @Yiying olmalı ve StackOverflow'a hoş geldiniz. Poster sadece satır sayısını değil, RDD'nin boyutunu istiyor. Belki de cevabınızı genişleterek posterin daha fazla açıklama gerektirmemesini sağlayabilirsiniz. Yeterli bir itibarınız olduğunda, tercih ederseniz yorumları bırakabilirsiniz. – buruzaemon

+0

Soru, sözde boyut, bilgi birimlerinde (bayt) soruyor. Fakat 'say' aynı zamanda bir boyut ölçüsüdür - bu cevap soruyu gerçekten yanıtlamaz, fakat ideal bir cevap olarak ne olduğuna bilgi ekler. – ribamar

İlgili konular