【发布时间】: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