在scala中读取放置在我的Linux节点上的配置文件

时间:2018-01-18 06:49:26

标签: scala apache-spark

我正在尝试使用Scala中的typesafe配置库读取配置文件,但我无法将conf文件放在我的资源文件夹中。

我的property/config文件采用以下格式

region=dev
numlines=2

,文件名为property.txt

代码如下所示

import com.typesafe.config._
val propertyFile = args(2)

val myConfigFile = new File(propertyFile)

val fileConfig = ConfigFactory.parseFile(myConfigFile)
val config = ConfigFactory.load(fileConfig)

val environment = config.getString("region")
val numberOfLinesToBeRemoved = config.getInt("numlines")

2 个答案:

答案 0 :(得分:1)

案例1 - 假设您有一个sbt项目,那么您的配置文件abc.conf应该位于src/main/resources/abc.conf

现在假设文件abc.conf包含以下内容。

region=dev
numlines=2

现在,您可以通过

访问这些配置
import com.typesafe.config._

val confFileName = "abc"

val config = ConfigFactory.load(confFileName)

val environment = config.getString("region")
val numberOfLinesToBeRemoved = config.getInt("numlines")

案例2 - 如果您不能将conf文件作为资源包含在项目中,那么您可以使用conf文件路径作为java命令的参数。

import com.typesafe.config._

val config = ConfigFactory.load()

val environment = config.getString("region")
val numberOfLinesToBeRemoved = config.getInt("numlines")

现在,您必须在运行应用程序时传递配置文件路径,

java -jar your_jar.jar -Dconfig.file=path/to/config-file

案例3 - 您希望使用某些指定路径的配置

import com.typesafe.config._
import java.nio.file.Paths

// It should be absolute or full path
val confFilePath = "/home/your_username/something/abc.conf"

// just replace the above line by
// val confFilePath = args(2)
// and pass the full path as command line argument.


val confFile = Paths.get(confFilePath).toFile

val config = ConfigFactory.parseFile(confFile)

val environment = config.getString("region")
val numberOfLinesToBeRemoved = config.getInt("numlines")

答案 1 :(得分:0)

我们也可以通过在spark Submit命令中传递jar参数来传递和加载外部配置文件(无需将配置文件复制到jar资源文件夹中,而是需要在集群中的每个节点上复制相同路径)

    1] Spark command:
spark/bin>spark-submit --class test.Example Test.jar -appconfig /home/folderpath/APP.conf

    2] Example.scala:
    import com.typesafe.config._
    import java.nio.file.Paths
    ...........
    def main(argument: Array[String]) {
    var confPath = ""
    var argumentIndex = 0
    for (n <- 0 until argument.length) {
           if (argument(n).equals("-appconfig")) {
            argumentIndex = n + 1;
            confPath = argument(argumentIndex)
          }
    }
    val confFile = Paths.get(confPath).toFile
    val appConf = ConfigFactory.parseFile(confFile)
    name = appConf.getString("NAME")
    println("name : "+name)
    }