我们有一个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中仅删除分区引用或列出其数据已删除的所有分区的某些方法,也请告诉我。谢谢!
答案 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)
在此处包括有关我如何解决此问题的更多详细信息。请注意,如果可能,请避免使用此解决方案,并使用数据处理工具中的“删除”功能。
ALTER TABLE table_name DROP PARTITION(...
语句; aws s3 rm
或hadoop fs -rm
之类的命令删除分区文件夹; ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='TRUE');
ALTER TABLE tablename DROP PARTITION(...
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');
如果您使用的是更新版本的Presto,请另外勾选Piotr's answer,以查看删除分区的好方法。