J'ai un programme simple dans Spark:
/* SimpleApp.scala */
import org.Apache.spark.SparkContext
import org.Apache.spark.SparkContext._
import org.Apache.spark.SparkConf
object SimpleApp {
def main(args: Array[String]) {
val conf = new SparkConf().setMaster("spark://10.250.7.117:7077").setAppName("Simple Application").set("spark.cores.max","2")
val sc = new SparkContext(conf)
val ratingsFile = sc.textFile("hdfs://hostname:8020/user/hdfs/mydata/movieLens/ds_small/ratings.csv")
//first get the first 10 records
println("Getting the first 10 records: ")
ratingsFile.take(10)
//get the number of records in the movie ratings file
println("The number of records in the movie list are : ")
ratingsFile.count()
}
}
Lorsque j'essaie d'exécuter ce programme à partir du spark-Shell, c'est-à-dire que je me connecte au nœud de nom (installation Cloudera) et que je lance les commandes de manière séquentielle sur le spark-Shell:
val ratingsFile = sc.textFile("hdfs://hostname:8020/user/hdfs/mydata/movieLens/ds_small/ratings.csv")
println("Getting the first 10 records: ")
ratingsFile.take(10)
println("The number of records in the movie list are : ")
ratingsFile.count()
Les résultats sont corrects, mais si j'essaie d'exécuter le programme à partir d'Eclipse, aucune ressource n'est affectée au programme et, dans le journal de la console, tout ce que je vois est le suivant:
WARN TaskSchedulerImpl: le travail initial n'a accepté aucune ressource; vérifiez l'interface utilisateur de votre cluster pour vous assurer que les travailleurs sont enregistrés et disposent de ressources suffisantes
De plus, dans l'interface utilisateur de Spark, je vois ceci:
Le travail continue à courir - Spark
En outre, il convient de noter que cette version de spark a été installée avec Cloudera (par conséquent, aucun nœud de travail n’est affiché).
Que dois-je faire pour que cela fonctionne?
MODIFIER:
J'ai vérifié le serveur HistoryServer et ces travaux ne sont pas affichés (même dans les applications incomplètes)
J'ai configuré et optimisé les performances de nombreux clusters d'allumage. Il s'agit d'un message très commun/normal à voir lorsque vous préparez/configurez pour la première fois un cluster pour gérer vos charges de travail.
Cela est dû sans équivoque à l’insuffisance des ressources pour lancer le travail. Le travail demande l'un des:
Vous pouvez vérifier les cœurs de nœuds de travail de votre cluster: votre application ne peut pas dépasser cela. Par exemple, vous avez deux nœuds de travail. Et par nœud de travail, vous avez 4 cœurs. Ensuite, vous avez 2 applications à exécuter. Ainsi, vous pouvez attribuer à chaque application 4 cœurs pour exécuter le travail.
Vous pouvez définir comme ceci dans le code:
SparkConf sparkConf = new SparkConf().setAppName("JianSheJieDuan")
.set("spark.cores.max", "4");
Ça marche pour moi.
Enfin compris quelle est la réponse.
Lors du déploiement d'un programme d'étincelle sur un cluster YARN, l'URL principale est simplement du fil.
Donc, dans le programme, le contexte d'étincelle devrait ressembler à:
val conf = new SparkConf().setAppName("SimpleApp")
Ensuite, ce projet Eclipse doit être construit à l'aide de Maven et le fichier jar généré doit être déployé sur le cluster en le copiant dans le cluster, puis en exécutant la commande suivante.
spark-submit --master yarn --class "SimpleApp" Recommender_2-0.0.1-SNAPSHOT.jar
Cela signifie qu'exécuter directement depuis Eclipse ne fonctionnerait pas.
Il existe également des causes de ce même message d'erreur autres que celles publiées ici.
Pour un cluster spark-on-mesos
, assurez-vous que vous avez Java8 ou une version plus récente Java sur mesos slaves
.
Pour spark standalone
, assurez-vous que vous avez Java8
(ou plus récent) sur la workers
.