Сбой задания Spark, использующего контекст куста, в oozie

В одном из наших пайплайнов мы выполняем агрегацию с помощью spark(java), и она управляется с помощью oozie. Этот конвейер записывает агрегированные данные в файл ORC, используя следующие строки.

HiveContext hc = new HiveContext(sc);
DataFrame modifiedFrame = hc.createDataFrame(aggregateddatainrdd, schema);

modifiedFrame.write().format("org.apache.spark.sql.hive.orc").partitionBy("partition_column_name").save(output);

Когда запускается действие искры в задании oozie, оно выдает следующее исключение

Сбой Oozie Launcher, основной класс [org.apache.oozie.action.hadoop.SparkMain], main() вызвал исключение, org.apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()Z java.lang.NoSuchMethodError: org. apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()Z

Но то же самое удается после повторного запуска рабочего процесса несколько раз.

Все необходимые jar-файлы находятся на месте как во время выполнения, так и во время компиляции.

Это мое первое искровое приложение, и я не могу понять проблему.

Может ли кто-нибудь помочь мне лучше понять проблему и возможное решение для нее.


person sudharshan r    schedule 09.03.2017    source источник


Ответы (1)


"то же самое происходит после повторного запуска рабочего процесса несколько раз"

Похоже, вы скомпилировали/связали задание Spark с клиентом Hadoop в другой версии, отличной от той, на которой запущен кластер; в результате в ПУТИ К КЛАССУ есть конфликтующие JAR-файлы, и ваше задание завершается сбоем случайным образом в зависимости от того, какой JAR-файл будет выбран первым.

Чтобы быть уверенным, выберите одно успешно выполненное задание Oozie и одно неудачное задание, получите «внешний идентификатор» действия (которое помечено job_*******_****, но ссылается на идентификатор YARN application_******_****) и просмотрите журналы YARN. для обеих работ. Вы должны увидеть разницу в фактическом порядке файлов JAR в Java CLASSPATH.

Если это действительно так, попробуйте комбинацию

  • в действии Oozie задайте для свойства oozie.launcher.mapreduce.user.classpath.first значение true (для драйвера Spark)
  • в конфигурации Spark задайте для свойства spark.yarn.user.classpath.first значение true (для исполнителей)

Вы можете догадаться, что означает user.classpath.first...!


Но это может не сработать, если конфликтующие файлы JAR на самом деле находятся не в клиенте Hadoop, а в Oozie ShareLib. И с точки зрения YARN, Oozie является «клиентом», вы не можете установить приоритет между тем, что Oozie отправляет из своей ShareLib, и тем, что он отправляет из вашего задания Spark.

В этом случае вам придется использовать правильные зависимости в вашем проекте Java и сопоставить версию Hadoop, с которой вы будете работать — это просто здравый смысл, не так ли?!?

person Samson Scharfrichter    schedule 09.03.2017
comment
Спасибо, Самсон, то, что вы упомянули, имеет смысл, и я начал отладку в этом направлении, однако у меня есть одно сомнение в журналах пряжи, я мог видеть две вещи в отношении пути к классу: один - java.class.path вверху, а другой - ClassPath Элементы, какой из них будет загружаться искрой? - person sudharshan r; 09.03.2017
comment
Они должны совпадать — обе являются трассировками отладки из класса запуска Oozie. - person Samson Scharfrichter; 09.03.2017
comment
Спасибо самсон! там порядок выполнения банок вызывал проблему, я использовал oozie.launcher.mapreduce.user.classpath.first, чтобы установить приоритет. - person sudharshan r; 10.03.2017