2016-05-02 1 views
1

Ich habe Funke im Standalone-Modus (einzelne Knoten in meinem Laptop), versucht zu integrieren opencv, um eine Reihe von Bildern aus einem Verzeichnis zu lesen und Gesichter in jedem zu erkennen Bild. Ich versuche zu verstehen, wie die nativen Abhängigkeiten an Executor jvm geliefert werden, ich hätte gedacht, dass in dem unten angegebenen Programm die System.loadLibrary-Funktion als Teil von Treiber jvm ausgeführt würde, und der Executor jvm würde fehlschlagen, wenn die anonyme Funktion versucht um die native Bibliothek zu finden. Aber entgegen meinem Verständnis funktioniert das Programm gut. Kann jemand erklären, wie das funktioniert und welcher Teil des Codes vom Treiber zum Executor geliefert wird?Apache spark mit nativen Abhängigkeiten - Treiber/Executor Code-Fluss im Standalone-Modus

public static void main(String[] args) 
{ 
    SparkConf conf = new SparkConf().setMaster("spark://localhost:7077").setAppName("Image detect App"); 
    JavaSparkContext sc = new JavaSparkContext(conf); 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

    CascadeClassifier faceDetector = new CascadeClassifier("/home/xx/Project/opencv-3.1.0/data/haarcascades_cuda/haarcascade_frontalface_alt.xml"); 

    File tempDir = new File("/home/xx/images/new"); 
    String tempDirName = tempDir.getAbsolutePath(); 

    JavaPairRDD<String, PortableDataStream> readRDD = sc.binaryFiles(tempDirName,3); 
    List<Tuple2<String, PortableDataStream>> result = readRDD.collect(); 
    for (Tuple2<String, PortableDataStream> res : result) 
    { 
     Mat image = Imgcodecs 
       .imread(res._1().replace("file:","")); 

     MatOfRect faceDetections = new MatOfRect(); 
     faceDetector.detectMultiScale(image, faceDetections); 

     for (Rect rect : faceDetections.toArray()) { 
      Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), 
        new Scalar(0, 255, 0)); 
     } 
     String filename = res._1().replace("file:","") + "_out"; 
     Imgcodecs.imwrite(filename, image); 
    } 

} Haben Sie ein Glas mit dem obigen Programm erstellt und lief die folgenden Zündbefehl einreichen, es funktioniert wie erwartet gut.

./bin/spark-submit --verbose --master funke: // localhost: 7077 --num-executors 2 --klasse com.xxx.MainSparkImage --jars/home/xx/Project/opencv- 3.1.0/release/bin/opencv-310.jar --driver-library-path /home/xx/Project/opencv-3.1.0/release/lib /home/xx/ImageProcess.jar

Dank Srivatsan

+0

spark.driver.extraClassPath spark.executor.extraClassPath haben Sie diese während des Sendens von Spark versucht? –

+0

Wird versuchen, spark.executor.extraClassPath, mit seinem Namen, sieht aus wie das sollte derjenige sein, die Abhängigkeiten an den Executor zu versenden. Danke vielmals. –

Antwort

4
List<Tuple2<String, PortableDataStream>> result = readRDD.collect(); 

Diese Zeile würde dazu führen, dass die RDD als lokale Sammlung zum Treiber zurückgesendet wird. Der Rest des Codes (for-Schleife) wird lokal innerhalb des Treibers ausgeführt. Daher sehen Sie keine Fehler im Zusammenhang mit fehlenden nativen Bibliotheken auf den Executoren.

+0

Hoppla ... danke, dass ich es entdeckt habe: -) ... Ich werde versuchen, nicht zu sammeln, sondern anonyme Funktion zu verwenden. werde überprüfen, ob ich diesmal einen Fehler bekomme –

+0

Ja Pranav richtig erkannt –

+0

Sie sind willkommen :-) –