Использование модели Pmml в Spark

У меня есть модель PMML, которая была экспортирована из Python, и я использую ее в Spark для последующей обработки. Поскольку оценщик jpmml не сериализуем, я использую его внутри mapPartitions. Это работает нормально, но требует времени для завершения, так как mapPartition должен материализовать итератор и собрать/создать новый RDD. Мне интересно, есть ли более оптимальный способ выполнить Evaluator.

Я заметил, что когда Spark выполняет этот rdd, мой процессор недогружен (падает до ~ 30%). Также из SparkUI TaskTime (время GC) красного цвета на 53 с / 15 с.

JavaRDD<List<ClassifiedPojo>> classifiedRdd = toBeClassifiedRdd.mapPartitions( r -> {
  // initialized JPMML evaluator
  List<ClassifiedPojo> list;

  while(r.hasNext()){
    // classify
    list.add(new ClassifiedPojo())
  }

  return list.iterator();
});

person webber    schedule 11.01.2018    source источник
comment
Вы уверены, что оценщик jpmml не сериализуем?   -  person user1808924    schedule 11.01.2018
comment
Похоже, что Evaluator использует что-то, что нельзя сериализовать. Вызвано: java.io.NotSerializableException: org.xml.sax.helpers.LocatorImpl   -  person webber    schedule 11.01.2018
comment
Это информация SAX Locator — ее можно 1) удалить или 2) преобразовать в сериализуемую форму — как описано в README (и во многих других местах). Еще лучше, поищите в SO или Google приведенное выше сообщение об исключении!   -  person user1808924    schedule 12.01.2018


Ответы (1)


Окончательно! Я должен был сделать 2 вещи.

Во-первых, мне пришлось исправить SAX Locator, запустив это:

LocatorNullifier locatorNullifier = new LocatorNullifier();
locatorNullifier.applyTo(pmml);

Во-вторых, я реорганизовал свои mapPartitions для использования потоков, подробности здесь.

Это дало мне большой толчок. Надеюсь, поможет

person webber    schedule 02.02.2018