我正在尝试将retail_db数据库表复制到我已经创建的hive数据库中。当我执行以下代码时
sqoop import-all-tables \
--num-mappers 1 \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username=retail_dba \
--password=cloudera \
--hive-import \
--hive-overwrite \
--create-hive-table \
--outdir java_files \
--hive-database retail_stage
我的Map-reduce作业因以下错误而停止:
错误tool.ImportAllTablesTool:遇到运行导入的IOException job:org.apache.hadoop.mapred.FileAlreadyExistsException:输出 目录hdfs://quickstart.cloudera:8020 / user / cloudera / categories 已存在
我正在尝试将表复制到hive数据库,那么为什么cloudera中的现有文件会导致问题。有没有办法忽略此错误或覆盖现有文件。
答案 0 :(得分:5)
这是sqoop
导入作业的方式:
sqoop
在tmp
目录(HDFS
)中创建/导入数据,该数据是用户的主目录(在您的情况下是/user/cloudera
)
然后将数据复制到其实际的配置单元位置(即/user/hive/wearhouse
。
在运行import语句之前,此categories
目录应该存在。所以删除那个目录或重命名它。
hadoop fs -rmr /user/cloudera/categories
OR
hadoop fs -mv /user/cloudera/categories /user/cloudera/categories_1
并重新运行sqoop命令!
因此,简而言之,导入Hive
将使用hdfs作为登台位置,并且sqoop在复制(成功)到实际hdfs位置后删除登台目录/user/cloudera/categories
- 这是清理sqoop作业的最后一个阶段staging / tmp文件 - 所以如果你试图列出tmp staging dir,你就找不到了。
成功导入后:hadoop fs -ls /user/cloudera/categories
- dir将不在那里。
答案 1 :(得分:3)
Sqoop导入Hive的工作分为3个步骤:
您尚未提及--target-dir
或--warehouse-dir
,因此它会将数据放入我认为/user/cloudera/
的HDFS主目录中。
现在,对于MySQL表categories
,您可能先前已导入它。因此,/user/cloudera/categories
目录存在,您将收到此异常。
在--taget-dir
中添加任何不存在的目录,例如--taget-dir /user/cloudera/mysqldata
。然后sqoop将把上面命令导入的所有Mysql表放在这个位置。
答案 2 :(得分:0)
您无法同时使用hive-overwrite
和$ sqoop help import
。
我确认此问题的版本是;
$ sqoop version
- hive-overwrite覆盖现有数据 Hive表
adb root
adb shell
cd /data/local/tmp
export PATH =/data/local/tmp:$PATH
export PATH =/data/local/tmp/testcases:$PATH
sh ./runltp -p -l 1213reportipc.log -d /data/local/tmp/LTP13/tmp -f ipc1q
exit
Sqoop 1.4.6-cdh5.13.0
答案 3 :(得分:0)
基于上面的答案1,我发现了this。我试过了,能奏效。
因此,只需添加--delete-target-dir