Функция карты Apache Spark org.apache.spark.SparkException: задача не сериализуется - PullRequest
0 голосов
/ 18 октября 2018

Я изучаю Apache Spark и использую Java 8 и Spark Core 2.3.2.

Я обнаружил, что когда я использую функцию карты на RDD, она работает только тогда, когда я использую лямбда-выражение.

Так что это работает:

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1, 2, 3, 4));
JavaRDD<Integer> result = rdd.map(x -> x*x );

Но это не так и выдает org.apache.spark.SparkException: Задача не сериализуема

JavaRDD<Integer> result = rdd.map(new Function<Integer, Integer>() {
    public Integer call(Integer x) { return x*x; }
});

Может кто-нибудь объяснить, пожалуйстаЗачем?Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

Когда вы объявляете, что new Function, он содержит ссылку на класс, который его содержит.Когда Spark пытается отправить новый экземпляр анонимной функции рабочим, он также пытается сериализовать содержащий класс, но, очевидно, этот класс не реализует Serializable или имеет другие члены, которые не сериализуются.Вероятно, вы получили ошибку типа object not serializable (class: YourClass, value: YourClass@e49bf8a), где «YourClass» - это класс, содержащий объявление функции.

Если вы вместо этого объявили функцию как статический член вашего класса:

static Function<Integer, Integer> f = new Function<Integer, Integer>() {
    public Integer call(Integer x) {
        return x * x;
    }
};

и передал его вашей функции карты:

JavaRDD<Integer> result = rdd.map(f);

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

...