Вот эскиз некоторого кода Scala 2.10 / Spark 1.6.3, который я запускаю:
def processText(df: DataFrame): DataFrame = {
df.select(col(firstCol), col(secondCol))
.as[(TypeA, TypeB)]
.mapPartitions(partitionFunc)
.map { case (a: TypeA, c: TypeC) => OutputCaseClass(a, b) }
.toDF().toDF(colNames: _*)
}
def partitionFunc(rows: Iterator[(TypeA, TypeB)]): Iterator[(TypeA, TypeC)] = {
def rowFunc(a: TypeA, b: TypeB): Option[(TypeA, TypeC)] = {
try {
val returnC = functionality(b)
Option(a, returnC)
} catch {
case e: Exception => println("Error Message")
None
}
}
rows.map((returnFunc _).tupled)
.flatten
}
partitionFunc
сопоставляется со всеми разделами. Каждая строка в разделе обрабатывается (его НЛП). Если есть какая-либо ошибка, ничего не возвращается, но генерируется сообщение об ошибке.
Как заполнитель, я просто вставил printnn в мой код. К моему удивлению, материал, отправленный в println, оказался на консоли, когда я выполнил это задание с помощью spark-submit.
Я хочу знать, как это происходит. Код выполняется на JVM на узле обработки. Как сообщение, отправленное в STDOUT на этом узле, попадает обратно в мастер и на консоль?
Тест выполнения выполнен с
spark-submit --class com.package.mainclass --master local[4] path/to/jarfile.jar