Import 使用sqoop导入配置单元时,获取文件存在错误

Import 使用sqoop导入配置单元时,获取文件存在错误,import,hive,sqoop,Import,Hive,Sqoop,我正在尝试将retail_db数据库表复制到我已经创建的配置单元数据库中。当我执行以下代码时 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-ta

我正在尝试将retail_db数据库表复制到我已经创建的配置单元数据库中。当我执行以下代码时

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
My Map reduce作业因以下错误而停止:

错误工具.ImportAllableTool:运行导入时遇到IOException 作业:org.apache.hadoop.mapred.filealreadyexistException:输出 目录hdfs://quickstart.cloudera:8020/user/cloudera/categories 已经存在


我正在尝试将这些表复制到配置单元数据库,那么为什么cloudera中的现有文件会导致这个问题。有没有办法忽略此错误或覆盖现有文件。

Sqoop导入到配置单元分3步进行:

  • 将数据放入HDFS
  • 创建配置单元表(如果不存在)
  • 将数据加载到配置单元表中
您没有提到
--target dir
--warehouse dir
,因此它会将数据放在HDFS主目录中,我相信在您的情况下,
/user/cloudera/

现在对于MySQL表
categories
,您可能已经在前面导入了它。因此,
/user/cloudera/categories
目录存在,您将获得此异常


--taget dir
中添加任何不存在的目录,如
--taget dir/user/cloudera/mysqldata
。然后,sqoop将把上述命令导入的所有Mysql表放在这个位置。

这就是
sqoop
imports作业的工作方式:

  • sqoop
    tmp
    目录(
    HDFS
    )中创建/导入数据,该目录是用户的主目录(在您的示例中是
    /user/cloudera

  • 然后将数据复制到其实际蜂窝位置(即,
    /user/hive/wearhouse

  • 在运行导入语句之前,此
    目录应该已经存在。因此,请删除该目录或重命名它(如果它很重要)

hadoop fs-rmr/user/cloudera/categories

hadoop fs-mv/user/cloudera/categories/user/cloudera/categories_1

并重新运行sqoop命令

因此,简而言之,导入到
Hive
将使用hdfs作为暂存位置,sqoop在复制(成功)到实际hdfs位置后删除暂存目录
/user/cloudera/categories
——这是sqoop作业清理暂存/tmp文件的最后一个阶段——因此,如果您尝试列出tmp暂存目录,您将找不到它


成功导入后:
hadoop fs-ls/user/cloudera/categories
-dir将不在那里。

您不能同时使用
配置单元导入
配置单元覆盖

我确认这个问题的版本是

$ sqoop help import
--配置单元覆盖覆盖中的现有数据 蜂箱桌

Sqoop 1.4.6-cdh5.13.0

参考

根据上面的答案#1,我找到了。我试过了,效果很好


因此,只需添加--delete target dir

如果map reduce重新尝试,会发生什么?如果oozie重新尝试该任务,它会抛出目录已存在错误。如何更正它?@Simrankaur您可以使用
--delete target dir
。在将数据写入此目录之前,它会删除命令中提供的内容。但我没有使用target dir,我正在使用--warehouse dir。它会删除它吗?
$ sqoop version