2015-10-03 2 views
3

Я получаю NPE, пытаясь объединиться и спасти RDD.Spark NullPointerException с saveAsTextFile

Код работает локально, и работает с кластером в оболочке scala, но выдает ошибку при отправке ее в качестве задания в кластер.

Я попытался распечатать с помощью take(), чтобы увидеть, содержит ли rdd некоторые нулевые данные, но это вызывает ту же ошибку - боль, потому что она работает нормально в оболочке.

Я сохраняю в HDFS и имею полный путь URL-адреса в переменной - модель экономит этот метод на этапе подготовки MLLib.

Любые идеи высоко оценены!

Scala Код (цельная Предсказание Func):

//Load the Random Forest 
val rfModel = RandomForestModel.load(sc, modelPath) 

//Make the predictions - Here the label is the unique ID of the point 
val rfPreds = labDistVect.map(p => (p.label, rfModel.predict(p.features))) 


//Collect and save 
println("Done Modelling, now saving preds") 
val outP = rfPreds.coalesce(1,true).saveAsTextFile(outPreds) 
println("Done Modelling, now saving coords") 
val outC = coords.coalesce(1,true).saveAsTextFile(outCoords) 

Трассировка стека:

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 6.0 failed 4 times, most recent failure: Lost task 0.3 in stage 6.0 (TID 40, XX.XX.XX.XX): java.lang.NullPointerException 
    at GeoDistPredict1$$anonfun$38.apply(GeoDist1.scala:340) 
    at GeoDistPredict1$$anonfun$38.apply(GeoDist1.scala:340) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$$anon$10.next(Iterator.scala:312) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:727) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48) 
+1

Что находится в 'GeoDist1.scala: 340'? – Kenney

+0

'val rfPreds = labDistVect.map (p => (p.label, rfModel.predict (p.features)))' – Dusted

+1

Проверьте, нет ли точки, не имеющей функций. – eliasah

ответ

5

Спарк операции разделены на ленивых преобразований и действий.

ленивого преобразование на RDD выполняется, когда действия вызываются на RDD.
Итак, когда вы выполняете преобразование, оно просто сохраняется как операция, которую нужно выполнить.

Метод saveAsTextFile является действием, в то время как операция карты является преобразованием.

Если на этапе трансформации есть какая-либо проблема, она будет отображаться как проблема на шаге уровня действия, на котором было вызвано преобразование.

Таким образом, у вас может возникнуть проблема во время операции с картой, в которой в каком-либо поле есть нулевое значение, которое, скорее всего, вызывает проблему с NPE.

+1

Добавляя к этому ответу следующее: объединение одного раздела не является хорошей идеей или хорошей практикой, поскольку вы пытаетесь переместить все свои данные в один раздел, который будет перегружать драйвер и может вызвать проблему OOME. – eliasah

+1

Хорошо спасибо, я посмотрю на них и вернусь - думаю, я все еще немного не уверен, почему работает кластерная оболочка, - думал, что эти операции будут иметь те же ленивые и раскол действия? – Dusted

+1

@ С учетом предоставленной информации мы по-прежнему не можем ответить, почему она работает в оболочке, а не в режиме кластера. Вам нужно будет предоставить дополнительную информацию о том, как вы отправляете свое приложение, конфигурацию кластера и т. Д. – eliasah

Смежные вопросы