我们有一个amazonemr集群(v5.19.0),其中我们在hive(v2.3.2)上使用presto(v0.212)来处理数据。当主题是数据读写时,它是一个怪物,做任何事情都非常快。
另一方面,我对数据排除选项相当失望。在互联网上有很多关于数据访问和写入的帖子,但是几乎没有关于数据删除的基本用例。以下是我尝试使用的一些方法:
presto delete语句,该语句似乎随机失败。它对小表很好,但对其他表(大多数是关于它正在删除的丢失文件)会引发随机异常。我们计划很快更新emr版本,看看这个问题是否会停止,但是暂时来说,它不可靠(或者我们配置了错误的东西);
配置单元删除分区语句。这个速度慢得出奇。对于较大的表(超过4000个分区),删除引用空/已删除文件夹的分区需要几分钟。我真不明白这个命令怎么会这么慢;
amazons3/hdfs rmdir命令。实际上我们正在使用这个,它可以在不到一秒钟内删除分区。
当我们使用presto查询访问数据时,最后一种方法似乎工作得很好。但是,我们注意到分区仍然存在于hivemetastore上,这使得hiveraise在尝试执行任何查询时出现异常,并增加了其上的分区数量。由于hive删除分区的速度非常慢,所以我们不知道该怎么做才能保持元存储的干净和快速处理。
在配置单元文档中,有一节介绍msck repair table命令,其中包括删除丢失分区的选项。遗憾的是,当我尝试使用“drop partitions”参数在终端上运行它时,它显示了一条错误消息“failed:parseexception line 1:34 missing eof at'drop'near'tablename'”。所以我认为我的Hive版本不兼容或者有一个bug。
那么,您知道一个好的方法来删除一个真正的系统上的分区使用像我这样的配置吗?请告诉我你如何删除你的大数据管道上的数据,看看我是否能找到一些启发我的问题。另外,如果您知道从配置单元中仅删除分区引用或列出其数据被删除的所有分区的方法,请告诉我。谢谢!
3条答案
按热度按时间2admgd591#
正如您所观察到的,如果您在s3或hdfs上删除分区数据(文件和目录),那么仍然需要从配置单元元存储中注销分区。
将存储状态与元存储状态同步的配置单元方法是
MSCK REPAIR TABLE
.将存储状态与元存储状态同步的最佳方法是
system.sync_partition_metadata
presto hive连接器程序。w8f9ii692#
尝试
ALTER TABLE table_name RECOVER PARTITIONS;
而不是MSCK REPAIR TABLE
命令。在aws上应该可以用。5rgfhyps3#
包括我如何解决这个问题的更多细节。请注意,如果可能,请避免使用此解决方案,并使用数据处理工具中的delete函数。
首先,试着用Hive
ALTER TABLE table_name DROP PARTITION(...
声明(如有可能);如果速度太慢,请使用partition key字段,使用如下命令删除分区文件夹
aws s3 rm
或者hadoop fs -rm
;最后,在hive上,将表转换为外部表只是为了更快地清理其元数据,因为在上一步中您已经删除了其数据:
如果您使用的是更更新的presto,还可以检查piotr对这个答案的回答,看看删除分区的好方法。