2014-09-05 3 views
12

Спарк, я новичок в Spark, поэтому я надеюсь на вашу помощь.Автономный искровой кластер. Невозможно отправить заявку программно -> java.io.InvalidClassException

Я пытаюсь запланировать простую работу на искровом кластере с моего ноутбука. Несмотря на это, когда я отправляю его с ./spark-submit, он генерирует исключение, когда я пытаюсь сделать это программно.

Окружающая среда: - Искра - 1 главный узел и 2 рабочих узла (автономный режим). Искра не была скомпилирована, но бинарные файлы были загружены. Spark version - 1.0.2 - java-версия «1.7.0_45» - Приложение jar находится везде (на клиенте и на рабочих узлах в одном и том же месте); - Файл README.md также копируется на каждый узел;

приложение Я пытаюсь запустить:

val logFile = "/user/vagrant/README.md" 

val conf = new SparkConf() 
conf.setMaster("spark://192.168.33.50:7077") 
conf.setAppName("Simple App") 
conf.setJars(List("file:///user/vagrant/spark-1.0.2-bin-hadoop1/bin/hello-apache-spark_2.10-1.0.0-SNAPSHOT.jar")) 
conf.setSparkHome("/user/vagrant/spark-1.0.2-bin-hadoop1") 

val sc = new SparkContext(conf) 

val logData = sc.textFile(logFile, 2).cache() 

...

Таким образом, проблема в том, что это приложение работает на кластере успешно, когда я делаю:

./spark-submit --class com.paycasso.SimpleApp --master spark://192.168.33.50:7077 --deploy-mode client file:///home/vagrant/spark-1.0.2-bin-hadoop1/bin/hello-apache-spark_2.10-1.0.0-SNAPSHOT.jar 

Но это не работает, когда я пытаюсь сделать то же самое программно, позвонив sbt run

Вот StackTrace, что я получаю на главном узле:

14/09/04 15:09:44 ERROR Remoting: org.apache.spark.deploy.ApplicationDescription; local class incompatible: stream classdesc serialVersionUID = -6451051318873184044, local class serialVersionUID = 583745679236071411 
java.io.InvalidClassException: org.apache.spark.deploy.ApplicationDescription; local class incompatible: stream classdesc serialVersionUID = -6451051318873184044, local class serialVersionUID = 583745679236071411 
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at akka.serialization.JavaSerializer$$anonfun$1.apply(Serializer.scala:136) 
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57) 
    at akka.serialization.JavaSerializer.fromBinary(Serializer.scala:136) 
    at akka.serialization.Serialization$$anonfun$deserialize$1.apply(Serialization.scala:104) 
    at scala.util.Try$.apply(Try.scala:161) 
    at akka.serialization.Serialization.deserialize(Serialization.scala:98) 
    at akka.remote.serialization.MessageContainerSerializer.fromBinary(MessageContainerSerializer.scala:58) 
    at akka.serialization.Serialization$$anonfun$deserialize$1.apply(Serialization.scala:104) 
    at scala.util.Try$.apply(Try.scala:161) 
    at akka.serialization.Serialization.deserialize(Serialization.scala:98) 
    at akka.remote.MessageSerializer$.deserialize(MessageSerializer.scala:23) 
    at akka.remote.DefaultMessageDispatcher.payload$lzycompute$1(Endpoint.scala:55) 
    at akka.remote.DefaultMessageDispatcher.payload$1(Endpoint.scala:55) 
    at akka.remote.DefaultMessageDispatcher.dispatch(Endpoint.scala:73) 
    at akka.remote.EndpointReader$$anonfun$receive$2.applyOrElse(Endpoint.scala:764) 
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:456) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237) 
    at akka.dispatch.Mailbox.run(Mailbox.scala:219) 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

Что может быть решением этой проблемы? Спасибо заранее.

+0

Вы пытались запустить его локально с 'sbt run'? –

+0

Спасибо, Татхагата, за вашу помощь. Да, я пробовал его локально с локальным [10] - он работает. Вот почему это выглядит очень странно, этот очень простой пример так сложно запускать в кластере –

+0

@ Dr.Khu: Я хотел бы сделать то же самое. вышеупомянутая программа вы подаете банку, чтобы исправить-представить? Я немного смущен. любезную помощь. – chaosguru

ответ

10

Потеряв много времени, я нашел проблему. Несмотря на то, что я не использовал hadoop/hdfs в своей заявке, дело с клиентом. Проблема заключалась в версии hadoop-client, она отличалась от версии хауопа, для которой была создана искра. Spark's hadoop version 1.2.1, но в моем приложении было 2.4.

Когда я изменил версию клиента hadoop на 1.2.1 в своем приложении, я могу выполнить искровой код на кластере.

+0

Нет, подождите, я не понимаю, что вы здесь делали. В вашем коде нигде не упоминается, какая версия клиентского приложения hasoop. Я столкнулся с той же проблемой, поэтому вам нужна ваша помощь. –

+0

Я имею в виду, что я использовал искру версии 1.0.2, предварительно построенный для Hadoop 1.x, но у меня 'build.sbt' была зависимость от Spark Core (' "org.apache.spark" %% " spark-core "%" 1.0.2 "') - исправить один - и hasoop client ('" org.apache.hadoop "%" hadoop-client "%" 2.4 "') - это было неправильно, потому что искра была построена для версии 1.x. Когда я изменил версию клиента hadoop с 2.4 до 1.2.1, это исключение прошло. –

+0

Я сделал то же самое с maven build of spark1.1.0 mvn -Dhadoop.version = 1.2.1 -DskipTests чистый пакет использовал указанную версию, но я продолжаю получать java.io.InvalidClassException: org.apache.spark.storage.BlockManagerId; работаю нормально при использовании искры submit .. пожалуйста, помогите – mithra

0

Вместо того, чтобы использовать библиотеку регулярного Спарка сердечника, вы можете использовать такую ​​зависимость (определенную в файле build.sbt):

resolvers += "Talend" at "https://talend-update.talend.com/nexus/content/repositories/libraries/" 
libraryDependencies += "org.talend.libraries" % "spark-assembly-1.6.0-hadoop2.6.0" % "6.0.0" 

/\ Той искровой сборки -... Hadoop ... librairies могут быть довольно большими (и, следовательно, несовместимы с нажатием Git).

List of Spark/Hadoop Libraries Hosted by Talend

0

Если вы используете скомпилированную искру. (Нет установки sbt или maven), убедитесь, что все рабочие узлы используют ту же версию искры. Я столкнулся с той же проблемой, что и один из рабочих узлов использовал другую версию искры. поддерживайте одни и те же версии во всех узлах, решив проблему для меня. Одна машина использовала искру-2.0.0 - bin-hadoop2.7 вместо spark-2.0.0-preview-bin-hadoop2.7

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