Sqoop导入Hive默认目录及MySQL全表导入失败问题咨询
问题1:Sqoop导入Hive的默认目标目录及可配置性
- 默认目标目录:Sqoop导入Hive的过程分两步,首先会把数据临时存到HDFS的
/user/<当前执行用户名>/<表名>目录下,之后Hive会将这份数据迁移到自己的仓库目录——通常是/user/hive/warehouse/<数据库名>.db/<表名>,这也是Hive表默认的存储路径。 - 是否可配置:完全可以。你有两种配置方式:
- 用
--target-dir参数指定Sqoop导入HDFS的临时目录,Hive会从这个目录加载数据到仓库; - 先在Hive中手动创建表并通过
LOCATION指定存储路径,然后Sqoop导入时跳过--create-hive-table,用--hive-table指定已创建的表,数据就会直接落到你指定的位置。
- 用
问题2:解决import-all-tables执行失败的问题
从你提到的报错(输出目录已存在)来看,核心原因是Sqoop要生成的HDFS临时目录已经存在。import-all-tables会为每个表在/user/<当前用户名>/<表名>路径下生成数据文件,如果你之前单独导入过categories表,或者这个目录因其他原因已存在,就会触发冲突报错。
给你两个解决思路:
手动清理已存在的目录:
先删除冲突的HDFS目录(以categories表为例),执行命令:hdfs dfs -rm -r /user/<你的用户名>/categories记得把
<你的用户名>替换成实际执行Sqoop命令的用户。修改Sqoop命令,自动清理目录:
在原有命令中添加--delete-target-dir参数,让Sqoop在导入每个表前自动删除已存在的目标目录,修改后的命令如下:sqoop import-all-tables -m 1 \ --connect=jdbc:mysql://ms.itversity.com/retail_db \ --username=retail_user \ --password=itversity \ --hive-import \ --hive-overwrite \ --create-hive-table \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec \ --outdir java_output0322 \ --delete-target-dir注意:
--hive-overwrite只负责覆盖Hive表的数据,不会处理Sqoop导入HDFS的临时目录,所以必须配合--delete-target-dir才能解决目录冲突问题。
内容的提问来源于stack exchange,提问作者Choix
相关产品推荐
相关产品推荐

