在同一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后端进行交互 。