如何在spark-shell中更新现有SparkSession或创建带ES配置的新实例?
嗨,我来帮你搞定这个问题!
首先得明确一点:SparkSession的配置是不可变的,所以没法直接修改spark-shell启动时自动创建好的那个默认spark实例的配置。不过有两个实用的办法能达到你的需求:
方法一:启动spark-shell时直接传入配置
如果还没启动spark-shell,最省事的方式就是在启动命令里通过--conf参数把Elasticsearch相关配置直接传进去,这样自动创建的spark实例就自带你要的所有配置了。命令示例如下:
spark-shell \ --conf "es.nodes=你的ES主机地址" \ --conf "es.port=你的ES端口" \ --conf "es.nodes.wan.only=true" \ --appName "Test"
启动后直接用默认的spark实例就行,完全符合你的配置要求。
方法二:在spark-shell内部创建新的SparkSession实例
如果已经进入spark-shell界面,不想重启的话,可以创建一个新的SparkSession实例(注意给它起个不一样的名字,比如esSpark),避免和默认的spark冲突。代码如下:
// 先定义你的ES主机和端口变量 val elasticHost = "你的ES主机地址" val elasticPort = "你的ES端口" // 创建新的SparkSession,继承原有实例的基础配置(比如集群信息) val esSpark = SparkSession.builder() .config(spark.sparkContext.getConf) .config("es.nodes", elasticHost) .config("es.port", elasticPort) .config("es.nodes.wan.only", "true") .appName("Test") .getOrCreate()
这里通过spark.sparkContext.getConf继承了默认实例的基础配置(比如集群资源、环境参数等),再叠加你需要的ES专属配置,新实例就能完美适配你的需求。
小提醒:
- 默认的
spark实例依然可以正常使用,如果你不需要它了,可以调用spark.stop()关闭,但一般情况下没必要这么做。 - 后续操作直接用你新建的
esSpark实例即可。
内容的提问来源于stack exchange,提问作者Markus




