在同一Master下的Java和R Apps之间共享SparkContext

所以这是设置。

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

MasterURL指向同一个SparkMaster

通过终端启动Spark:

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

Java App设置:

 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"); 

SparkR

 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的特定DataFrame 。 即使您的Java和SparkR应用程序使用相同的主服务器,它们的驱动程序也可以在不同的JVM上运行,并且不能共享单个SQLContext

有一些工具,比如Apache Zeppelin,它采用不同的方法,只有一个SQLContext (和SparkContext ),它暴露给各个后端。 这样你可以使用例如Scala注册表并从Python中读取它。 有一个Zeppelin的分支,为SparkR和R提供一些支持 。 您可以检查它的启动方式并与R后端进行交互 。