Spark环境下如何从主节点访问远程工作节点的数据集?
问题解答
结论
不能成功查看。
原因分析
- 你在VM1上调用的是
createOrReplaceTempView()方法,创建的是会话级临时视图,仅对当前VM1上运行的Spark Session可见,既不会同步到其他Spark进程,也不属于global_temp系统库,你在VM2上查询global_temp.records本身就找不到对应视图。 - 就算你在VM1上改用
createGlobalTempView("records")创建全局临时视图,也只能在同一个Spark应用的不同会话中共享,VM1和VM2运行的是完全独立的Spark进程/应用,元数据完全隔离,还是无法跨节点访问。
可行实现方案
方案1:持久化到共享存储(最常用,适合一次性、临时数据共享)
在两台节点都能访问的共享存储(如本地网络部署的HDFS、NFS共享目录等)写入数据集,另一端读取即可。
VM1端执行代码:
// 写入共享存储,以Parquet格式为例,也可更换为csv、orc等格式 recordsDF.write.parquet("hdfs://你的共享存储地址/自定义路径/records.parquet");
VM2端执行代码:
// 直接从共享存储读取数据 Dataset<Row> sqlDF = spark.read.parquet("hdfs://你的共享存储地址/自定义路径/records.parquet"); sqlDF.show();
方案2:对接统一Hive元数据(适合长期、多应用共享的表)
给两台节点的Spark配置同一个Hive Metastore服务,将数据集保存为Hive表,两端均可直接通过表名访问。
VM1端执行代码:
// 保存为Hive表 recordsDF.write.saveAsTable("default.records");
VM2端执行代码:
Dataset<Row> sqlDF = spark.sql("SELECT * FROM default.records"); sqlDF.show();
方案3:通过Spark Thrift JDBC服务访问(适合直接SQL查询共享会话内数据)
在VM1上启动Spark Thrift Server服务,绑定对外可访问的IP端口,VM2通过JDBC协议连接该Thrift服务,即可共享VM1的Spark Session上下文,直接查询VM1创建的临时视图。
操作步骤:
- VM1启动Thrift服务:
$SPARK_HOME/sbin/start-thriftserver.sh --hiveconf hive.server2.thrift.bind.host=VM1的局域网IP - VM2通过JDBC连接串
jdbc:hive2://VM1的局域网IP:10000接入,执行SELECT * FROM records即可查询到VM1创建的临时视图数据。
内容的提问来源于stack exchange,提问作者Patrick Schulz
相关产品推荐
相关产品推荐

