Comment puis-je trouver la taille D'un RDD
J'ai RDD[Row]
, qui doit être conservé dans un référentiel tiers.
Mais ce référentiel tiers accepte un maximum de 5 Mo en un seul appel.
Je veux donc créer une partition en fonction de la taille des données présentes dans RDD et non en fonction du nombre de lignes présentes dans RDD.
Comment puis-je trouver la taille d'un RDD
et créer des partitions en fonction?
4 réponses
Comme Justin et Wang l'ont mentionné, il n'est pas simple d'obtenir la taille de RDD. On peut tout simplement faire une estimation.
On peut déguster un RDD et ensuite utiliser SizeEstimator pour obtenir la taille de l'échantillon. Comme Wang et Justin l'ont mentionné, sur la base des données de taille échantillonnées hors ligne, par exemple, X lignes utilisées Y GB hors ligne, les lignes Z à l'exécution peuvent prendre Z * Y / X GB
Voici l'exemple de code scala pour obtenir la taille / estimation d'un RDD.
Je suis nouveau à scala et spark. Ci-dessous l'échantillon peut être écrit dans un meilleure façon
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
}
Un moyen simple est d'appeler suivant, selon que vous voulez stocker vos données sous forme sérialisée ou non, puis allez à la page spark UI "Storage", vous devriez être capable de comprendre la taille totale du RDD (mémoire + disque):
rdd.persist(StorageLevel.MEMORY_AND_DISK)
or
rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)
Il n'est pas facile de calculer la taille précise de la mémoire au moment de l'exécution. Vous pouvez essayer de faire une estimation à l'exécution: sur la base des données de taille échantillonnées hors ligne, disons, x lignes utilisées Y GB hors ligne, Z lignes à l'exécution peuvent prendre Z * Y / X GB; ceci est similaire à Justin a suggéré plus tôt.
J'espère que cela pourrait aider.
Je pense que RDD.count() vous donnera le nombre d'éléments dans le RDD
Cela va dépendre de facteurs tels que la sérialisation, donc il n'est pas coupé et sec. Cependant, vous pouvez prendre un ensemble d'échantillons et effectuer des expériences sur ces données d'échantillon, en extrapolant à partir de là.