「EMR 开发指南」之 Sqoop 常见问题处理
说明本文描述问题及解决方法同样适用于 弹性 MapReduce(EMR)。
背景Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输数据的开源工具。它允许用户在Hadoop分布式文件系统(HDFS)和外部结构化数据存储之间进行数据导入和导出操作。Sqoop的主要优势在于,它可以有效地将大量数据从关系数据库迁移到Hadoop环境中,以便进行大数据分析和处理。
然而,在使用Sqoop时,开发者可能会遇到一些常见的问题。为了帮助开发者更有效地利用Sqoop,本文将介绍一些关于Sqoop的常见问题处理方法。
问题一:Sqoop无法初始化derby class问题异常:代码语言:javascript代码运行次数:0运行复制Error:Could not initialize class org.apache.derby.jdbc.AutoloaderDriver40因为报错为无法判断为初始化类,所以判断是包冲突或是包版本问题。
解决过程:去sqoop lib目录查看对应的包,发现有多个derby包;然后全盘搜了一下集群中使用derby的包为什么版本;然后删除了sqoop lib下多余的derby包,问题解决。原因:这种情况一般是之前遇到过derby相关的sqoop问题,从网上找的解决方案随便下载了一个derby包放在sqoop lib下,导致包冲突。
问题二:sqoop import SQLException in nextKeyvalue问题异常:代码语言:tex复制Error: java.io.IOException: SQLException in nextKeyvalue解决过程:分析Exception类型为IO问题,IO问题一般都是数据问题,进一步查看报错数据;报错信息里的记录为:java.sql.SQLExceptipn: Value ‘2018-01-20 02:06:24....’通过上面两步的分析,可以判断得出结论:问题为记录中存在日期格式异常,需要在mysql jdbc url里指定一个参数:&zeroDateTimeBehavior=convertToNull方案发给客户之后,客户反馈问题解决。
问题三:Sqoop 在使用 cos 存储场景下自动创建 orc 表需求:客户期望在使用cos做存储的场景下做sqoop自动建表(表不存在自动创建);客户另一方面期望在使用orc存储的场景下做sqoop自动建表;解放方案:针对两个需求,实现demo如下:
代码语言:bash复制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参数。
问题四:Hive 变更默认引擎为 Tez 后导致的 sqoop 不可用问题问题异常:代码语言:javascript代码运行次数:0运行复制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后追加以下命令:
代码语言:javascript代码运行次数:0运行复制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下:
代码语言:javascript代码运行次数:0运行复制ln -s /usr/local/service/tez/conf/tez-site.xml /usr/local/service/sqoop/conf问题解决。
注:这些操作在提交机上变更即可。
问题五:sqoop jackson.databind 问题问题异常:java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.ObjectMapper
因为报错为无法判断为初始化类,所以判断是包冲突或是包版本问题。
解决过程:去sqoop lib目录查看对应的包,发现有多个jackson.databind包;全盘搜了一下集群中使用jackson包是什么版本;mv走了低版本的jackson包,并将hive lib下所有的jackson包全部拷贝到sqoop lib下,问题解决。
问题六:Sqoop 导出中文乱码问题问题说明:Sqoop导出数据到hive时出现中文乱码问题
问题分析乱码问题由于两个平台数据编码不一致造成的,或者远程连接平台编码问题以及sqoop命令中编码问题。
解决方案:1. 在mysql的jdbc连接uri中指明编码格式:
代码语言:bash复制jdbc:mysql://
问题七:Hue workflow 执行 shell sqoop 报找不到 class 的问题问题异常:代码语言:javascript代码运行次数:0运行复制Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormatConsole执行可以成功,但是workflow执行报错。
解决过程:思路:如果console执行能成功,解决思路就是先定位到底哪个节点不行,再对比一下有什么区别。
1. org.apache.hadoop.mapreduce.InputFormat缺这个class,可以定位到是缺这个包:
代码语言:bash复制/usr/local/service/sqoop/lib/hadoop-mapreduce-client-core-2.8.5.jar2. 将这个包hadoop-mapreduce-client-core-2.8.5.jar直接在所有节点分发;
3. 这时发现报了一个新的错误:
代码语言:bash复制java.lang.NoClassDefFoundError;java.io.IOException: Cannot initialize Cluster这个问题比较难定位,一般是缺了很多包导致;
4. 然后将console可执行节点上的包分发到所有节点,问题解决。
注:另一种情况,会出现所有节点都无法成功执行,报错
代码语言:javascript代码运行次数:0运行复制Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat这时候将hadoop-mapreduce-client开头的8个jar包放到/usr/local/service/sqoop/lib/路径下即可。