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