Я имею дело с проблемой, когда я пытаюсь импортировать огромное количество данных из локальной ведомой реплики PostgreSQL в облачное хранилище Google в формате Avro с использованием Apache Sqoop.
Импорт данных с форматами по умолчанию работает очень хорошо, но моя линия данных потребовала бы импорта данных в формат Avro, однако это не удается из-за причины, о которой много раз сообщалось в прошлом, например:
Я пытался использовать аргумент -Dmapreduce.job.user.classpath.first=true
, как указано в вышеупомянутых вопросах, но ошибка по-прежнему:
java.lang.Exception: java.lang.NoSuchMethodError: org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)V
Этот метод, кажется, добавлен в Avro v.1.8.0, но некоторые зависимости используют более старую версию Avro, где это недоступно.
В моей среде есть следующие версии этих инструментов:
- Hadoop 2.7.3.2.6.3.0-235
- Sqoop 1.4.7
- javac 1.8.0_191
- sqoop / lib / parquet-avro-1.6.0.jar
- sqoop / lib / avro-1.8.1.jar
- sqoop / lib /avro-mapred-1.8.1-hadoop2.jar
Кто-нибудь еще сталкивался с такой же проблемой, и добавление -Dmapreduce.job.user.classpath.first=true
к sqoop import
не решает проблему?
# Command I'm running
sqoop import -Dmapreduce.job.user.classpath.first=true \
-Dsqoop.export.records.per.statement=1 \
--connect jdbc:postgresql://XX.XX.X.XX/db \
--username postgres \
--password XXXX \
--table FOO \
--target-dir gs://test-bucket/test/ \
--as-avrodatafile \
2>&1 | tee -a /home/userA/logs/test.log