0


Hadoop集群模式中Sqoop数据迁移从mysql到hive报错找不到数据库

问题描述

将MySql中的数据通过Sqoop迁移到Hive中,实现MySql<-->Hive数据流通体系;

执行Sqoop命令后,报错无法找到目标数据库,显示导入失败,但hive中却真实导入了部分数据,属于是半成功

Sqoop命令

 root@master:/opt/sqoop-1.4.7.bin__hadoop-2.6.0/bin#
 sqoop import \
     --connect jdbc:mysql://127.0.0.1:3306/bookhub?useSSL=false \
     --username debian-sys-maint \
     --password 123456  \
     --table applications \
     --hive-import  \
     --hive-overwrite  \
     --hive-table bookhub.applications \
     --input-fields-terminated-by '\001' 

日志报错(因为第二次遇到这个问题才解决,因此图例有些不对应)

 Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLSyntaxErrorException: Unknown database 'test1'

日志显示无法在数据库中查找到目标数据库‘test1’

原因

因为搭建的是Hadoop集群模式,执行时会将Sqoop命令发送到集群中的其他主机中去执行,但是其他集群中并没有相应的mysql数据库,也就是找不到"目标数据库‘test1’"这个报错;

重点在于Sqoop命令中的"127.0.0.1"表明要求本机数据库,因此导致报错;

解决

修改"127.0.0.1"为"master"主机,因为mysql数据库储存在master主机上

 # Sqoop命令
 ./sqoop import \
     --connect jdbc:mysql://master:3306/bookhub?useSSL=false \
     --username root \
     --password 123456\
     --table users \
     --hive-import  \
     --hive-table bookhub.users \
     --target-dir /user/hive/warehouse/bookhub.db/users \
     --fields-terminated-by '\001'
     
 # 注意需要先删除hdfs中的相应目录数据
 hdfs dfs -rm  /user/hive/warehouse/bookhub.db/users/*
 hdfs dfs -rmdir  /user/hive/warehouse/bookhub.db/users 
 # 使用root用户是因为我设置了远程访问数据库的用户就是root,集群中对master数据库的访问是远程访问
 --username root \
 --password 123456\
 # 还可能遇到Public Key Retrieval is not allowed问题,及时更新驱动即可
最后任务完成

但Hive表的数据出现异常

原因

在创建Hive表时设置了表的字符间隔为',',但MySql未定义

 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

因此,原始MySQL数据的格式不符合Sqoop命令中指定的分隔符,导致Sqoop传输过程中将数据识别成了一个字段,其他值就全为null。

解决

1.创建Hive表时设置字符间隔与MySql默认的字符间隔(空格)相同

 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001';

2.Sqoop命令中也要设置相同的字符间隔(空格)

 --fields-terminated-by '\001'
标签: 数据库 mysql hive

本文转载自: https://blog.csdn.net/qq_62066736/article/details/140323453
版权归原作者 梦里拾光 所有, 如有侵权,请联系我们删除。

“Hadoop集群模式中Sqoop数据迁移从mysql到hive报错找不到数据库”的评论:

还没有评论