2014-06-17 18 views
12

Spark's Python API'sini kullanıyorum ve Spark 0.8'i çalıştırıyorum.RDD'lerin dilimleri ve bölümleri arasındaki farklar nelerdir?

Büyük bir RDD kayan nokta vektörünü saklıyorum ve tüm vektöre karşı bir vektörün hesaplamalarını gerçekleştirmem gerekiyor.

RDD'deki dilimler ve bölümler arasında fark var mı?

RDD'yi oluşturduğumda, 100 değerini RDD'nin 100 dilimi olarak saklamasına ve hesaplamaları yaparken 100 görev oluşturmasına neden olan bir parametre olarak geçiriyorum. Verilerin bölüştürülmesinin, sistemin verileri daha verimli bir şekilde işlemesine olanak sağlayarak, dilimlemenin ötesinde performansı iyileştirip geliştirmeyeceğini (yani, bölümlenmiş RDD'deki her elemanın üzerinde çalışmasına karşı bir bölüm üzerinde işlemlerin gerçekleştirilmesi arasında bir fark var mıdır) bilmek istiyorum. Örneğin, bu iki kod parçası arasında önemli bir fark var mıdır?

rdd = sc.textFile(demo.txt, 100) 

rdd = sc.textFile(demo.txt) 
rdd.partitionBy(100) 
+1

http://stackoverflow.com/questions/23436640/what-is-the-different-between-an-rdd-partition-and-a-slice -in-apache-kıvılcım –

cevap

23

vs ben slices inanıyoruz ve partitions Apache Spark aynı şeydir. Ancak, gönderdiğiniz iki kod parçası arasında ince ancak potansiyel olarak önemli bir fark vardır.

Bu kod 100 eşzamanlı görevleri kullanılarak 100 bölümlere doğrudan demo.txt yüklemek için denemesi olacak: beklendiği gibi sıkıştırılmamış metni için

rdd = sc.textFile('demo.txt', 100) 

, işe yarayacak. Ancak, demo.txt yerine, demo.gz ürününüz varsa, yalnızca 1 bölümlü bir RDD ile sonuçlanacaksınız. Gzipli dosyalara karşı okurlar paralelleştirilemez. Öte yandan

, ilk bölümleri varsayılan numarası ile bir RDD içine demo.txt açılacak aşağıdaki kod, sonra açıkça boyutu kabaca eşittir 100 bölümleri içine veri bölümlerini yeniden olacaktır. Yani bu durumda
rdd = sc.textFile('demo.txt') 
rdd = rdd.repartition(100) 

, hatta bir demo.gz ile 100 bölümleri ile RDD ile sona erecek.

Bir yan not olarak, partitionBy()'u repartition() ile değiştirdim, çünkü aradığınıza inanıyorum. partitionBy(), RDD'nin bir RDD of tuples olmasını gerektirir. repartition(), Spark 0.8.0 sürümünden beri mevcut değil, bunun yerine coalesce(100, shuffle=True)'u kullanabilmeniz gerekir.

Spark, bir RDD'nin her bölümü için kümenizdeki çekirdek sayısına kadar 1 eşzamanlı görevi çalıştırabilir. Yani, 50 çekirdek içeren bir kümeniz varsa, RDD'larınızın en az 50 bölüm olmasını (ve muhtemelen 2-3x times that) olmasını istersiniz.

Spark 1.1.0 itibariyle aşağıdaki gibi bir RDD kaç bölümleri kontrol edebilirsiniz:

rdd.getNumPartitions() # Python API 
rdd.partitions.size  // Scala API 

1.1.0 öncesinde Python API ile Bunu yapmanın yolu rdd._jrdd.splits().size() oldu.

2

aşağıdaki şekilde bölümü yapabilirsiniz:

import org.apache.spark.Partitioner 

val p = new Partitioner() { 
    def numPartitions = 2 
    def getPartition(key: Any) = key.asInstanceOf[Int] 
} 
recordRDD.partitionBy(p) 
İlgili konular