【问题标题】:Apache Spark - run extermal exe or jar file parallelApache Spark - 并行运行外部 exe 或 jar 文件
【发布时间】:2015-05-17 12:44:40
【问题描述】:

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

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

【问题讨论】:

  • 恕我直言,除非您手头有集群,否则 Spark 可能会过分且缓慢。如果通过并行计算您的意思是使用单台机器的所有内核,我只会手动分区并启动多个进程。但总的来说,没有办法按原样回答您的问题。有太多“依赖”:输入的种类、如何分区、大小、集群可用性和大小、内存需求、算法种类等。
  • 为了测试,我将使用本地机器,但将来我想使用 Amazon EC2 云和集群。在文件中,我有独立的数据部分,可以单独处理。问题是文件可能非常大,即使在具有多核的本地机器上,计算持续时间也太长。有没有办法通过为每个文件提供不同的路径来拆分文件并并行运行它。
  • 将可执行作业分流到集群似乎对于像 Sun Grid Engine (SGE) 及其后代这样的排队系统来说是一项工作。亚马逊创建了CfnCluster 来管理他们云上的此类系统。

标签: java parallel-processing apache-spark


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    也就是说,我不会推荐它。这将是丑陋的、复杂的,需要你弄乱节点的权限和类似的东西,并且不能很好地利用 Spark 的优势。

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

    可能不是您正在寻找的答案:-(

    【讨论】:

    • 非常感谢。也许您知道 JavaRDD 如何与管道方法一起工作?该文件将默认为 64MB 部分的分区,之后它将每一行发送到 shell 命令或分区中的每一行作为一个部分。火花分裂线不可能吗?当我制作 JavaRDD 时,每个对象都将作为字节数组发送到外部进程?我必须重新实现一些方法?
    • Spark 将使用这种输入作为 Hadoop。默认不会分割线。查看spark.apache.org/docs/1.2.0/… 获取有关如何读取线条或对象的一些提示。你不需要重新实现方法,但是如果你想调整序列化,可以创建你自己的 InputTypes 来读写。
    • AFAIK,整个分区将通过管道传输到您的程序(因此,许多未中断的行)。您的程序可能需要支持管道(例如 grep),我不明白您的感觉。但在一天结束时,试一试!首先使用 grep 命令构建一个示例本地项目,然后从那里开始 :-)
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多