Hive“添加分区”并发

时间:2015-04-07 14:47:35

标签: hadoop hive

我们有一个外部Hive表,用于处理原始日志文件数据。这些文件是每小时一次,并按日期和源主机名进行分区。

目前我们正在使用每小时触发几次的简单python脚本导入文件。该脚本根据需要在HDFS上创建子文件夹,从临时本地存储复制新文件并将任何新分区添加到Hive。

今天,使用“ALTER TABLE ... ADD PARTITION ...”创建新分区。但是,如果在表上运行另一个Hive查询,它将被锁定,这意味着add partition命令将失败(如果查询运行的时间足够长),因为它需要独占锁。

这种方法的另一种方法是使用“MSCK REPAIR TABLE”,由于某种原因 似乎无法获取表中的任何锁。但是,我的印象是不建议在生产环境中使用修复表。

  • 在并发环境中以编程方式添加Hive分区的最佳做法是什么?
  • 使用MSCK REPAIR TABLE有哪些风险或缺点?
  • 是否有解释两个分区添加命令看似不一致的锁定行为?即它们对运行查询有不同的影响吗?

1 个答案:

答案 0 :(得分:1)

不是一个好的答案,但我们有同样的问题,这是我们的发现:

  • 在Hive文档中,this commit,锁似乎非常明智:'ADD分区'将请求对创建的分区进行独占锁定,并在整个表上请求共享锁定.SELECT查询将请求共享锁在桌子上。所以它应该没关系
  • 然而,它不会这样,至少在CDH 5.3中。根据这个帖子,https://cwiki.apache.org/confluence/display/Hive/Locking这是一个已知的行为,可能是新的(我不确定,但我也认为,作为这个帖子的作者,CDH 4.7上没有问题)

基本上,我们仍在考虑我们的分区策略,但我们可能会尝试提前创建所有可能的分区(在获取数据之前),因为我们准确地知道所有未来分区的值(可能不是你的情况)。