2017-08-06 5 views
1

J'essaie de passer de la configuration de mon application spark à l'utilisation de Spark v1 à v2. En v1, j'utiliserais Spark Context et Spark Config pour initialiser. Cependant, selon la dernière documentation de Spark v2 (Guide de démarrage rapide), je devrais utiliser Spark Session et il est suggéré que la config soit transmise depuis cmd en utilisant spark-submit (tout ce que j'ai mentionné est affiché au bas de cette page : https://spark.apache.org/docs/latest/quick-start.html). Ci-dessous est mon application, avec le Spark Session stuff (v2) commenté, montrant comment je courrais des choses pour la v1. Si je l'exécute comme ceci, je reçois l'erreur «Échec de l'initialisation de Spark Context». Ensuite, si je réorganise mon commentaire pour exécuter des choses pour Spark Session (v2), et l'exécuter en empaquetant l'application en tant que JAR et en utilisant spark-submit dans cmd (selon le même guide que précédemment cité), j'obtiens l'erreur : "Impossible de charger la classe principale à partir du fichier JAR:/C: /"Exécution de l'application Spark pour v1 vs v2

Je modifie ma variable SPARK_HOME pour pointer vers les versions correctes, et je passe à la version appropriée dans le fichier de construction.

C'est l'application:

import org.apache.spark.{SparkContext, SparkConf} 
import org.apache.spark.sql.SparkSession 

object Pack { 
    def main(args: Array[String]) { 

    val conf = new SparkConf().setMaster("local[*]").setAppName("Pack") 
    .set("spark.executor.memory", "2g") 
    val sc = new SparkContext(conf) 

    /* val spark = SparkSession.builder.appName("PackTest").getOrCreate() */ 

    val logFile = "C:/Spark/spark-2.2.0-bin-hadoop2.7/bin/README.md" 

    val logData = sc.textFile(logFile).cache() 
    /* val logData = spark.read.textFile(logFile).cache() */ 

    val numAs = logData.filter(line => line.contains("a")).count() 
    val numBs = logData.filter(line => line.contains("b")).count() 
    println(s"Lines with a: $numAs, Lines with b: $numBs") 

    /* spark.stop() */ 
    } 
} 

Ceci est le fichier de construction de SBT:

name := "Pack" 

version := "1.0" 

scalaVersion := "2.11.8" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1" /* 2.2.0 
when trying sparksession */ 

libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.1" /* 2.2.0 
when trying sparksession */ 
+0

Essayez d'utiliser% fourni sur les dépendances d'étincelles – aclokay

+0

La première partie du problème avait une solution simple: assurez-vous que le dossier dans lequel se trouve l'application est défini en tant que dossier src (Intellij). Alors que, trie l'approche v1. Cependant, je reçois toujours la même erreur "ne peut pas charger la classe ..." en essayant de courir en utilisant spark-submit sur cmd. ... J'ai aussi ajouté% "fourni" sur les dépendances d'étincelles. –

Répondre

1

Ok, résolu. La solution à v1 est déjà mentionnée dans mon commentaire. Pour v2, je suivais le guide de démarrage rapide à la lettre, sauf pour cette chose: Il a fallu déplacer la classe dans un dossier src appelé «scala» au lieu de «scala-2.11» (Intellij) . J'ai également effectué une reconstruction, mais je ne sais pas si cela a eu un effet.

Cela semble trivial, mais cela a résolu le problème.