Документы искры говорят, что
По умолчанию, когда Spark выполняет функцию параллельно как набор задач на разных узлах, он отправляет копию каждой переменной, используемой в функции, для каждой задачи.
Если я создам Java SimpleDateFormat
и использую его в операциях RDD, я получу исключение NumberFormatException: multiple points
.
Я знаю, что SimpleDateFormat
не является потокобезопасным. Но, как сказано в документации spark, этот объект SimpleDateFormat
копируется в каждую задачу, поэтому не должно быть нескольких потоков, обращающихся к этому объекту.
Я предполагаю, что все задачи в одном исполнителе используют один и тот же объект SimpleDateFormate
, я прав?
Эта программа печатает тот же объект java.text.SimpleDateFormat@f82ede60
object NormalVariable {
// create dateFormat here doesn't change
// val dateFormat = new SimpleDateFormat("yyyy.MM.dd")
def main(args: Array[String]) {
val dateFormat = new SimpleDateFormat("yyyy.MM.dd")
val conf = new SparkConf().setAppName("Spark Test").setMaster("local[*]")
val spark = new SparkContext(conf)
val dates = Array[String]("1999.09.09", "2000.09.09", "2001.09.09", "2002.09.09", "2003.09.09")
println(dateFormat)
val resultes = spark.parallelize(dates).map { i =>
println(dateFormat)
dateFormat.parse(i)
}.collect()
println(resultes.mkString(" "))
spark.stop()
}
}
SimpleDateFormat
- person maasg   schedule 23.03.2015SimpleDateFormat
внутри замыкания, чтобы решить эту проблему.SimpleDateFormat
использует изменяемый экземплярCalendar
внутри. Это замаскированное «изменчивое состояние». - person maasg   schedule 24.03.2015