Параллельные преобразования на 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
заявления должны быть напечатаны один за другим.