【问题标题】:Unique Key generation in Hive/HadoopHive/Hadoop 中的唯一密钥生成
【发布时间】:2015-03-06 06:27:04
【问题描述】:

从大数据配置单元表中选择一组记录时,需要为每条记录创建一个唯一键。在顺序操作模式下,很容易通过调用诸如 max(id) 之类的东西来生成唯一 id。由于 hive 并行运行任务,我们如何在不影响 hadoop 性能的情况下生成唯一键作为选择查询的一部分。 这真的是一个 map reduce 问题,还是我们需要采用顺序方法来解决这个问题。

【问题讨论】:

    标签: java hadoop hive bigdata


    【解决方案1】:

    使用 UUID 而不是数字。它以真正的分布式方式工作。

    select reflect("java.util.UUID", "randomUUID")
    

    【讨论】:

      【解决方案2】:
      SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1) AS SEQ_NBR 
      FROM TABLE T
      

      这里 C1 是 T 中的任何数字列。 这将在从表 T 中选择时为每条记录生成一个唯一编号,从 1 开始。如果这是一次活动,则解决方案很好。

      如果您需要每天重复此过程并将此数据插入表 T2 并生成唯一 ID,则可以尝试以下方法。

      SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1)+ SEQ_T2  AS SEQ_NBR 
      FROM TABLE T, (SELECT MAX(SEQ) AS SEQ_T2 FROM TABLE T2)
      

      希望对你有帮助!!

      【讨论】:

        【解决方案3】:

        如果出于某种原因您不想处理 UUID,那么此解决方案(基于数值)不需要您的并行单元相互“对话”或进行任何同步。 因此它非常有效,但不能保证您的整数键是连续的。

        如果您说有 N 个并行执行单元,并且您知道您的 N,并且每个单元都分配了一个从 0 到 N - 1 的 ID,那么您可以简单地在所有单元中生成一个唯一整数

        Unit #0:   0, N, 2N, 3N, ...
        Unit #1:   1, N+1, 2N+1, 3N+1, ...
        ...
        Unit #N-1: N-1, N+(N-1), 2N+(N-1), 3N+(N-1), ...
        

        根据您需要生成密钥的位置(映射器或减速器),您可以从 hadoop 配置中获取 N:

        Mapper: mapred.map.tasks
        Reduce: mapred.reduce.tasks
        

        ... 和您单位的 ID: 在 Java 中,它是:

         context.getTaskAttemptID().getTaskID().getId()
        

        不确定 Hive,但应该也可以。

        【讨论】:

        • 这是我读过的关于 Hadoop 生成唯一 ID 的最佳评论。
        猜你喜欢
        • 2010-09-08
        • 2023-04-04
        • 2013-07-18
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多