Искра: разница между аккумулятором и локальной переменной - PullRequest
0 голосов
/ 09 мая 2019

Исследуя аккумуляторы Spark, я попытался понять и продемонстрировать разницу между аккумулятором и обычной переменной в Spark. Но вывод не соответствует моим ожиданиям. Я имею в виду, что и аккумулятор, и счетчик имеют одинаковое значение в конце программы и могут читать аккумулятор в функции преобразования (согласно документу, только драйвер может читать аккумулятор). Я делаю что-то неправильно? Правильно ли мое понимание?

object Accmulators extends App {

  val spark = SparkSession.builder().appName("Accmulators").master("local[3]").getOrCreate()

  val cntAccum = spark.sparkContext.longAccumulator("counterAccum")

  val file = spark.sparkContext.textFile("resources/InputWithBlank")

  var counter = 0

  def countBlank(line:String):Array[String]={
    val trimmed = line.trim
    if(trimmed == "") {
      cntAccum.add(1)
      cntAccum.value //reading accumulator
      counter += 1
    }
    return line.split(" ")
  }

  file.flatMap(line => countBlank(line)).collect()

  println(cntAccum.value)

  println(counter)
}

Входной файл содержит текст с 9 пустыми строками между

4) Aggregations and Joins

5) Spark SQL

6) Spark App tuning

Выход:

И counter, и cntAccum дают одинаковый результат.

1 Ответ

1 голос
/ 09 мая 2019

counter локальная переменная может работать в вашей локальной программе .master("local[3]"), которая будет выполняться на драйвере.представьте, что вы работаете в режиме yarn.тогда вся логика будет работать распределенным образом, ваша локальная переменная не будет обновляться (так как ее локальная обновляется), но аккумулятор будет обновляться.так как его распределенная переменная.Предположим, что у вас есть 2 исполнителя, которые запускают программу ... один исполнитель обновится, а другой исполнитель сможет увидеть последнее значение.В этом случае ваш cntAccum способен получать последние значения от других исполнителей в режиме распределенной пряжи.где в качестве локальной переменной counter cant ...

, поскольку аккумуляторы считываются и записываются.см. здесь документы.

enter image description here

В образе exeutor id является localhost.если вы используете пряжу с 2-3 исполнителями, она покажет идентификаторы исполнителя.Надеюсь, что это помогает ..

...