【问题标题】:Apache spark using native dependencies - driver/executor code flow in standalone mode使用本机依赖项的 Apache spark - 独立模式下的驱动程序/执行程序代码流
【发布时间】:2016-05-02 13:53:27
【问题描述】:

我在独立模式下设置了 spark(我的笔记本电脑中的单个节点),尝试集成 opencv 以从目录中读取一组图像并检测每个图像中的人脸。我试图了解如何将本机依赖项发送到执行程序 jvm,我原以为在下面给出的程序中,System.loadLibrary 函数将作为驱动程序 jvm 的一部分执行,并且当匿名函数尝试时执行程序 jvm 将失败找到本机库。但与我的理解相反,该程序运行良好。有人可以解释这是如何工作的,以及从驱动程序发送到执行程序的代码的哪一部分。

 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);
    } 

} 使用上述程序创建了一个 jar 并运行了以下 spark 提交命令,它可以正常工作。

./bin/spark-submit --verbose --master spark://localhost:7077 --num-executors 2 --class 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

谢谢 斯里瓦桑

【问题讨论】:

  • spark.driver.extraClassPath spark.executor.extraClassPath 你在spark提交期间试过这些吗?
  • 将尝试 spark.executor.extraClassPath,按照它的名字,看起来应该是将依赖项发送给执行程序的那个。非常感谢。

标签: java opencv apache-spark


【解决方案1】:
List<Tuple2<String, PortableDataStream>> result = readRDD.collect(); 

此行将导致 RDD 作为本地集合被收集回驱动程序。其余代码(for 循环)在驱动程序中本地执行。因此,您不会在执行程序上看到与缺少本机库相关的任何错误。

【讨论】:

  • 哎呀...感谢您发现它:-)...我会尽量不使用收集,而是使用匿名函数。这次会检查我是否收到错误
  • 是的,当它们在匿名函数中被引用时,我可以看到本地依赖错误。当 LD_LIBRARY_PATH 设置为 /home/xx/Project/opencv-3.1.0/release/lib(在 sbin/spark-config.sh 中)时,链接错误消失了,感谢您的帮助。顺便说一句,尝试设置 spark.executor.extraClassPath 和 spark.executor.extraLibraryPath,但它们似乎没有解决我的链接问题,我没有找到任何关于使用这两个参数 w.r.t 原生依赖项的好的参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2016-01-25
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多