前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「EMR 开发指南」之 Sqoop 常见问题处理

「EMR 开发指南」之 Sqoop 常见问题处理

原创
作者头像
岳涛
发布2024-03-01 10:49:50
2530
发布2024-03-01 10:49:50
举报
文章被收录于专栏:大数据生态大数据生态

说明

本文描述问题及解决方法同样适用于 弹性 MapReduce(EMR)

背景

Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输数据的开源工具。它允许用户在Hadoop分布式文件系统(HDFS)和外部结构化数据存储之间进行数据导入和导出操作。Sqoop的主要优势在于,它可以有效地将大量数据从关系数据库迁移到Hadoop环境中,以便进行大数据分析和处理。

然而,在使用Sqoop时,开发者可能会遇到一些常见的问题。为了帮助开发者更有效地利用Sqoop,本文将介绍一些关于Sqoop的常见问题处理方法。

问题一:Sqoop无法初始化derby class

问题异常:

代码语言:javascript
复制
Error:Could not initialize class org.apache.derby.jdbc.AutoloaderDriver40

因为报错为无法判断为初始化类,所以判断是包冲突或是包版本问题。

解决过程:

  1. 去sqoop lib目录查看对应的包,发现有多个derby包;
  2. 然后全盘搜了一下集群中使用derby的包为什么版本;
  3. 然后删除了sqoop lib下多余的derby包,问题解决。

原因:

这种情况一般是之前遇到过derby相关的sqoop问题,从网上找的解决方案随便下载了一个derby包放在sqoop lib下,导致包冲突。

问题二:sqoop import SQLException in nextKeyvalue

问题异常:

代码语言:tex
复制
Error: java.io.IOException: SQLException in nextKeyvalue

解决过程:

  1. 分析Exception类型为IO问题,IO问题一般都是数据问题,进一步查看报错数据;
  2. 报错信息里的记录为:java.sql.SQLExceptipn: Value ‘2018-01-20 02:06:24....’
  3. 通过上面两步的分析,可以判断得出结论:问题为记录中存在日期格式异常,需要在mysql jdbc url里指定一个参数:&zeroDateTimeBehavior=convertToNull
  4. 方案发给客户之后,客户反馈问题解决。

问题三:Sqoop 在使用 cos 存储场景下自动创建 orc 表

需求:

  1. 客户期望在使用cos做存储的场景下做sqoop自动建表(表不存在自动创建);
  2. 客户另一方面期望在使用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
复制
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
复制
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
复制
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

因为报错为无法判断为初始化类,所以判断是包冲突或是包版本问题。

解决过程:

  1. 去sqoop lib目录查看对应的包,发现有多个jackson.databind包;
  2. 全盘搜了一下集群中使用jackson包是什么版本;
  3. mv走了低版本的jackson包,并将hive lib下所有的jackson包全部拷贝到sqoop lib下,问题解决。

问题六:Sqoop 导出中文乱码问题

问题说明:

Sqoop导出数据到hive时出现中文乱码问题

问题分析

乱码问题由于两个平台数据编码不一致造成的,或者远程连接平台编码问题以及sqoop命令中编码问题。

解决方案:

1. 在mysql的jdbc连接uri中指明编码格式:

代码语言:bash
复制
jdbc:mysql://<ip>:3306/<db>?useUnicode=true&characterEncoding=utf-8

2. 另一种原因是因为指定了--direct参数,取消即可。

问题七:Hue workflow 执行 shell sqoop 报找不到 class 的问题

问题异常:

代码语言:javascript
复制
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat

Console执行可以成功,但是workflow执行报错。

解决过程:

思路:

如果console执行能成功,解决思路就是先定位到底哪个节点不行,再对比一下有什么区别。 1. org.apache.hadoop.mapreduce.InputFormat缺这个class,可以定位到是缺这个包:

代码语言:bash
复制
/usr/local/service/sqoop/lib/hadoop-mapreduce-client-core-2.8.5.jar

2. 将这个包hadoop-mapreduce-client-core-2.8.5.jar直接在所有节点分发;

3. 这时发现报了一个新的错误:

代码语言:bash
复制
java.lang.NoClassDefFoundError;java.io.IOException: Cannot initialize Cluster

这个问题比较难定位,一般是缺了很多包导致;

4. 然后将console可执行节点上的包分发到所有节点,问题解决。

注:

另一种情况,会出现所有节点都无法成功执行,报错

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 背景
  • 问题一:Sqoop无法初始化derby class
    • 问题异常:
      • 解决过程:
        • 原因:
        • 问题二:sqoop import SQLException in nextKeyvalue
          • 问题异常:
            • 解决过程:
            • 问题三:Sqoop 在使用 cos 存储场景下自动创建 orc 表
              • 需求:
                • 解放方案:
                  • 参数详解:
                  • 问题四:Hive 变更默认引擎为 Tez 后导致的 sqoop 不可用问题
                    • 问题异常:
                      • 问题原因:
                        • 解决方案:
                        • 问题五:sqoop jackson.databind 问题
                          • 问题异常:
                            • 解决过程:
                            • 问题六:Sqoop 导出中文乱码问题
                              • 问题说明:
                                • 问题分析
                                  • 解决方案:
                                  • 问题七:Hue workflow 执行 shell sqoop 报找不到 class 的问题
                                    • 问题异常:
                                      • 解决过程:
                                        • 注:
                                        相关产品与服务
                                        弹性 MapReduce
                                        弹性 MapReduce (EMR) 是基于云原生技术和泛 Hadoop 生态开源技术的安全、低成本、高可靠的开源大数据平台。提供易于部署及管理的 Hive、Spark、HBase、Flink、StarRocks、Iceberg、Alluxio 等开源大数据组件,帮助客户高效构建云端企业级数据湖技术架构。
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档