Проблемы и решения, описанные в этой статье, также применимы к эластичность MapReduce(EMR)。
Sqoop — это инструмент с открытым исходным кодом для передачи данных между Apache Hadoop и хранилищами структурированных данных, такими как реляционные базы данных. Он позволяет пользователям выполнять операции импорта и экспорта данных между распределенной файловой системой Hadoop (HDFS) и внешними структурированными хранилищами данных. Основное преимущество Sqoop заключается в том, что он может эффективно переносить большие объемы данных из реляционных баз данных в среду Hadoop для анализа и обработки больших данных.
Однако разработчики могут столкнуться с некоторыми распространенными проблемами при использовании Sqoop. Чтобы помочь разработчикам более эффективно использовать Sqoop, в этой статье будут представлены некоторые распространенные методы решения проблем, связанных с Sqoop.
Error:Could not initialize class org.apache.derby.jdbc.AutoloaderDriver40
Поскольку сообщаемая ошибка не может быть определена как класс инициализации, она рассматривается как конфликт пакетов или проблема версии пакета.
Эта ситуация обычно возникает из-за того, что ранее вы сталкивались с проблемами sqoop, связанными с derby, а также случайной загрузкой пакета derby из решения, найденного в Интернете, и помещением его в sqoop lib, что приводит к конфликтам пакетов.
Error: java.io.IOException: SQLException in nextKeyvalue
Для двух требований демо-версия реализована следующим образом:
sqoop import --connect jdbc:mysql://172.0.0.1:3306/dy \
--username root --password XXX \
--table test \
--create-hcatalog-table \
--hcatalog-database dy \
--hcatalog-table test_orc \
--hcatalog-storage-stanza "stored as orcfile location 'cosn://sqoop-dy-1258469122/hive/warehouse/test_orc'" \
-m 1
--create-hcatalog-table: Если таблица орков не существует, она будет создана; --hcatalog-storage-stanza: параметры хранения таблицы orc, формат хранения указан как orc, а путь к хранилищу указан как путь cos.
Примечание: поскольку orcповерхность отличается от обычной hiveповерхности, orcповерхность может использовать только параметр hcatalog.
113 [main] ERROR org.apache.sqoop.tool.ImportTool - Import failed: java.io.IOException: Exception thrown in Hive
at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:358)
at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:331)
... 9 more
Caused by: java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:614)
at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:549)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:750)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
... 14 more
Caused by: java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 18 more
После того как клиент изменил движок Hive по умолчанию на Tez, во время выполнения sqoop произошла ошибка, и он стал недоступен.
Добавьте следующую команду после файла /usr/local/service/sqoop/conf/sqoop-env.sh:
export TEZ_HOME=/usr/local/service/tez
for jar in `ls $TEZ_HOME |grep jar`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/lib/$jar
done
Затем создайте мягкую ссылку /usr/local/service/tez/conf/tez-site.xml на /usr/local/service/sqoop/conf:
ln -s /usr/local/service/tez/conf/tez-site.xml /usr/local/service/sqoop/conf
Проблема решена.
Примечание: Эти операции можно изменить на машине отправки.
java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.ObjectMapper
Поскольку сообщаемая ошибка не может быть определена как класс инициализации, она рассматривается как конфликт пакетов или проблема версии пакета.
Проблема с китайским искажением возникает, когда Sqoop экспортирует данные в улей
Проблема с искаженным кодом вызвана несогласованным кодированием данных между двумя платформами, проблемами кодирования на платформе удаленного подключения или проблемами кодирования в команде sqoop.
1. Укажите формат кодировки в URL-адресе подключения jdbc к MySQL:
jdbc:mysql://<ip>:3306/<db>?useUnicode=true&characterEncoding=utf-8
2. Другая причина в том, что указан параметр --direct, просто отмените его.
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat
Выполнение консоли может быть успешным, но выполнение рабочего процесса сообщает об ошибке.
Если выполнение консоли может быть успешным, решение состоит в том, чтобы сначала определить, какой узел не работает, а затем сравнить различия. 1. В org.apache.hadoop.mapreduce.InputFormat отсутствует этот класс. Вы можете найти недостающий пакет:
/usr/local/service/sqoop/lib/hadoop-mapreduce-client-core-2.8.5.jar
2. Распространите этот пакет Hadoop-mapreduce-client-core-2.8.5.jar непосредственно на все узлы;
3. В это время сообщалось о новой ошибке:
java.lang.NoClassDefFoundError;java.io.IOException: Cannot initialize Cluster
Эту проблему трудно обнаружить, и она обычно возникает из-за отсутствия большого количества пакетов;
4. а потом консоль может распространять пакеты на узле всем узлам, Проблема решена.
В другой ситуации все узлы не смогут успешно выполниться, и будет сообщено об ошибке.
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat
Сейчас просто поместите 8 jar-пакетов, начиная с Hadoop-mapreduce-client, по пути /usr/local/service/sqoop/lib/.