Подтвердить что ты не робот

Как найти размер вспышки RDD/Dataframe?

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

Scala:

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

Spark:

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

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

4b9b3361

Ответ 1

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

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:  (Эта функция просто преобразует 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)

Ответ 2

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

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

Ответ 3

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

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

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

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

Например:

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)

Кажется, что искра ui также использовала то же самое из code

  • См. этот исходный вопрос SPARK-17019, который описывает...

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

  • На странице исполнителя программы Spark UI будет отображаться как использование памяти, так и куча памяти.
  • Запрос REST возвращает как память, так и кучу памяти.
  • Также эти два использования памяти могут быть получены программным путем из SparkListener.