在 Spark/Scala 中保留本地与测试与生产配置属性的最佳实践

Best practice for keeping local vs. test vs. production configuration properties in Spark/Scala

我们有一些用于在 Spark 中加载文件和处理的输入目录 SQL。

当然,目录在本地机器、测试和生产机器上是不同的。

参数化这些的最佳方法是什么,
这样我们就可以构建 运行 测试 并使用 sbt 进行部署而无需

a) 手动更改大部分配置设置,
b) 让开发人员使用他们自己的配置设置,
c) 构建目标不同的部署?

好吧,如果您不想拥有自己的 Spark 应用程序将简单读取的配置或设置包,那么您可以让应用程序在提交 Spark 应用程序时将文件路径作为参数。

例如:

./bin/spark-submit \
  --class org.YourApp \
  --master yarn-cluster \  # can also be `yarn-client` for client mode
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/yourApp.jar \
  /path/to/directory

如果您使用 Oozie,则可以根据需要更改 XML 中的路径参数。

您可以从多个选项中进行选择:

在 spark-submit 中作为参数传递

  • 非常简单,但不会扩展,如果设置数量增加
  • 我只会用它来传递一个定义环境的参数(开发、测试、生产……)

使用 属性 个文件

  • 使用传递给 spark-submit 的参数来指定要从 HDFS 读取的文件(示例:hdfs://localhost:9000/conf/dev.properties)

存储在JSON文件中,并作为DataFrame读入

  • 如果要查询配置使用SQL

存储在 RDBMS 中,并作为 DataFrame 读入

  • 如果您可以访问 运行 RDBMS(或者您可以安装一个)
  • 可能已经有一个 RDBMS,如果你有一个由一个支持的 Hive 元存储)
  • 批量 updates/deletes 使用 SQL
  • 如果您想要高可用性,可能需要一些努力

使用分布式配置服务

  • 如果您有权访问 运行 ZooKeeper 等。其他
  • 对于 ZooKeeper:
    • 您可以更新值
    • 如果值发生变化,您可以注册回调

使用 key/value 商店

  • 如果您可以访问 Infinispan、Redis、Memcached 等。其他
  • 例如,Infinispan 提供了一个分布式的、可复制的、持久的java.util.Map

当然还有其他选项(例如 LDAP),但我会选择属性:不可变配置值通常就足够了,它可能不会引入新的依赖项,并且很容易从命令行管理 and/or 一个 sbt 任务。