我们有一些输入目录,用于在 Spark SQL 中加载文件和处理。
当然,目录在本地机器上、测试上和生产上是不同的。
参数化这些的最佳方法是什么,
这样我们就可以构建,运行测试
并使用 sbt 部署而无需
a) 手动更改大部分配置设置,
b) 让开发人员使用他们自己的配置设置,
c) 构建目标不同的部署?
最佳答案
您可以从许多选项中进行选择:
在 spark-submit 中作为参数传递
- 非常简单,但不会随着设置数量的增加而扩展
- 我只会用它来传递一个定义环境的参数(开发、测试、生产……)
使用属性文件
- 使用传递给 spark-submit 的参数来指定要从 HDFS 读取的文件(例如:hdfs://localhost:9000/conf/dev.properties)
存储在JSON文件中,读入为DataFrame
- 如果你想使用SQL查询配置
存储在 RDBMS 中,并作为 DataFrame 读入
- 如果您有权访问正在运行的 RDBMS(或者您可以安装一个)
- 可能已经有一个 RDBMS,如果你有一个由一个支持的 Hive 元存储)
- 使用 SQL 提供批量更新/删除
- 如果您想要高可用性,可能需要一些努力
使用分布式配置服务
- 如果您有权访问正在运行的 ZooKeeper 等。等
- 对于 ZooKeeper:
- 您可以更新值
- 如果值发生变化,您可以注册回调
使用键/值存储
- 如果您可以访问 Infinispan、Redis、Memcached 等。等
- 例如,Infinispan 提供了一个分布式、可复制、持久化的 java.util.Map
当然还有其他选项(例如 LDAP),但我会选择属性:不可变配置值通常就足够了,它可能不会引入新的依赖项,并且很容易从命令行和/或sbt 任务。
关于scala - 在 Spark/Scala 中保持本地、测试和生产配置属性的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117480/