ОШИБКА: java .lang.IllegalStateException: пользователь не инициализировал контекст искры - PullRequest
0 голосов
/ 13 марта 2020

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)

Как я создаю свой сеанс искры (где sparkMaster = пряжа)

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
  }

ОБНОВЛЕНИЕ:

Я определил, что из-за логики приложения c в некоторых случаях мы делали не инициализировать сеанс искры. Из-за этого кажется, что когда кластер завершает работу, он также пытается что-то сделать с сеансом (возможно, закрыть его) и, таким образом, терпит неудачу. Теперь, когда я разобрался с этой проблемой, приложение запускается, но фактически не завершается. В настоящее время он, кажется, зависает в определенной части, включающей искру, при работе в кластерном режиме:

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 голосов
/ 17 марта 2020

В моем случае (после решения проблем приложения) при развертывании в режиме кластера мне нужно было включить базовые типы узлов И задач.

0 голосов
/ 13 марта 2020

AFAIK EnvConfig.ETL_AWS_ACCESS_KEY_ID и ETL_AWS_SECRET_ACCESS_KEY не заполняются, из-за чего не может быть задана искробезопасность с нулевыми или пустыми значениями. попытайтесь напечатать и отладить значения.

также чтение свойств из --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

другое дело, используйте

--master yarn или --master local[*] можно использовать вместо

-conf spark.yarn.appMasterEnv.ETL_SPARK_MASTER=yarn  

ОБНОВЛЕНИЕ:

--conf spark.driver.port=20002 может решить эту проблему. где 20002 - орбитальный порт .. похоже, что он ждет определенного порта некоторое время и повторяет попытку в течение некоторого времени, и он терпит неудачу за исключением того, что вы получили.

Я понял эту идею, пройдя отсюда мастер-код приложения Sparks

и комментарий Это немного странно, но нам нужно подождать, пока искра Свойство .driver.port было установлено потоком, выполняющим класс пользователя.

вы можете попробовать это и сообщить мне.

Дальнейшее чтение: Apache Spark : Как изменить порт, который слушает драйвер Spark

...