使用Sqoop从MySQL导入Hive后,abc库tab1表无数据问题排查
解决Sqoop导入Hive后表无数据的问题
咱们一步步拆解可能的问题,帮你搞定这个空表的情况:
1. 先检查命令参数是否和实际需求匹配
你说要把MySQL的inst库stu表导入Hive的abc.tab1,但你的命令里几个关键参数明显不对:
- 连接串里的MySQL库是
i,不是inst,得改成--connect jdbc:mysql://mysql.example.com/inst - 指定的MySQL表是
Student,不是stu,要改成--table stu - Hive表名写的是
databasename.tablename,得换成--hive-table abc.tab1
另外,--hive-home参数现在基本不需要指定,Hive的默认配置已经包含仓库路径,留着反而可能出问题,建议删掉。
修正后的命令大概是这样:
sqoop import \ --connect jdbc:mysql://mysql.example.com/inst \ --username root \ --password root \ --table stu \ --hive-import \ --create-hive-table \ --hive-table abc.tab1 \ -m 1
2. 确认MySQL源表本身有没有数据
别光盯着导入后的Hive表,先登录MySQL执行 select count(*) from inst.stu; 看看源表到底有没有数据。如果源表本身就是空的,那导入后Hive表自然也没东西,这时候得先搞定源数据的问题。
3. 扒一扒Sqoop的执行日志找报错
执行Sqoop命令的时候,一定要仔细看控制台输出的日志,有没有红色的错误提示:
- 比如MySQL连接失败?那可能是root用户没有远程访问权限,你可以在MySQL里执行
grant all on inst.* to 'root'@'%' identified by 'root'; flush privileges;开一下权限,然后用mysql -h mysql.example.com -u root -proot测试能不能连上 - 有没有提示“Imported 0 records”?那要么源表没数据,要么Sqoop过滤了数据(你这里没加where条件,大概率是源表空)
- 有没有Hive相关的错误,比如“无法创建表”“写入HDFS权限不足”?这些都会导致数据导不进去
4. 检查Hive表的存储路径和数据文件
如果Sqoop说导入成功,但Hive查不到数据,先在Hive里执行 desc formatted abc.tab1; 找到表的存储路径(看Location字段),比如hdfs://xxx/user/hive/warehouse/abc.db/tab1。
然后用HDFS命令看看这个路径下有没有数据文件:
hdfs dfs -ls /user/hive/warehouse/abc.db/tab1
- 如果没有任何文件,说明Sqoop根本没把数据写到HDFS,回到日志找原因
- 如果有
part-m-00000这类文件,那就看看文件里有没有内容:
hdfs dfs -cat /user/hive/warehouse/abc.db/tab1/part-m-00000
要是文件有数据但Hive查不到,大概率是表结构不匹配(比如字段类型、分隔符不对),或者需要执行 msck repair table abc.tab1; 修复一下Hive的元数据。
5. 权限问题别忽略
- 执行Sqoop的用户有没有HDFS的写入权限?比如能不能创建
/user/hive/warehouse/abc.db/tab1路径?可以用hdfs dfs -mkdir -p /user/hive/warehouse/abc.db/tab1测试,报错的话就得给用户授权 - 另外,Hive的
abc库得先存在吧?如果还没创建,先在Hive里执行create database abc;再导入
内容的提问来源于stack exchange,提问作者Ankit Tyagi
相关产品推荐
相关产品推荐

