【问题标题】:How to distribute code between jvm [closed]如何在 jvm 之间分发代码 [关闭]
【发布时间】:2018-04-03 14:00:36
【问题描述】:

一些分布式计算引擎,例如 Spark 或 Flink,能够在计算机和 jvm 之间分发代码,例如(在 scala 中使用 spark):

sc.parallelize(1 to 10).map(i => i+1).collect

在这里,i => i+1 被序列化、发送并在所有工作人员上执行。我想知道这是怎么做到的?

如果有人能指出一些现有分布式计算框架(如 Spark/Flink)中与此问题相关的源代码(类),我将不胜感激

【问题讨论】:

  • 据我所知,RMI可能是Java提供的工具
  • 在我的搜索中使用“RMI”我发现了这个问题stackoverflow.com/q/36461299/1206998 哪个答案有评论说没有使用RMI(过时且太慢):-\
  • 有几票接近。你能评论一下吗?我尽量做到精确,我只是添加了一个可能的实际示例来说明我期望完成的操作。但我根本不知道它是如何工作的,所以我可能没有合适的词
  • 我编辑了问题以使其更准确

标签: java scala jvm distributed-computing


【解决方案1】:

编辑:此答案是在更新标记为“太宽泛”的问题之前完成的。

代码是从它的类中加载的,类是通过 ClassLoader 加载的,每次创建线程时,您都可以在启动之前设置新的 classLoader。

鉴于这种能力,你可以

  • 只需下载 jars 并创建一个新的 UrlClassLoader 访问磁盘上的这些 jars。
  • 创建自定义类加载器以在运行时加载特定类(从网络或其他...)
  • 使用任何允许热代码加载的技术:OSGI 就是其中之一。

类加载器是分层的,如果你的类加载器没有找到一个类,它会被问到它的父类。这是默认层次结构:

  • bootStrap 类加载器
  • 扩展类加载器
  • 系统类路径类加载器。 系统类路径

应用服务器(如 tomcat glassfish 或 wildfly)为每个加载的 EAR 或 WAR 添加一个 ClassLoader,允许动态加载应用程序。

【讨论】:

  • 您解释了如何分发编译后的代码/jar。但这不是我的意思。我正在寻找的是如何分发“实时”代码。 String code = serialize(new MyTrait{ ... }) 之类的,发送它,然后在另一个 jvm 上发送 MyTrait t = deserialize(code)
  • 不明白,你要热编译还是distubute本地编译类?加载的类具有字节码,您需要该字节码来创建类。还有字节码生成器,但这是一个更普遍的问题
  • 我不确定该使用哪个词,但我想分发“本地编译的类”是可以的。首先,分发一个“本地编译的函数”会很好
  • java中没有函数的概念,只有包含方法的类,不能分开。并且不要忘记所有内容都已编译。所以所有的问题是你想通过网络发送什么?数据?=> 经典序列化(JSON,二进制,其他),源代码?=> 需要编译,编译后的Class?=> 我已经解释过的过程
  • 简单地说,在 spark 中,在 scala 中写作,你可以做到sc.parallelize(1 to 1000).map(i => i+1).collectparallelize 将分发数据,地图将发送函数i => i+1 并在分发的数据上执行它。所以在其他jvm上。我想了解它是如何进行代码分发的。对于这个例子,它不分发 jar
猜你喜欢
  • 2021-10-15
  • 2020-02-24
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多