如何使用Apache Livy在Spark中创建缓存上下文?
Apache Livy 缓存Spark上下文操作方案
Livy的持久化交互式会话本身就对应一个常驻的Spark上下文,只要会话不被销毁,所有提交到该会话的作业都会复用同一个Spark上下文,不需要每次重新初始化,完美匹配减少资源开销、提升提交效率的需求。
1. 创建可复用的缓存会话
通过POST接口创建交互式会话,配置足够长的超时时间避免自动回收,示例请求:
curl -X POST -H "Content-Type: application/json" http://<livy-server-host>:<port>/sessions -d '{ "kind": "pyspark", "name": "persistent-spark-ctx", "timeout": 86400, "conf": { "spark.executor.instances": 2, "spark.executor.memory": "4g", "spark.driver.memory": "2g" } }'
请求返回的id字段就是该会话的唯一标识,后续提交作业都使用这个ID即可。
2. 复用已有会话提交作业
不需要每次调用/sessions接口新建会话,直接向已有会话的/statements接口提交作业代码即可,示例:
curl -X POST -H "Content-Type: application/json" http://<livy-server-host>:<port>/sessions/<会话ID>/statements -d '{ "code": "df = spark.read.parquet(\"/path/to/data\")\ndf.show()" }'
3. 验证上下文复用效果
可以通过连续提交两段代码验证上下文是否共享:
- 第一次提交代码:
a = 100 - 第二次提交代码:
print(a)
如果第二次能正常输出100,说明两次作业复用了同一个Spark上下文,缓存生效。
注意事项
- 按需配置会话超时时间:如果需要会话长期常驻,可以修改Livy服务端的
livy.server.session.timeout配置,或者创建会话时指定更大的timeout参数,单位为秒 - 避免资源泄漏:常驻会话会持续占用分配的Spark资源,业务下线或者长时间不需要使用时,调用
DELETE /sessions/<会话ID>接口主动销毁会话释放资源 - 状态校验:提交作业前可调用
GET /sessions/<会话ID>接口查询会话状态,仅当状态为idle或running时可正常提交作业 - 业务隔离:不同业务线、不同权限的作业不要共用同一个会话,避免变量污染、权限越界问题
内容的提问来源于stack exchange,提问作者Abhisek Ray
相关产品推荐
相关产品推荐

