使用sqoop导入Hive时获取文件存在错误

时间:2016-07-29 01:16:11

标签: import hive sqoop

我正在尝试将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中的现有文件会导致问题。有没有办法忽略此错误或覆盖现有文件。

4 个答案:

答案 0 :(得分:5)

这是sqoop导入作业的方式:

  • sqooptmp目录(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个步骤:

  • 将数据放入HDFS
  • 创建Hive表(如果不存在)
  • 将数据加载到Hive表

您尚未提及--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

REF。 https://stackoverflow.com/a/22407835/927387

答案 3 :(得分:0)

基于上面的答案1,我发现了this。我试过了,能奏效。

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