Исключение за пределами границ индекса строки при инициализации контекста искры - PullRequest
1 голос
/ 06 апреля 2020

Я работаю со Spark более 5 лет. Недавно я столкнулся с основной ошибкой c, которую никогда не видел, и она остановила разработку. Когда я делаю обычный вызов для создания контекста Spark, я получаю ExceptionInInitializerError, вызванную StringIndexOutOfBoundsException. Вот простой пример моего кода:

public class SparkTest {
    public static final SparkConf SPARK_CONFIGURATION = new SparkConf().setAppName("MOSDEX").setMaster("local[*]");
    public static final JavaSparkContext SPARK_CONTEXT= new JavaSparkContext(SPARK_CONFIGURATION);
    public static final SparkSession SPARK_SESSION= SparkSession.builder()
            .config(SPARK_CONFIGURATION)
            .getOrCreate();

    public static void main(String[] args) {
        setupTest();        
    }

    public static void setupTest() {
        List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
        JavaRDD<Integer> distData = SPARK_CONTEXT.parallelize(data);
        int sum= distData.reduce((a, b) -> a + b);
        System.out.println("Sum of " + data.toString() + " = " + sum);
        System.out.println();
    }//SetupTest

    public SparkTest() {
        super();
    }

}//class SparkTest

Вот цепочка сообщений об ошибках:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/C:/Users/Owner/.m2/repository/org/apache/spark/spark-unsafe_2.11/2.4.5/spark-unsafe_2.11-2.4.5.jar) to method java.nio.Bits.unaligned()
WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
20/04/05 13:55:21 INFO SparkContext: Running Spark version 2.4.5
20/04/05 13:55:22 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:79)
    at org.apache.hadoop.security.Groups.parseStaticMapping(Groups.java:116)
    at org.apache.hadoop.security.Groups.<init>(Groups.java:93)
    at org.apache.hadoop.security.Groups.<init>(Groups.java:73)
    at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:293)
    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:283)
    at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:260)
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:789)
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:774)
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:647)
    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2422)
    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2422)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2422)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:293)
    at io.github.JeremyBloom.mosdex.SparkTest.<clinit>(SparkTest.java:28)
Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end 3, length 2
    at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3720)
    at java.base/java.lang.String.substring(String.java:1909)
    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:50)
    ... 16 more

Я также получаю ту же ошибку, когда я использую SparkContext вместо JavaSparkContext. Я провел обширный поиск этой ошибки и не видел никого, у кого она есть, поэтому я не думаю, что это ошибка в Spark. Я использовал этот код в других приложениях ранее (с более ранними версиями Spark) без проблем.

Я использую последнюю версию Spark (2.4.5). Почему это не работает?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Я использую spark 2.4.5, и jdk1.8.0_181 прекрасно работает для меня

package examples;



import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;

import java.util.Arrays;
import java.util.List;


public class SparkTest {
  public static final SparkConf SPARK_CONFIGURATION = new SparkConf().setAppName("MOSDEX").setMaster("local[*]");
  public static final JavaSparkContext SPARK_CONTEXT= new JavaSparkContext(SPARK_CONFIGURATION);
  public static final SparkSession SPARK_SESSION= SparkSession.builder()
    .config(SPARK_CONFIGURATION)
    .getOrCreate();

  public static void main(String[] args) {
    setupTest();
  }

  public static void setupTest() {
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
    JavaRDD<Integer> distData = SPARK_CONTEXT.parallelize(data);
    int sum= distData.reduce((a, b) -> a + b);
    System.out.println("Sum of " + data.toString() + " = " + sum);
    System.out.println();
  }//SetupTest

  public SparkTest() {
    super();
  }

}//class SparkTest

Результат:

[2020-04-05 18:14:42,184] INFO Running Spark version 2.4.5 (org.apache.spark.SparkContext:54)

...

[2020-04-05 18:14:44,060] WARN Using an existing SparkContext; some configuration may not take effect. (org.apache.spark.SparkContext:66)
Sum of [1, 2, 3, 4, 5] = 15

AFAIK Вы столкнулись с проблемой java версии как уже упоминалось в этом. HAD OOP -14586 StringIndexOutOfBoundsException разрывает орг. apache .had oop .util.Shell на 2.7.x с Java 9

Измените версию java, которая подходит с версии oop.

См. Здесь

Последний выпуск (Spark 2.4.5) - Apache Документация Spark

Spark работает на Java 8, Python 2.7+ /3.4+ и R 3.1+. Для API Scala Spark 2.4.5 использует Scala 2.12. Вам нужно будет использовать совместимую Scala версию (2.12.x).

ПРИМЕЧАНИЕ. Согласно комментарию, Spark не поддерживает java 13. Вам необходимо понизить версию java до java 8

0 голосов
/ 07 апреля 2020

Оказывается, что если вы используете Had oop> 2.8, вы можете использовать Java 13 (сейчас я использую Had oop 2.8.5). Это сложно, если вы используете Spark 2.4.5, потому что на Maven он поставляется с Had oop 2.6. Вы должны создать отдельную зависимость для Had oop 2.8.5, которая переопределяет предварительно собранные компоненты. Мне потребовалось немало экспериментов, чтобы сделать эту работу. Кроме того, я работаю в Windows, поэтому мне также нужно было связать Had oop с winutils, что является еще одним осложнением. Ничто из этого не очень хорошо задокументировано, поэтому мне пришлось прочитать много постов в Stackoverflow, чтобы заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...