Java ApacheSpark-并行运行extermal exe或jar文件

Java ApacheSpark-并行运行extermal exe或jar文件,java,parallel-processing,apache-spark,Java,Parallel Processing,Apache Spark,我有.exe文件(我没有源文件,因此无法编辑程序),作为要处理的文件的参数路径,并最终给出结果。例如,在控制台中,我按如下方式运行此程序:program.exe-file file\u to\u process[其他参数]。我还有一个jar可执行文件,它接受两个参数file\u-to\u-process,第二个文件和[其他参数]。在这两种情况下,我都希望将输入文件分割成最小的部分,并并行运行程序。使用ApacheSparkJava框架是否有任何有效的方法。我是并行计算新手,我读过关于RDD和pi

我有.exe文件(我没有源文件,因此无法编辑程序),作为要处理的文件的参数路径,并最终给出结果。例如,在控制台中,我按如下方式运行此程序:
program.exe-file file\u to\u process[其他参数]
。我还有一个jar可执行文件,它接受两个参数
file\u-to\u-process
,第二个文件和
[其他参数]
。在这两种情况下,我都希望将输入文件分割成最小的部分,并并行运行程序。使用ApacheSparkJava框架是否有任何有效的方法。我是并行计算新手,我读过关于RDD和pipe操作符的书,但我不知道这对我来说是否合适,因为我有文件路径


我将非常感谢您的帮助或提示。

我想一般的答案是“不”。Spark是一个框架,一般来说,它管理非常特定的机制,用于集群配置、洗牌自己的数据、读取大输入(基于HDF)、监控任务完成和重试以及执行高效计算。它不太适合这样的情况,即您有一个无法触摸的程序,并且需要来自本地文件系统的文件

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

尽管如此,我不建议这样做。这将是丑陋的、复杂的,需要您处理节点上的权限和类似的事情,并且不会很好地利用Spark的优势

Spark非常适合解决这个问题,尤其是当文件的每一行都可以独立处理时。我想看看是否有办法获得程序的代码,是否有一个库可以实现同样的功能,或者该算法是否足够简单,可以重新实现


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

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

IMHO,除非你手头有一个集群,否则Spark可能会太慢。如果你说的并行计算是指使用一台机器的所有内核,我只会手动分区并启动多个进程。但总的来说,没有办法按原样回答你的问题。有太多的“依赖”:输入类型、如何分区、大小、群集可用性和大小、内存要求、算法类型等。测试时,我将使用本地计算机,但将来我希望使用带有群集的Amazon EC2云。在文件中,我有独立的数据部分,可以单独处理。问题是文件n可能非常大,即使在具有多个内核的本地计算机上,计算也会持续太长时间。是否有任何方法可以通过为每个文件指定不同的路径来拆分文件并并行运行它。将可执行作业分配到集群似乎是Sun Grid Engine(SGE)等排队系统的一项工作以及它的后代。Amazon是为了在他们的云上管理这样的系统而创建的。非常感谢。也许你知道JavaRDD是如何使用管道方法工作的吗?默认情况下,该文件将被划分为64MB的部分,在这之后,它将把每一行发送到shell命令或分区中的每一行作为一个部分。这不可能是spark分割行吗make JavaRDD每个对象都将以字节数组的形式发送到外部进程?我必须重新实现一些方法?Spark将使用Hadoop的输入类型。默认情况下不会拆分行。查看有关如何读取行或对象的一些提示。您不需要重新实现方法,但可以创建自己的输入类型,以便在需要时进行读写tweak serialization.AFAIK,一个完整的分区将通过管道传输到您的程序(因此,有许多未阻塞的行)。您的程序可能需要支持管道(例如grep),我不觉得您需要。但在一天结束时,请尝试一下!首先使用grep命令构建一个示例本地项目,然后从那里开始:-)