2014-03-25 6 views
11

Um die Entwicklung meiner Karte zu erleichtern Aufgaben reduzieren, die auf Hadoop läuft tatsächlich vor, um die Aufgaben zu Hadoop bereitstellen I-Test eine einfache Karte Minderer schrieb ich:Wie man einfache Spark-App von Eclipse/Intellij IDE ausführen?

object mapreduce { 
    import scala.collection.JavaConversions._ 

    val intermediate = new java.util.HashMap[String, java.util.List[Int]] 
                //> intermediate : java.util.HashMap[String,java.util.List[Int]] = {} 
    val result = new java.util.ArrayList[Int]  //> result : java.util.ArrayList[Int] = [] 

    def emitIntermediate(key: String, value: Int) { 
    if (!intermediate.containsKey(key)) { 
     intermediate.put(key, new java.util.ArrayList) 
    } 
    intermediate.get(key).add(value) 
    }            //> emitIntermediate: (key: String, value: Int)Unit 

    def emit(value: Int) { 
    println("value is " + value) 
    result.add(value) 
    }            //> emit: (value: Int)Unit 

    def execute(data: java.util.List[String], mapper: String => Unit, reducer: (String, java.util.List[Int]) => Unit) { 

    for (line <- data) { 
     mapper(line) 
    } 

    for (keyVal <- intermediate) { 
     reducer(keyVal._1, intermediate.get(keyVal._1)) 
    } 

    for (item <- result) { 
     println(item) 
    } 
    }            //> execute: (data: java.util.List[String], mapper: String => Unit, reducer: (St 
                //| ring, java.util.List[Int]) => Unit)Unit 

    def mapper(record: String) { 
    var jsonAttributes = com.nebhale.jsonpath.JsonPath.read("$", record, classOf[java.util.ArrayList[String]]) 
    println("jsonAttributes are " + jsonAttributes) 
    var key = jsonAttributes.get(0) 
    var value = jsonAttributes.get(1) 

    println("key is " + key) 
    var delims = "[ ]+"; 
    var words = value.split(delims); 
    for (w <- words) { 
     emitIntermediate(w, 1) 
    } 
    }            //> mapper: (record: String)Unit 

    def reducer(key: String, listOfValues: java.util.List[Int]) = { 
    var total = 0 
    for (value <- listOfValues) { 
     total += value; 
    } 

    emit(total) 
    }            //> reducer: (key: String, listOfValues: java.util.List[Int])Unit 
    var dataToProcess = new java.util.ArrayList[String] 
                //> dataToProcess : java.util.ArrayList[String] = [] 
    dataToProcess.add("[\"test1\" , \"test1 here is another test1 test1 \"]") 
                //> res0: Boolean = true 
    dataToProcess.add("[\"test2\" , \"test2 here is another test2 test1 \"]") 
                //> res1: Boolean = true 

    execute(dataToProcess, mapper, reducer)   //> jsonAttributes are [test1, test1 here is another test1 test1 ] 
                //| key is test1 
                //| jsonAttributes are [test2, test2 here is another test2 test1 ] 
                //| key is test2 
                //| value is 2 
                //| value is 2 
                //| value is 4 
                //| value is 2 
                //| value is 2 
                //| 2 
                //| 2 
                //| 4 
                //| 2 
                //| 2 


    for (keyValue <- intermediate) { 
     println(keyValue._1 + "->"+keyValue._2.size)//> another->2 
                //| is->2 
                //| test1->4 
                //| here->2 
                //| test2->2 
    } 


} 

Dies ermöglicht es mir meine mapreduce Aufgaben in meinem Eclipse laufen IDE unter Windows vor dem Bereitstellen auf dem tatsächlichen Hadoop-Cluster. Ich möchte etwas Ähnliches für Spark ausführen oder die Möglichkeit haben, Spark-Code aus Eclipse zu schreiben, um es vor der Bereitstellung im Spark-Cluster zu testen. Ist das mit Spark möglich? Da Spark auf Hadoop ausgeführt wird, bedeutet das, dass Spark nicht ausgeführt werden kann, ohne zuvor Hadoop installiert zu haben? Mit anderen Worten, kann ich den Code nur mit den Spark-Bibliotheken ausführen? :

import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 

object SimpleApp { 
    def main(args: Array[String]) { 
    val logFile = "$YOUR_SPARK_HOME/README.md" // Should be some file on your system 
    val sc = new SparkContext("local", "Simple App", "YOUR_SPARK_HOME", 
     List("target/scala-2.10/simple-project_2.10-1.0.jar")) 
    val logData = sc.textFile(logFile, 2).cache() 
    val numAs = logData.filter(line => line.contains("a")).count() 
    val numBs = logData.filter(line => line.contains("b")).count() 
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs)) 
    } 
} 

von https://spark.apache.org/docs/0.9.0/quick-start.html#a-standalone-app-in-scala

Wenn ja genommen, was die Spark-Bibliotheken, die ich in meinem Projekt gehören müssen, sind?

+1

[spark.apache.org] (https://spark.apache.org/downloads.html) zeigt spark-core_2.10, Version 0.9.0-Inkubation an. Ich würde damit beginnen, dass es Abhängigkeiten sind. Sie finden das [hier] (http://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10/0.9.0-inkubating) oder [hier] (http://search.maven.org/# durchsuchen | -183575761). Wenn Sie Ihr Projekt nicht mit einem Abhängigkeitsverwaltungs-Plugin erstellen, um Ihr Eclipse-Projekt zu erstellen, müssen Sie die Abhängigkeiten selbst herunterladen. Einer scheint Hadoop-Client zu sein. – n0741337

Antwort

2

folgendes zu Ihrem build.sbt libraryDependencies += "org.apache.spark" %% "spark-core" % "0.9.1" hinzufügen und sicherstellen, dass Ihr scalaVersion gesetzt (z. B. scalaVersion := "2.10.3")

Auch wenn Sie das Programm lokal nur laufen lassen, können Sie die letzten beiden Argumente zu SparkContext überspringen wie folgt val sc = new SparkContext("local", "Simple App")

Schließlich kann Spark auf Hadoop ausgeführt werden, kann aber auch im eigenständigen Modus ausgeführt werden. Siehe: https://spark.apache.org/docs/0.9.1/spark-standalone.html

+0

Sie müssten das Eclipse-Projekt auch mithilfe von sbteclipse neu generieren und möglicherweise das Projekt in Eclipse aktualisieren. –

+0

@IulianDragos Das ist ein ausgezeichneter Punkt. Vielen Dank. –

+5

Funktioniert das direkt? Müssen Sie nicht ein Glas verpacken und es an Spark-submit senden? – Neil