Hadoop 蜂巢;添加分区“;并发性

Hadoop 蜂巢;添加分区“;并发性,hadoop,hive,Hadoop,Hive,我们有一个外部配置单元表,用于处理原始日志文件数据。文件每小时一次,并按日期和源主机名进行分区 目前,我们正在使用每小时触发几次的简单python脚本导入文件。该脚本根据需要在HDFS上创建子文件夹,从临时本地存储中复制新文件,并将任何新分区添加到配置单元中 现在,新的分区是使用“altertable…addpartition…”创建的。但是,如果另一个配置单元查询正在表上运行,它将被锁定,这意味着addpartition命令将失败(如果查询运行足够长的时间),因为它需要独占锁 这种方法的另一种

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

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

现在,新的分区是使用“altertable…addpartition…”创建的。但是,如果另一个配置单元查询正在表上运行,它将被锁定,这意味着addpartition命令将失败(如果查询运行足够长的时间),因为它需要独占锁

这种方法的另一种选择是使用“MSCK修复表”,由于某些原因,它似乎无法获得表上的任何锁。然而,我得到的印象是,不建议在生产设置中使用修复表

  • 在并发环境中以编程方式添加配置单元分区的最佳实践是什么
  • 使用MSCK修复表有哪些风险或缺点
  • 两个分区添加命令的锁定行为似乎不一致,对此有何解释?也就是说,它们对运行查询有不同的影响吗

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

      • 在配置单元文档中,锁似乎非常合理:“添加分区”将请求对所创建的分区使用独占锁,对整个表使用共享锁。SELECT查询将请求对表使用共享锁。因此,这应该没问题
      • 但是,至少在CDH 5.3中,它不是这样工作的。根据这个线程,这是一个已知的行为,可能是新的(我不确定,但我也认为,作为这个线程的作者,CDH 4.7上没有这个问题)

      因此,基本上,我们仍在考虑分区策略,但我们可能会尝试提前创建所有可能的分区(在获取数据之前),因为我们确切地知道未来所有分区的值(可能不适合您).

      谢谢!非常有用的信息。不幸的是,我们没有预先创建分区的选项,因为这些分区事先不知道。但是从Google Group的讨论来看,似乎离开Hive CLI可能会有所帮助。