因为项目使用Presto作为ETL使用,需要将关系库中的数据导入到Hive中。目前关系库中的数据每天导入一次,在Hive中以天为间隔创建新的分区。思路是正确的,但是在使用的过程中,发现将少量关系库中的数据通过Presto快速并多次导入到Hive中时会出现如下错误:

com.facebook.presto.spi.PrestoException: Unable to rename from hdfs://cloud171:8020/tmp/presto-root/34923b62-7933-46f8-b016-8b05c7a6dd0e/liutest01_dept_part=2017-08-04 00%3A00%3A00.0 to hdfs://cloud171:8020/user/hive/warehouse/liutest01_dept/liutest01_dept_part=2017-08-04 00%3A00%3A00.0: target directory already exists
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore.renameDirectory(SemiTransactionalHiveMetastore.java:1543)
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore.access$2500(SemiTransactionalHiveMetastore.java:81)
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore$Committer.prepareAddPartition(SemiTransactionalHiveMetastore.java:984)
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore$Committer.access$700(SemiTransactionalHiveMetastore.java:819)
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore.commitShared(SemiTransactionalHiveMetastore.java:749)
    at com.facebook.presto.hive.metastore.SemiTransactionalHiveMetastore.commit(SemiTransactionalHiveMetastore.java:671)
    at com.facebook.presto.hive.HiveMetadata.commit(HiveMetadata.java:1312)
    at com.facebook.presto.hive.HiveConnector.commit(HiveConnector.java:177)
    at com.facebook.presto.transaction.TransactionManager$TransactionMetadata$ConnectorTransactionMetadata.commit(TransactionManager.java:578)
    at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
    at io.airlift.concurrent.BoundedExecutor.drainQueue(BoundedExecutor.java:77)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

因为之前看过Presto的一些源码,对于上述错误的原因因该是Presto中元数据的缓存造成的。了解Hive的读者因该知道,Hive中的每张表都对应一个文件夹,分区也不例外,如果要新建分区的话会在该表的目录下新建文件夹,文件夹的名称为该分区的名称,对于一些特殊的字符串Hive会做处理,避免非法的文件名。当Presto向Hive中插入数据时会首先在内存中查看当前表的元数据,如果已经有了这个分区就直接向这个分区插入新的数据,如果没有这个分区首先会将数据写入到Hive的tmp目录下,等操作结束后修改为目标路径。但是Presto的缓存不可能这么快的感知到Hive中元数据的变化,第二次向这个分区插入数据时,因为它依然认为该表没有这个分区,又会执行新建分区的操作,文件夹是不可能重名的,所以会抛出这个异常。这个猜想也很好证实,首次创建这个分区之后等几秒在对这个分区做数据的插入操作就不会出现这个异常了,因为Presto已经刷新了缓存。

Presto向分区表快速插入数据时出现'target directory already exists'的原因的更多相关文章

  1. mysql插入数据时,中文乱码

    MySQL 插入数据时,中文乱码问题的解决(转) 当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1 ...

  2. (转)MySQL 插入数据时,中文乱码问题的解决

    MySQL 插入数据时,中文乱码问题的解决  原文:http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html 当向 MySQL 数据库插 ...

  3. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  4. Mybatis + Mysql 插入数据时中文乱码问题

    近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...

  5. 【JDBC】向数据表插入数据时,自动获取生成的主键

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

  6. 触发器修改后保存之前的数据 表中插入数据时ID自动增长

    create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...

  7. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  8. inserted触发器,一张表插入数据时,同时向另外一张表插入数据

    有时候,一个服务器上有多个数据库,需要向其中一个数据库的表中插入数据时, 同时向另外一个数据的表里插入数据. 可以利用触发器和同义词(建立同义词的方法省略), 在一个数据库的表里插入数据时,同时向另外 ...

  9. MySQL插入数据时插入无效的列

    1.错误描述 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field list' ...

随机推荐

  1. 关于Vue vue-cli安装遇到的一些问题

    先给出能正确安装的步骤: 1.进盘符 2,为啥不用npm,这是国外的东西,有些电脑无法FQ,会导致安装失败,或者下载速度很慢 3 4 5这是其中一步要填的,自己选择需要啥 问题:用npm安装带来的麻烦 ...

  2. 网页中区分IE各版本

    CSS Hack 直接在CSS文件中写CSS Hack是非常直观的区分方法.区分不同IE版本的hack代码为 #content{ background:red; /* 所有浏览器 */ backgro ...

  3. [命令行] curl查询公网出口IP

    转载:http://blog.csdn.net/orangleliu/article/details/51994513 不管是在家里还是办公室,或者是公司的主机,很多时候都是在内网中,也就是说很多都是 ...

  4. java--while、do while、for三种循环体

    1.for可以记录执行次数: 2.while.do while的i放在sum的后面和for得到的执行次数和结果是一致的. 1.从执行结果来看,放在前面,虽然执行次数和i放在sum的后面是相同,但是结果 ...

  5. MySQL(一)--基本语法与常用语句

    将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database,DB). 将姓名.住址.电话号码.邮箱地址.爱好和家庭构成等数据保存到数据库中,就可以随时迅速获取想要的 ...

  6. Apollo框架试玩

    2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...

  7. RabbitMQ系列教程之五:主题(Topic)

    (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词.   在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚拟广播的[Fanout]交换机,而是使用了[D ...

  8. OJ2237第k小数题解

    题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...

  9. MySQL常用基本命令

    启动MySQL /etc/init.d/mysqld start 优雅的关闭数据库的方法 1:使用MySQLadmin mysqladmin -uroot -p123456 shutdown 2:使用 ...

  10. 动态数组ArrayList的使用

    1.定义类 package com.realhope.rmeal.bean; /** * * @author Wucy * 菜谱类 */ public class Menu{ private Inte ...