生产环境部署Spark项目时如何读取db.properties等配置文件?
生产环境Spark读取配置文件的正确方式
问题根源
你碰到的FileNotFoundException,核心问题是调用SparkFiles.get()时传入了完整HDFS路径——通过--files参数分发到节点的配置文件,在本地临时目录里只保留文件名,不需要带路径。另外你同时使用sparkContext.addFile()和--files参数,两者功能重复,反而容易造成路径混淆。
修正方案
1. 调整spark-submit脚本
保留--files参数,确保HDFS路径格式正确(默认集群环境可简写为/user/db.properties,完整格式为hdfs://namenode_host:port/user/db.properties):
spark-submit \ --class your.main.class \ --files hdfs:///user/db.properties \ your-application.jar
2. 修改Scala代码
删除多余的sparkContext.addFile(),直接用文件名调用SparkFiles.get()——--files会自动将文件分发到每个Executor节点的本地临时目录:
import org.apache.spark.SparkFiles import java.util.Properties import java.io.FileInputStream // 仅传入文件名,无需完整HDFS路径 val propertiesFile = SparkFiles.get("db.properties") val properties = new Properties() properties.load(new FileInputStream(propertiesFile))
3. 本地与生产环境统一处理
- 本地开发:将
db.properties放在项目根目录,运行时通过--files db.properties传入,SparkFiles.get()可直接读取本地文件。 - 生产环境:若配置文件在提交节点本地,可改用本地路径
file:///path-home/user/spark/db.properties传入--files;若在HDFS,确保运行Spark的用户拥有该文件的读权限。
额外提醒
如果配置文件包含数据库密码等敏感信息,不要明文存储,建议使用Spark安全配置管理(如Hadoop Credential Provider)或集群密钥服务加密处理。
内容的提问来源于stack exchange,提问作者Harsh Agrawal
相关产品推荐
相关产品推荐

