我正在尝试将零售数据库表复制到我已经创建的配置单元数据库中。当我执行以下代码时
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作业停止并出现以下错误:
error tool.importalltablestool:运行导入作业时遇到ioexception:org.apache.hadoop.mapred.filealreadyexistsexception:输出目录hdfs://quickstart.cloudera:8020/user/cloudera/categories已存在
我正在尝试将表复制到配置单元数据库,那么为什么cloudera中的现有文件会导致此问题。是否有方法忽略此错误或覆盖现有文件。
4条答案
按热度按时间z8dt9xmd1#
sqoop导入到配置单元分为3个步骤:
将数据放入hdfs
创建配置单元表(如果不存在)
将数据加载到配置单元表
你没有提到
--target-dir
或者--warehouse-dir
,所以它会把数据放在hdfs主目录中,我相信/user/cloudera/
对你来说。现在是mysql表
categories
你可能早就导入了。所以,/user/cloudera/categories
目录存在,您将得到此异常。在中添加任何不存在的目录
--taget-dir
就像--taget-dir /user/cloudera/mysqldata
. 然后sqoop将把上面命令导入的所有mysql表放在这个位置。gz5pxeao2#
这是怎么回事
sqoop
导入作业:sqoop
在中创建/导入数据tmp
目录(HDFS
)这是用户的home dir(在您的情况下是/user/cloudera
).然后将数据复制到其实际配置单元位置(即。,
/user/hive/wearhouse
.这个
categories
在运行import语句之前,dir应该已经存在。因此,删除该目录或重命名它,如果它是重要的。hadoop fs -rmr /user/cloudera/categories
或hadoop fs -mv /user/cloudera/categories /user/cloudera/categories_1
重新运行sqoop命令!简而言之,输入到
Hive
将使用hdfs作为暂存位置,sqoop删除暂存目录/user/cloudera/categories
在复制(成功地)到实际的hdfs位置之后-这是sqoop作业的最后一个清理staging/tmp文件的阶段-所以如果您尝试列出tmp staging dir,您将找不到它。导入成功后:
hadoop fs -ls /user/cloudera/categories
-迪尔不会在那里。piwo6bdm3#
你不能使用
hive-import
以及hive-overwrite
同时。我确认这个问题的版本是;
--配置单元覆盖覆盖配置单元表中的现有数据
sqoop 1.4.6-cdh5.13.0版本
裁判。https://stackoverflow.com/a/22407835/927387
2w2cym1i4#
根据上面的答案1,我发现了这个。我试过了,而且成功了。
所以,只需添加——删除目标目录