目录
1.Linux下Sqoop安装 Error: could not find or load main class org.apache.sqoop.Sqoop
2.MySQL驱动版本过高: Exception: Could not load db driver class: com.mysql.jdbc.Driver
3.Sqoop版本与Hadoop不一致: Found interface org.apache.hadoop.mapreduce.JobContext, but class was excepted
4.导入数据访问MySQL时被拒:SQLException: Access denied for user 'root'@'master' to database 'hive'
5.创建Hive表失败:ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
6.Hive表导出至MySQL失败,如下信息:Export job failed !
1.Linux下Sqoop安装 Error: could not find or load main class org.apache.sqoop.Sqoop
安装版本:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
1.(从节点客户端)压缩包方式安装
$ tar -zxvf /opt/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
2.修改'${SQOOP_HOME}/bin' 下的configure-sqoop文件
$ vi /opt/sqoop-1.4.7.bin__hadoop-2.6.0/bin/configure-sqoop
:将包含 HCAT_HOME、ACCUMULO_HOME、ZOOKEEPER_HOME字符串的行都注释掉,除非集群已经安装上述软件
3.(主节点root用户)修改环境变量,在/etc/profile文件后追加:
$ vi /etc/profile
export SQOOP_HOME=/opt/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$SQOOP_HOME/bin
4.立即生效环境变量
$ source /etc/profile
5.验证安装
$ sqoop version
Error: could not find or load main class org.apache.sqoop.Sqoop
--解决方法:
:将'${SQOOP_HOME}/'下的Jar包sqoop-1.4.7.jar(无需重新下载)
复制到'${SQOOP_HOME}/lib'下
$ cd /opt/sqoop-1.4.7.bin__hadoop-2.6.0
$ cp sqoop-1.4.7.jar ./lib/
6.再次验证
$ sqoop version
...
Sqoop 1.4.7
...
<即安装成功>
参考博文:1.如何寻找sqoop-1.4.6.jar文件包,解决找不到或无法加载主类org.apache.sqoop.sqoop的问题
2.MySQL驱动版本过高: Exception: Could not load db driver class: com.mysql.jdbc.Driver
1.连接数据库,显示数据库中的所有数据库实例
$ sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root -P
Enter password:
...
RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver
...
<解释:是sqoop 使用的mysql驱动版本过高,替换低版本即可>
< MySQL5 以后,使用 com.mysql.cj.jdbc.Driver>
< 对应Jar包:mysql-connector-java-8.0.13.jar>
< 之前,使用com.mysql.jdbc.Driver>
< 对应Jar包:mysql-connector-java-5.1.47.jar>
2.解决方法:下载 mysql-connector-java-5.1.47.tar.gz
解压出Jar包 mysql-connector-java-5.1.47.jar
并复制到'${SQOOP_HOME}/lib/'下,即可
$ cp mysql-connector-java-5.1.47.jar /opt/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
3.重新执行查询数据库实例命令
$ sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root -P
Enter password:
...
information_schema
hive
mysql
performance_schema
test
<此即:查询出的mysql数据库实例>
参考博文:1.com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定
3.Sqoop版本与Hadoop不一致: Found interface org.apache.hadoop.mapreduce.JobContext, but class was excepted
# 当前使用Sqoop版本为 Sqoop 1.4.5
1.连接MySQL将test数据库中的person表数据导入到HDFS中
$ sqoop import --connect jdbc:mysql://localhost:3306/test -table person -username root -P -m 1
# 出现如下错误:
Exception in thread "main" java.lang.InCompatibleClassChangeError: Found interface
org.apache.hadoop.mapreduce.JobContext, but class was excepted
2.有文章将问题解释为:sqoop与hadoop版本不一致
sqoop-1.4.4.bin__hadoop-1.0.0.tar.gz(对应hadoop1版本)
sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz(对应hadoop2版本)
3.重新安装与Hadoop2.x版本一致的Sqoop
下载:sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 支持2.x以上版本
4.重新执行导入操作
$ sqoop import --connect jdbc:mysql://localhost:3306/test -table person -username root -P -m 1
Enter password:
...
执行了Map程序(无Reduce)
...
5.查看导入结果:
$ hadoop fs -ls /user/root/person/
/user/root/person/_SUCCESS
/user/root/person/part-m-00000
<即:导入成功结果文件>
$ hadoop fs -cat /user/root/person/part-m-00000
1,wayne
2,lily
3,heidi
<即:表person的数据>
*6.执行完sqoop 导入命令后,会发现当前执行命令的文件夹下多了
一个person.java的源文件,查看源码知,Person类继承
了Writable接口,表明用于序列化和反序列化,并且包
含person表中所有字段,所以该类可以存储person表中的一条记录。
参考博文:1.Sqoop实现oracle数据导入hbase时出错
4.导入数据访问MySQL时被拒:SQLException: Access denied for user 'root'@'master' to database 'hive'
1.连接MySQL将hive数据库中的DBS表数据导入到HDFS中
$ sqoop import --connect jdbc:mysql://master:3306/hive -table DBS -username root -P -m 1
# 出现如下错误:
SQLException: Access denied for user 'root'@'master' to database 'hive'
<解释:当前IP客户端(执行命令的从节点)没有获得以root用户访问mysql数据库hive的权限>
<如果是伪分布模式,currentIP即为master代表的IP>
2.解决方式:授权用户
2.1.进入mysql
$ mysql -u root -p
Enter password:
2.2.在mysql中为当前IP的客户端授权以root用户访问数据库hive下的所有表的权限,连接登陆密码'hivepwd'
mysql> grant all privileges on hive.* to root@'currentIP' identified by 'hivepwd';
2.3.刷新配置信息至内存,使立即生效
mysql> flush privileges;
2.4.退出mysql
mysql> exit;
3.重新执行导入命令,即可成功导入,输出到MapReduce作业输出文件夹中
:查看在HDFS中创建的DBS的表目录
$ hadoop fs -ls /user/root/DBS/;
/user/root/DBS/_SUCCESS
/user/root/DBS/part-m-00000 --表数据
*4.授权成功后,在用户权限表user中会有相关记录,可查看
mysql> select host, user, password from mysql.user;
与之前整理的问题一致远端客户机登陆MySQL受阻:host 192.168.190.1 is not allowed to connect to this mysql server
参考文章:1.《Hadoop海量数据处理》2.4.1 安装元数据库
3.Host 'XXX' is not allowed to connect to this MySQL server解决方案
5.创建Hive表失败:ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
# 在上一步通过Sqoop将MySQL中Hive元数据信息导入到本地HDFS中后
# 本次,再将导入到HDFS中的数据导入到Hive中,如下:
1.执行sqoop创建Hive表命令
$ sqoop create-hive-table
--connect jdbc:mysql://master:3306/hive
--table DBS --fields-terminated-by ','
--username root -P
出现如下错误:
Error tool.CreateHiveTableTool: Encountered IOException running create table job:
java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
2.解决方式:
将hive/lib中的hive-common-2.3.4.jar拷贝到sqoop的lib目录中
$ cp /opt/hive/lib/hive-common-2.3.4.jar /opt/sqoop/lib/
3.再次执行成功,查询Hive中的DBS表目录
$ hadoop fs -ls /user/hive/warehouse/;
/user/hive/warehouse/dbs --dbs文件夹下为空
6.Hive表导出至MySQL失败,如下信息:Export job failed !
(原因之一:列分隔符不匹配)
1.执行从Hive导出表到MySQL中
$ sqoop export
--connect jdbc:mysql://master:3306/test
--table data
--export-dir /user/hive/warehouse/test.db/data
--username root -P
-m 1
--fields-terminated-by ','
注:--fields-terminated-by ',' 是将Hive表data的列分隔符告知sqoop,以便读取
出现上述截屏的Export job failed ! 的提示
2.原因是:Hive表data的列分隔符没有指定对
2.1.查看表描述
hive> desc formatted data;
...
Storage Desc parmas:
field.delim
发现 field.delim 设定的分隔符没有显示,为空,不是','
2.2.查看数据存储文件
$ hadoop fs -cat /user/hive/warehouse/test.db/data/datainput
1 2
2 3
.
.
发现列分隔符为空格
3.重新设定导出语句中的列分隔符,即可执行成功
$ sqoop export
--connect jdbc:mysql://master:3306/test
--table data
--export-dir /user/hive/warehouse/test.db/data
--username root -P
-m 1
--fields-terminated-by ' '
*4.也有尝试直接更改列分隔符
4.1.修改分隔符
hive> > alter table data SET SERDEPROPERTIES ('field.delim' = ',');
4.2.查看表描述
hive> desc formatted data;
...
Storage Desc parmas:
field.delim ,
发现列分隔符属性变为 ','
4.3.查看数据存储文件
$ hadoop fs -cat /user/hive/warehouse/test.db/data/datainput
1 2
2 3
.
.
发现列分隔符仍为空格
结论:也就是说修改分隔符只是修改了分隔符的属性值,
并没有更改实际数据存储的列分隔符,所以依然没有效果
列分隔符修改参考链接:LanguageManualDDL-AddSerDeProperties