在同一主节点下的 Java 和 R Apps 之间共享 SparkContext



所以这是设置。

目前我初始化了两个 Spark 应用程序。我需要在它们之间传递数据(最好是通过共享的 sparkcontext/sqlcontext,这样我就可以查询临时表(。我目前使用镶木地板文件进行数据帧传输,但还有其他方法吗?

MasterURL 指向同一个 SparkMaster

通过终端启动Spark:

/opt/spark/sbin/start-master.sh; 
/opt/spark/sbin/start-slave.sh spark://`hostname`:7077

Java 应用程序设置:

JavaSparkContext context = new JavaSparkContext(conf);
//conf = setMaster(MasterURL), 6G memory, and 4 cores.
SQLContext sqlContext = new SQLContext(parentContext.sc());

然后我稍后注册一个现有帧

//existing dataframe to temptable
df.registerTempTable("table");

火花R

sc <- sparkR.init(master='MasterURL', sparkEnvir=list(spark.executor.memory='6G', spark.cores.max='4')
sqlContext <- sparkRSQL.init(sc)
# attempt to get temptable
df <- sql(sqlContext, "SELECT * FROM table"); # throws the error

我所知,鉴于您当前的配置,这是不可能的。使用 registerTempTable 创建的表绑定到已用于创建相应DataFrame的特定SQLContext。即使您的 Java 和 SparkR 应用程序使用相同的主节点,它们的驱动程序也在单独的 JVM 上运行,并且不能共享单个SQLContext

有一些工具,如Apache Zeppelin,它采用不同的方法,使用单个SQLContext(和SparkContext(暴露给单个后端。通过这种方式,您可以使用例如 Scala 注册表并从 Python 读取它。Zeppelin有一个分支,它为SparkR和R提供了一些支持。可以检查它如何启动和交互 R 后端。

相关内容

  • 没有找到相关文章

最新更新