Apache Spark - 运行extermal exe或jar文件并行

时间:2015-03-15 09:49:12

标签: java parallel-processing apache-spark

我有.exe文件(我没有源文件,所以我将无法编辑程序)作为文件的参数路径进行处理,最后给出结果。例如,在控制台中,我运行以下程序:program.exe -file file_to_process [other_parametrs]。我还有jar可执行文件,它带有两个参数file_to_process和第二个文件[others_parameters]。在这两种情况下,我想将输入文件分成最小的部分并并行运行程序。有没有办法用Apache Spark Java框架高效地完成它。我是并行计算的新手,我读到了关于RDD和管道操作符但我不知道它是否会好我的情况因为我有文件的路径。

我将非常感谢一些帮助或提示。

2 个答案:

答案 0 :(得分:1)

我认为一般的答案是" no"。 Spark是一个框架,通常它管理非常具体的集群配置机制,改组自己的数据,读取大输入(基于HDFS),监视任务完成和重试以及执行有效计算。它不适合你有一个你可以触摸的程序并且需要来自本地文件系统的文件的情况。

我猜你可以将你的输入放在HDFS上,然后,因为Spark接受任意java / Scala代码,你可以使用你所拥有的任何语言设施转储到本地文件,启动一个进程(即this),然后构建一些复杂的逻辑来监视完成(可能基于输出的内容)。 mapPartitions() Spark方法最适合这种方法。

那就是说,我不推荐它。它将是丑陋的,复杂的,要求你弄乱节点和类似的东西的权限,并不会充分利用Spark的优势。

Spark非常适合您的问题,特别是如果您的文件的每一行都可以独立处理。我想看看是否有办法获得程序的代码,一个执行相同操作的库,或者算法是否足以重新实现。

可能不是你想要的答案: - (

答案 1 :(得分:1)

我最近遇到过类似的问题,我有一个使用spark 2.1.0的代码。基本的想法是,将你的exe及其依赖项(如dll)放入HDFS或本地,并使用addFiles将它们添加到驱动程序中,驱动程序也将它们复制到工作执行程序中。然后,您可以将文件作为RDD加载,并使用mapPartitionsWithIndex函数将每个分区保存到本地,并使用Process执行exe(使用SparkFiles.get从工作执行程序获取路径)到该分区。 希望有所帮助。