У меня есть новая установка spark 1.2.1 через кластер mapr, и во время тестирования я обнаружил, что он хорошо работает в локальном режиме, но в режимах пряжи он, похоже, не может получить доступ к переменным, даже если они транслируются. Чтобы быть точным, следующий тестовый код
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object JustSpark extends App {
val conf = new org.apache.spark.SparkConf().setAppName("SimpleApplication")
val sc = new SparkContext(conf)
val a = List(1,3,4,5,6)
val b = List("a","b","c")
val bBC= sc.broadcast(b)
val data = sc.parallelize(a)
val transform = data map ( t => { "hi" })
transform.take(3) foreach (println _)
val transformx2 = data map ( t => { bBC.value.size })
transformx2.take(3) foreach (println _)
//val transform2 = data map ( t => { b.size })
//transform2.take(3) foreach (println _)
}
работает в локальном режиме, но не работает в пряже. Точнее, оба метода, transform2
и transformx2
, не работают, и все они работают, если --master local[8]
.
Я компилирую его с помощью sbt и отправляю с помощью инструмента отправки.
/opt/mapr/spark/spark-1.2.1/bin/spark-submit --class JustSpark --master yarn target/scala-2.10/simulator_2.10-1.0.jar
Есть идеи, что происходит? В сообщении об ошибке просто утверждается, что есть исключение нулевого указателя java в том месте, где он должен обращаться к переменной. Есть ли другой способ передачи переменных внутри карт RDD?