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

c7rzv4ha  于 2021-06-03  发布在  Sqoop
关注(0)|答案(4)|浏览(321)

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

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中的现有文件会导致此问题。是否有方法忽略此错误或覆盖现有文件。

z8dt9xmd

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表放在这个位置。

gz5pxeao

gz5pxeao2#

这是怎么回事 sqoop 导入作业: sqoop 在中创建/导入数据 tmp 目录( HDFS )这是用户的home dir(在您的情况下是 /user/cloudera ).
然后将数据复制到其实际配置单元位置(即。, /user/hive/wearhouse .
这个 categories 在运行import语句之前,dir应该已经存在。因此,删除该目录或重命名它,如果它是重要的。 hadoop fs -rmr /user/cloudera/categorieshadoop 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 -迪尔不会在那里。

piwo6bdm

piwo6bdm3#

你不能使用 hive-import 以及 hive-overwrite 同时。
我确认这个问题的版本是;

$ sqoop help import

--配置单元覆盖覆盖配置单元表中的现有数据

$ sqoop version

sqoop 1.4.6-cdh5.13.0版本
裁判。https://stackoverflow.com/a/22407835/927387

2w2cym1i

2w2cym1i4#

根据上面的答案1,我发现了这个。我试过了,而且成功了。
所以,只需添加——删除目标目录

相关问题