2016-02-12 59 views
2

所以这里是设置。在Java和R应用程序之间使用同一个主机共享SparkContext

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

MasterURL指向同SparkMaster

开始星火:

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

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 

回答

2

据我所知,它给你的当前配置是不可能的。使用registerTempTable创建的表格绑定到特定的SQLContext,该表格用于创建相应的DataFrame。即使您的Java和SparkR应用程序使用相同的主控制器,其驱动程序也可以在单独的JVM上运行,并且不能共享单个SQLContext

有一些工具,如Apache Zeppelin,采用不同的方法处理单个SQLContext(和SparkContext),该工具暴露于单独的后端。这样您就可以使用Scala注册表并从Python读取它。有a fork of Zeppelin which provides some support for SparkR and R。你可以检查它是如何starts and interacts R backend

相关问题