本文描述问题及解决方法同样适用于 弹性 MapReduce(EMR)。
Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输数据的开源工具。它允许用户在Hadoop分布式文件系统(HDFS)和外部结构化数据存储之间进行数据导入和导出操作。Sqoop的主要优势在于,它可以有效地将大量数据从关系数据库迁移到Hadoop环境中,以便进行大数据分析和处理。
然而,在使用Sqoop时,开发者可能会遇到一些常见的问题。为了帮助开发者更有效地利用Sqoop,本文将介绍一些关于Sqoop的常见问题处理方法。
Error:Could not initialize class org.apache.derby.jdbc.AutoloaderDriver40
因为报错为无法判断为初始化类,所以判断是包冲突或是包版本问题。
这种情况一般是之前遇到过derby相关的sqoop问题,从网上找的解决方案随便下载了一个derby包放在sqoop lib下,导致包冲突。
Error: java.io.IOException: SQLException in nextKeyvalue
针对两个需求,实现demo如下:
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:orc表如果不存在,即创建; --hcatalog-storage-stanza:orc表存储参数,这里指定了存储格式为orc,指定了warehouse路径为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导出数据到hive时出现中文乱码问题
乱码问题由于两个平台数据编码不一致造成的,或者远程连接平台编码问题以及sqoop命令中编码问题。
1. 在mysql的jdbc连接uri中指明编码格式:
jdbc:mysql://<ip>:3306/<db>?useUnicode=true&characterEncoding=utf-8
2. 另一种原因是因为指定了--direct参数,取消即可。
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat
Console执行可以成功,但是workflow执行报错。
如果console执行能成功,解决思路就是先定位到底哪个节点不行,再对比一下有什么区别。 1. org.apache.hadoop.mapreduce.InputFormat缺这个class,可以定位到是缺这个包:
/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. 然后将console可执行节点上的包分发到所有节点,问题解决。
另一种情况,会出现所有节点都无法成功执行,报错
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat
这时候将hadoop-mapreduce-client开头的8个jar包放到/usr/local/service/sqoop/lib/路径下即可。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。