通过spark和scala从AWS s3读取.conf文件

时间:2018-05-08 17:49:12

标签: scala amazon-web-services apache-spark typesafe

我能够从AWS S3加载文本文件,但在阅读“.conf”文件时遇到问题。得到错误

  

“线程中的异常”main“com.typesafe.config.ConfigException $ Missing:找不到关键'spark'的配置设置”

Scala代码:

val configFile1 = ConfigFactory.load( "s3n://<bucket_name>/aws.conf" )
configFile1.getString("spark.lineage.key")

3 个答案:

答案 0 :(得分:0)

根据我的研究,我们只能通过spark / scala从AWS S3读取分隔符文件。由于.conf文件是= pair,因此不可能 唯一的方法是修改文件中的数据格式。

答案 1 :(得分:0)

Typesafe Config不支持从S3加载.conf文件,但是您可以自己以字符串形式读取s3文件,并像foo这样传递给typesafe config

答案 2 :(得分:0)

这就是我最终要做的,创建一个包装器实用程序 Config.scala

import java.io.File

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain
import com.amazonaws.services.s3.{AmazonS3Client, AmazonS3URI}
import com.typesafe.config.{ConfigFactory, Config => TConfig}

import scala.io.Source

object Config {

  private def read(location: String): String = {
    val awsCredentials = new DefaultAWSCredentialsProviderChain()
    val s3Client = new AmazonS3Client(awsCredentials)
    val s3Uri = new AmazonS3URI(location)

    val fullObject = s3Client.getObject(s3Uri.getBucket, s3Uri.getKey)

    Source.fromInputStream(fullObject.getObjectContent).getLines.mkString("\n")
  }

  def apply(location: String): TConfig = {

    if (location.startsWith("s3")) {
      val content = read(location)
      ConfigFactory.parseString(content)
    } else {
      ConfigFactory.parseFile(new File(location))
    }
  }
}

使用创建的包装器

val conf: TConfig = Config("s3://config/path")

您可以将provided范围用于aws-java-sdk,因为它将在EMR群集中可用。