如何在jvm之间分配代码

时间:2018-04-03 14:00:37

标签: java scala jvm distributed-computing

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

bool[] array = new bool[4] { true, false, true, true } ;

这里,sc.parallelize(1 to 10).map(i => i+1).collect 被序列化,发送并执行所有工作人员。我想知道这是怎么做到的?

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

1 个答案:

答案 0 :(得分:1)

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

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

鉴于这种能力,你可以

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

classLoaders是分层的,如果classLoader找不到类,则会向其父级询问。这是默认层次结构:

  • bootStrap classLoader
  • 扩展名ClassLoader
  • 系统类路径类加载器。 system classpath

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