Как найти размер spark RDD/Dataframe?

Я знаю, как найти размер файла в Scala.Но как найти размер RDD / dataframe в spark?

Scala:

object Main extends App {
  val file = new java.io.File("hdfs://localhost:9000/samplefile.txt").toString()
  println(file.length)
}

Искра:

val distFile = sc.textFile(file)
println(distFile.length)

но если я его не получаю размер файла. Как найти размер RDD?

3 ответов


если вы просто хотите посчитать количество строк rdd, do:

val distFile = sc.textFile(file)
println(distFile.count)

если вас интересуют байты, вы можете использовать SizeEstimator:

import org.apache.spark.util.SizeEstimator
println(SizeEstimator.estimate(distFile))

https://spark.apache.org/docs/latest/api/java/org/apache/spark/util/SizeEstimator.html


Да, наконец, я получил решение. Включите эти библиотеки.

import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD
import org.apache.spark.rdd
import org.apache.spark.util.SizeEstimator

как найти размер RDD:

def calcRDDSize(rdd: RDD[String]): Long = {
  rdd.map(_.getBytes("UTF-8").length.toLong)
     .reduce(_+_) //add the sizes together
}

функция для поиска размера фрейма данных: (Эта функция просто преобразует DataFrame в RDD внутренне)

val dataFrame = sc.textFile(args(1)).toDF() // you can replace args(1) with any path

val rddOfDataframe = dataFrame.rdd.map(_.toString())

val size = calcRDDSize(rddOfDataframe)

ниже один путь отдельно от SizeEstimator.Я часто использую

чтобы узнать из кода о RDD, если он кэшируется, а точнее, сколько его разделов кэшируются в памяти и сколько кэшируются на диске? чтобы получить уровень хранения, также необходимо знать текущее фактическое состояние кэширования.знать потребление памяти.

контекст Spark имеет метод API разработчика getRDDStorageInfo () Иногда вы можете использовать это.

вернуться информация о том, какие RDDs кэшируются, если они находятся в mem или на диске, сколько места они занимают и т. д.

Например :

scala> sc.getRDDStorageInfo
       res3: Array[org.apache.spark.storage.RDDInfo] = 
       Array(RDD "HiveTableScan [name#0], (MetastoreRelation sparkdb, 
       firsttable, None), None " (3) StorageLevel: StorageLevel(false, true, false, true, 1);  CachedPartitions: 1;

TotalPartitions: 1; MemorySize: 256.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B)

кажется, что Spark ui также использовал то же самое из этого код

  • см. эту исходную проблему Искра-17019 что описывает...

описание
С SPARK-13992 Spark поддерживает сохранение данных в память вне кучи, но использование вне кучи в настоящее время не предоставляется, это не так удобно для пользователя, чтобы контролировать и профиль, так что здесь предложите выставить память вне кучи, а также использование памяти в кучи в различные места:

  1. страница исполнителя Spark UI отобразит память как в куче, так и вне кучи использование.
  2. запрос REST возвращает память как в куче, так и вне кучи.
  3. также Эти два использования памяти можно получить программно из SparkListener.