使用Presto + Hive删除分区的最佳方法

时间:2019-07-16 14:01:43

标签: hive bigdata presto partition

我们有一个Amazon EMR集群(v5.19.0),我们在Hive(v2.3.2)上使用Presto(v0.212)处理数据。当主题是数据读取和写入时,它是一个庞然大物,并且可以很快完成所有操作。

另一方面,我对数据排除选项感到非常沮丧。关于数据访问和在Internet上写入的文章很多,但是除了有关数据删除的基本用例之外,几乎没有其他文章。这是我尝试使用的一些方法:

  • Presto delete statement,它似乎随机失败。它适用于小型表,但它开始引发其他表的随机异常(其中大多数与丢失的文件有关)。我们正计划尽快更新EMR版本,以查看此问题是否仍然存在,但暂时不可靠(或我们配置了错误的内容);

  • 配置单元删除分区语句。这一步出奇的慢。对于较大的表(超过4000个分区),删除引用空/已删除文件夹的分区需要花费几分钟。我真的不明白这个命令怎么会这么慢;

  • Amazon S3 / HDFS RMDIR命令。实际上,我们使用的是它,它可以在不到一秒钟的时间内删除分区。

当我们使用Presto查询访问数据时,最后一种方法似乎工作良好。但是,我们注意到分区仍然存在于Hive Metastore中,这使得Hive在尝试执行任何查询并增加其上的分区数量时引发异常。由于Hive删除分区的速度非常慢,因此我们不知道该怎么做才能保持Metastore的干净并有一个快速的过程。

在Hive文档中,有一个有关MSCK REPAIR TABLE command的部分,其中包括删除缺失分区的选项。可悲的是,当我尝试使用“ DROP PARTITIONS”参数在终端上运行它时,它显示了一条错误消息“ FAILED:ParseException行1:34在“ TABLENAME”附近的“ drop”处缺少EOF”。因此,我认为我的Hive版本不兼容或存在错误。

那么,您知道使用像我的这样的配置在真实系统上删除分区的好方法吗?请告诉我如何删除大数据管道上的数据,以查看是否可以找到解决问题的灵感。另外,如果您知道从Hive中仅删除分区引用或列出其数据已删除的所有分区的某些方法,也请告诉我。谢谢!

3 个答案:

答案 0 :(得分:1)

如您所见,如果将分区数据(文件和目录)放在S3或HDFS上,则仍需要从Hive元存储中注销分区。

将存储状态与metastore状态同步的Hive方法是MSCK REPAIR TABLE

将存储状态与metastore的状态同步的Presto方法是system.sync_partition_metadata Presto Hive connector procedure

答案 1 :(得分:0)

尝试使用ALTER TABLE table_name RECOVER PARTITIONS;而不是MSCK REPAIR TABLE命令。在AWS上应该可以正常工作。

答案 2 :(得分:0)

在此处包括有关我如何解决此问题的更多详细信息。请注意,如果可能,请避免使用此解决方案,并使用数据处理工具中的“删除”功能。

  • 首先,请尽可能使用Hive ALTER TABLE table_name DROP PARTITION(...语句;
  • 如果速度太慢,请使用分区键字段使用aws s3 rmhadoop fs -rm之类的命令删除分区文件夹;
  • 最后,在Hive上,将表转换为EXTERNAL表只是为了更快地清理其元数据,因为在上一步中,您已经删除了其数据:
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='TRUE');
ALTER TABLE tablename DROP PARTITION(...
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');

如果您使用的是更新版本的Presto,请另外勾选Piotr's answer,以查看删除分区的好方法。