Параллельные преобразования на RDD в функции foreachDD Spark DStream

В следующем коде представляется, что функции fn1 и fn2 применяются к inRDD последовательно, как я вижу в разделе "Этапы" веб-интерфейса Spark.

 DstreamRDD1.foreachRDD(new VoidFunction<JavaRDD<String>>()
 { 
     public void call(JavaRDD<String> inRDD)
        {
          inRDD.foreach(fn1)
          inRDD.foreach(fn2)
        }
 }

Чем отличается, когда потоковое задание запускается таким образом. Работают ли нижеуказанные функции параллельно на входном Dstream?

DStreamRDD1.foreachRDD(fn1)
DStreamRDD2.foreachRDD(fn2)

1 ответ

Решение

И то и другое foreach на RDD а также foreachRDD на DStream будет выполняться последовательно, потому что они являются выходными преобразованиями, то есть они вызывают материализацию графа. Это не относится к любым обычным ленивым преобразованиям в Spark, которые могут выполняться параллельно, когда график выполнения расходится на несколько отдельных этапов.

Например:

dStream: DStream[String] = ???
val first = dStream.filter(x => x.contains("h"))
val second = dStream.filter(x => !x.contains("h"))

first.print()
second.print()

Первая часть не должна выполняться последовательно, когда у вас достаточно ресурсов кластера для параллельного выполнения базовых этапов. Затем, позвонив count, который снова является выходным преобразованием, приведет к print заявления должны быть напечатаны один за другим.

Другие вопросы по тегам