Ошибка Sqoop при импорте как avro в AWS EMR - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь выполнить sqoop import в Amazon EMR (hadoop 2.8.5 sqoop 1.4.7). Импорт идет очень хорошо, когда не указана опция avro (--as-avrodatafile). Но как только он установлен, работа завершается с ошибкой

19/10/29 21:31:35 INFO mapreduce.Job: Task Id : attempt_1572305702067_0017_m_000000_1, Status : FAILED
Error: org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)V

Использование этой опции -D mapreduce.job.user.classpath.first=true не работает.

Запуск локально (на моем компьютере) Я обнаружил, что копирование avro-1.8.1.jar в sqoop to папка hadoop lib работает, но в кластере EMR у меня есть доступ только к главному узлу, поэтому выполнение вышеописанного не работает, потому что это не главный узел, который выполняет задания.

Кто-нибудь сталкивался с этой проблемой?

1 Ответ

0 голосов
/ 30 октября 2019

Решение, которое я нашел, состояло в том, чтобы соединиться с каждым узлом в кластере (я думал, что у меня был только доступ к главному узлу, но я был неправ, в EMR у нас есть доступ ко всем узлам) и заменить jar Avro, который включенс Hadoop от банка Avro, который поставляется в Sqoop. Это не элегантное решение, но оно работает.

[ОБНОВЛЕНИЕ]

Случилось так, что опция -D mapreduce.job.user.classpath.first=true не работала, потому что я использовал s3a в качестве целевого каталога, когда Amazon сказал, что мыследует использовать s3. Как только я начал использовать * 1008, Sqoop мог правильно выполнить импорт. Таким образом, нет необходимости заменять какой-либо файл в узлах. Использование s3a может привести к некоторым странным ошибкам в EMR из-за собственной конфигурации Amazon, не используйте ее. Даже с точки зрения производительности s3 лучше, чем s3a в EMR, поскольку реализация для s3 - это Amazon.

...