【问题标题】:Do JVMs create significant overhead in distributed/ parallel processing? [closed]JVM 是否会在分布式/并行处理中产生大量开销? [关闭]
【发布时间】:2019-06-06 22:09:53
【问题描述】:

如果分布式计算框架启动节点以运行 Java/Scala 操作,那么它必须在每个容器中包含 JVM。例如。每个 Map 和 Reduce 步骤都会产生自己的 JVM。

与为 Python 等语言创建容器相比,这种实例化的效率如何?是毫秒、几秒还是 30 秒的问题?在需要启动许多容器的 Kubernetes 等框架中,这笔成本是否会增加?

我听说,就像 Alpine Linux 只有几 MB 一样,有精简的 JVM,但仍然必须付出代价。然而,Scala 是 Spark 中的一等公民,而 MR 是用 Java 编写的。

【问题讨论】:

  • 我相信,如果没有确切定义“重大开销”是什么,这个问题将作为主要意见关闭。另外不要忘记,程序的性能并不是选择工具的唯一重要指标。否则,每个人仍然可能会用汇编语言编写代码,最多用 C 语言编写代码。
  • 你可以自己测试一下。拉取 openjdk 和 python:3 图像和时间 docker run python:3 python3 --versiondocker run openjdk java --version。 tldr:它并不像你想象的那么重要。
  • 我个人的经验是,您定义为 UDF 或映射到分区的任何函数在 Python 中的成本都将比在 Java/Scala 中高得多。事实上,正是出于这个原因,我领导了一个将我们的整个代码库从 pyspark 转换为 Scala 的团队;内存使用量正在用 pyspark 炸毁我们的集群。不要担心 JVM 本身的成本,而要担心 pyspark 跨集群序列化的成本。我断言 Scala 或 Java 会比 Python 更节省内存。

标签: java scala apache-spark kubernetes jvm


【解决方案1】:

Linux 容器技术使用分层文件系统,因此较大的容器映像通常不会产生大量的运行时开销,尽管您必须在第一次在节点上使用该映像时下载该映像,这可能会增加真正庞大的集群.一般来说,这通常不是一件值得担心的事情,除了众所周知的大多数 JVM 启动速度有点慢的问题。但是,Spark 并不会像您描述的那样为每个操作启动一个新容器。它创建了一组执行器容器(pod),用于整个 Spark 执行运行。

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 2019-03-11
    • 1970-01-01
    • 2019-05-12
    • 2011-01-02
    • 1970-01-01
    • 2015-07-05
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多