【问题标题】:How to use properties in spark scala maven project如何在 spark scala maven 项目中使用属性
【发布时间】:2019-01-27 13:17:16
【问题描述】:

我想明确地包含属性文件并将其包含在 spark 代码中,而不是直接在 spark 代码中使用所有凭据进行硬编码。 我正在尝试以下方法但无法做到,AppContext 无法解决。 请指导我如何实现这一目标。

Spark_env.properties(在 maven 项目中的 src/main/resources 下,用于带有 scala 的 spark)

CASSANDRA_HOST1=127.0.0.133
CASSANDRA_PORT1=9042
CASSANDRA_USER1=usr1
CASSANDRA_PASS1=pas2



DataMigration.cassandra.keyspace1=demo2
DataMigration.cassandra.table1= data1

CASSANDRA_HOST2= 
CASSANDRA_PORT2=9042
CASSANDRA_USER2=usr2
CASSANDRA_PASS2=pas2

D.cassandra.keyspace2=kesp2
D.cassandra.table2= data2

DataMigration.DifferencedRecords.output.path1=C:/spark_windows_proj/File1.csv
DataMigration.DifferencedRecords.output.path2=C:/spark_windows_proj/File1.parquet

----------------------------------------------------------------------------------
DM.scala

import org.apache.spark.sql.SparkSession
import org.apache.hadoop.mapreduce.v2.app.AppContext

object Data_Migration {
  def main(args: Array[String]) {



    val host1: String = AppContext.getProperties().getProperty("CASSANDRA_HOST1")
    val port1 = AppContext.getProperties().getProperty("CASSANDRA_PORT1").toInt
    val keySpace1: String = AppContext.getProperties().getProperty("DataMigration.cassandra.keyspace1")
    val DataMigrationTableName1: String = AppContext.getProperties().getProperty("DataMigration.cassandra.table1")
    val username1: String = AppContext.getProperties().getProperty("CASSANDRA_USER1")
    val pass1: String = AppContext.getProperties().getProperty("CASSANDRA_PASS1")

     val host2: String = AppContext.getProperties().getProperty("CASSANDRA_HOST2")
       val port2 = AppContext.getProperties().getProperty("CASSANDRA_PORT2").toInt
    val keySpace2: String = AppContext.getProperties().getProperty("DataMigration.cassandra.keyspace2")
    val DataMigrationTableName2: String = AppContext.getProperties().getProperty("DataMigration.cassandra.table2")
    val username2: String = AppContext.getProperties().getProperty("CASSANDRA_USER2")
    val pass2: String = AppContext.getProperties().getProperty("CASSANDRA_PASS2")




     val Result_csv: String = AppContext.getProperties().getProperty("DataMigration.DifferencedRecords.output.path1")
      val Result_parquet: String = AppContext.getProperties().getProperty("DataMigration.DifferencedRecords.output.path2")



    val sc = AppContext.getSparkContext()


    val spark = SparkSession
                      .builder() .master("local")
                      .appName("ABC")
                      .config("spark.some.config.option", "some-value")
                      .getOrCreate()



    val df_read1 = spark.read
                       .format("org.apache.spark.sql.cassandra")
                       .option("spark.cassandra.connection.host",host1)
                       .option("spark.cassandra.connection.port",port1)
                       .option( "spark.cassandra.auth.username",username1)
                       .option("spark.cassandra.auth.password",pass1)
                       .option("keyspace",keySpace1)
                       .option("table",DataMigrationTableName1)
                       .load()

【问题讨论】:

  • 您是否尝试过使用 Typesafe 配置?
  • 谢谢..我会检查一下..

标签: scala apache-spark cassandra


【解决方案1】:

我宁愿在提交作业时通过将--properties-file 选项传递给spark-submit 来显式传递属性。

AppContext 不一定适用于所有提交类型,而传递配置文件应该适用于任何地方。

编辑:对于没有 spark-submit 的本地使用,您可以简单地使用标准 Properties 类,从资源中加载它并访问属性。您只需将属性文件放入 src/main/resources 而不是 src/test/resources 包含在类路径中仅用于测试。代码是这样的:

val props = new Properties
props.load(getClass.getClassLoader.getResourceAsStream("file.props"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2013-07-01
    • 2015-12-01
    • 2019-01-25
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多