当我们写
时RDD.map(x => x + 1)
这对应于master
将发送给所有工作人员在其分区内执行的任务。
但我对这些魔法的细节很感兴趣。假设我们使用spark-submit
提交包含所有这些函数的jar。一旦这个jar提交给master
,主人如何理解并提取所有这些转换并将其发送给所有工人?它是否使用java的reflecton
机制?
为了举例,您可以制作一个简单的map
并使用例如akka
来做同样的魔术吗?
答案 0 :(得分:1)
组装的uber-JAR不是提交给主人,而是提交给spark-submit
脚本。此脚本确保JAR可用于主节点和所有工作节点,并且所有类路径都已正确设置。只有这样才能启动应用程序并启动主节点。反射在这里没有用,因为所有需要的类(包括在.map(x => x + 1)
中实现闭包的编译的匿名内部类)在JAR本身中都可用。当需要在map
中应用闭包时,master可以使用普通序列化来将闭包所依赖的值发送给worker。然后,工作人员将从JAR加载闭包代码,用反序列化闭包中的必要参数补充它,然后将闭包应用于RDD。
你当然可以使用Akka使用map
来实现rdd(这就是Spark所做的),但这并不完全是简单,至少不够简单以适应单个SO答案
交互式Spark repl与spark-submit
脚本完全不同,因为它必须在应用程序运行时编译新代码。