scala-错误:java.lang.IllegalStateException异常:用户未初始化spark上下文


0

Scala版本:2.11.12

Spark版本:2.4.0

EMR-5.23.0

运行下面的命令创建Amazon EMR集群时获取以下信息

spark-submit --class etl.SparkDataProcessor --master yarn --deploy-mode cluster --conf spark.yarn.appMasterEnv.ETL_NAME=foo --conf spark.yarn.appMasterEnv.ETL_SPARK_MASTER=yarn --conf spark.yarn.appMasterEnv.ETL_AWS_ACCESS_KEY_ID=123 --conf spark.yarn.appMasterEnv.ETL_AWS_SECRET_ACCESS_KEY=abc MY-Tool.jar

例外情况

ERROR ApplicationMaster: Uncaught exception: 
java.lang.IllegalStateException: User did not initialize spark context!
    at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:485)
    at org.apache.spark.deploy.yarn.ApplicationMaster.org$apache$spark$deploy$yarn$ApplicationMaster$$runImpl(ApplicationMaster.scala:305)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$1.apply$mcV$sp(ApplicationMaster.scala:245)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$1.apply(ApplicationMaster.scala:245)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$1.apply(ApplicationMaster.scala:245)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$3.run(ApplicationMaster.scala:773)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844)
    at org.apache.spark.deploy.yarn.ApplicationMaster.doAsUser(ApplicationMaster.scala:772)
    at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:244)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:797)
    at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)

如何创建spark会话(sparkMaster=yarn)

lazy val spark: SparkSession = {
    val logger: Logger = Logger.getLogger("etl");
    val sparkAppName = EnvConfig.ETL_NAME
    val sparkMaster = EnvConfig.ETL_SPARK_MASTER

val sparkInstance = SparkSession
  .builder()
  .appName(sparkAppName)
  .master(sparkMaster)
  .getOrCreate()

val hadoopConf = sparkInstance.sparkContext.hadoopConfiguration
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoopConf.set("fs.s3a.access.key", EnvConfig.ETL_AWS_ACCESS_KEY_ID)
hadoopConf.set("fs.s3a.secret.key", EnvConfig.ETL_AWS_SECRET_ACCESS_KEY)

logger.info("Created My SparkSession")
logger.info(s"Spark Application Name: $sparkAppName")
logger.info(s"Spark Master: $sparkMaster")

sparkInstance

}

更新:

我确定,由于应用程序逻辑的原因,在某些情况下,我们没有初始化spark会话。因此,当集群终止时,它似乎还试图对会话执行某些操作(可能关闭会话),因此正在失败。现在我已经解决了这个问题,应用程序运行,但从未真正完成。目前,在群集模式下运行时,它似乎挂在涉及 spark的特定部分:

val data: DataFrame = spark.read
      .option("header", "true")
      .option("inferSchema", "true")
      .csv(s"s3://$csvPath/$fileKey")
      .toDF()

20/03/16 18:38:35 INFO Client: Application report for application_1584324418613_0031 (state: RUNNING)

2 答案


0

阿法克EnvConfig.ETL_AWS_ACCESS_密钥ID并且ETL AWS_SECRET_ACCESS_密钥不会被填充,因为sparksession不能用空值或空值实例化。尝试打印和调试这些值。

同时从--conf读取属性 spark.xxx

应该像这个例子。我希望你在跟踪。。。

spark.sparkContext.getConf.getOption("spark. ETL_AWS_ACCESS_KEY_ID")

一旦你检查过了,这个例子应该有用。。。

 /**
      * Hadoop-AWS Configuration
      */
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3a.proxy.host", proxyHost)
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3a.proxy.port", proxyPort)
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3a.server-side-encryption-algorithm", "AES256")
    sparkSession.sparkContext.hadoopConfiguration.set("fs.s3n.server-side-encryption-algorithm", "AES256")
    sparkSession.sparkContext.hadoopConfiguration.set("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem

另一件事是,使用

--主 Yarn 或--master local[*]您可以使用

-conf spark.yarn.appMasterEnv.ETL_SPARK_MASTER=yarn  

更新:

--形态spark.driver.port=20002个可以解决这个问题。其中20002是轨道港。。似乎它在等待某个端口一段时间,然后重试一段时间,最后失败了,除了你得到的。

我是从这里浏览Sparks应用程序主代码得到这个想法的

对此评论有点老套,但我们需要等到 spark驱动端口属性已由执行用户类的线程设置。

你可以试试让我知道。

进一步阅读:Apache Spark:如何更改Spark驱动程序监听的端口


0

在我的例子中(在解决了应用程序问题之后),我需要在集群模式下部署时包含 core和任务节点类型。


我来回答

写文章

提问题

面试题