所以这是设置。
目前我初始化了两个 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 后端。