在Spark / Scala

时间:2015-12-06 12:35:04

标签: scala configuration apache-spark sbt

我们有一些输入目录,用于在Spark SQL中加载文件和进程。

当然,这些目录在本地计算机上与测试与生产不同。

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

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

2 个答案:

答案 0 :(得分:3)

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

在spark-submit

中作为参数传递
  • 非常简单,但如果设置数量增加则不会缩放
  • 我只用它来传递一个定义环境的参数(dev,test,prod,...)

使用属性文件

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

存储在JSON文件中,并以DataFrame

读入
  • 如果要使用SQL
  • 查询配置

存储在RDBMS中,并以DataFrame

读入
  • 如果您有权访问正在运行的RDBMS(或者您可以安装一个)
  • 如果你有一个由一个人支持的Hive Metastore,可能已经有了一个RDBMS。
  • 使用SQL提供批量更新/删除
  • 如果您想要高可用性,可能需要一些努力

使用分布式配置服务

  • 如果您有权访问正在运行的ZooKeeper等。人
  • 如果是ZooKeeper:
    • 您可以更新值
    • 如果值更改,您可以注册回拨

使用键/值存储

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

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

答案 1 :(得分:0)

如果您不想拥有自己的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中的path参数。