Есть ли способ понять, как искра загружает путь к классам и в каком порядке? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь запустить искровое задание с настраиваемой искрой на EMR и пытаюсь использовать настраиваемый jar в дополнительном пути к классу драйвера, например

spark.driver.extraClassPath /usr/lib/hadoop/lib/hadoop-lzo.jar:/usr/local/java/avro-1.8.2.jar:/usr/local/java/avro-mapred-1.8.2-hadoop2.jar

Но каким-то образом он все еще загружает стандартный jar-файл avro (старый1.7.4), который я нашел с помощью опции подробного пути к классам

[Loaded org.apache.avro.generic.GenericContainer from file:/usr/lib/hadoop/lib/avro-1.7.4.jar]

Я хочу понять, в каком порядке и приоритетах загружается classpath.Почему по-прежнему выбирается старый универсальный hadoop avro 1.7.4 и не загружается тот, который я хочу использовать.

Есть ли способ увидеть точный порядок пути к классу, загружаемый для запуска с искровой отправкой, любые параметры jvm и т. Д.было бы полезно.

Простое изложение порядка classpath (последовательность, которая идет первой, мой обычный jar против spark jar против hadoop jars)

1 Ответ

0 голосов
/ 12 декабря 2018

Во время выполнения, если два пути с одинаковым полным квалифицированным именем (package + classname) находятся в пути к классам (библиотеки или прямые классы), загрузчик классов может загрузить класс из одного или другого jar способом, специфичным длятекущий загрузчик классов, который загружает класс.
Вы не можете не делать разумных ставок на его выбор.

Так что наличие в classpath двух версий одной и той же библиотеки явно чего-то, чего следует избегать: avro-1.8.2.jar и avro-1.7.4.jar.
Параметр spark.driver.extraClassPath не изменитсяспособ, которым работает JVM.Он просто:

Дополнительные записи пути к классу, чтобы добавить к пути к классу драйвера.

Короче говоря: измените значение пути к классу, указав только ту версию, которая вам нужна.

...