Sqoop相关问题笔记(持续更新)

目录

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 安装元数据库

                  2.MySQL之权限管理(mysql.user表详解)

                  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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值