案例研究:针对Hive的DDS的Impala元数据更新

您喜欢Hive的漂移同步解决方案,因为它在需要时会自动更新Hive Metastore。但是,如果您将它与Impala一起使用,则需要在每次元数据更改和文件写入之后触发Invalidate Metadata命令。

您可以使用Drift Synchronization Solution for Hive管道中的事件框架来自动执行命令,而不必手动运行命令。

启用Hive Metastore目标端和Hadoop FS目标端以生成事件。您可以将两个事件流都连接到单个Hive Query执行器。然后,每次Hive Metastore目标端更改Hive Metastore时,以及每次Hadoop FS将文件写入Hive表时,执行器都运行Invalidate Metadata命令。

运作方式如下:

以下针对Hive管道的漂移同步解决方案从目录中读取文件。Hive Metadata处理器评估数据的结构变化。它将数据传递到Hadoop FS,并将元数据记录传递到Hive Metastore目标端。Hive Metastore基于它收到的元数据记录在Hive中创建和更新表:

  1. 配置Hive Metastore目标端以生成事件。

    在“General”选项卡上,选择“Produce Events”属性。

    现在,事件输出流变得可用,并且Hive Metastore目标端在每次更新Hive Metastore时都会生成一个事件记录。事件记录包含已创建或更新的表的名称。

  2. 我们还需要向Hadoop FS目标端添加事件流,以便每次目标将文件写入Hive时都可以运行Invalidate Metadata命令。因此,在Hadoop FS目标中的“General选项卡上,选择“Produce Events

    通过选择此属性,事件输出流变得可用,并且Hadoop FS每次关闭文件时都会生成事件记录:

  3. Hadoop FS目标端生成的事件记录不包括Hive Query执行器所需的表名,但它在文件路径中包含表名。因此,将Expression Evaluator处理器添加到事件流。创建一个新的表字段,并使用以下表达式:
    `${file:pathElement(record:value('/filepath'), -3)}`.`${file:pathElement(record:value('/filepath'), -2)}`
    此表达式使用事件记录的Filepath字段中的路径并执行以下计算:

    • 提取路径的倒数第二部分,并将其用作数据库名称。
    • 提取路径的倒数第二部分,并将其用作表名。

    因此,当Hadoop FS完成文件时,它将在文件路径字段中写入已写入文件的路径,例如users/logs/server1weblog.txt。上面的表达式正确地将数据库和表名解释为:logs.server1weblog。

  4. 添加Hive Query执行器,并将Hive Metastore目标端和Expression Evaluator连接到该执行器。然后配置Hive Query执行器。
    注意:如果要使用Impala JDBC驱动程序,请确保将驱动程序安装为Hive Query执行器的外部库。有关更多信息,请参阅安装Impala驱动程序。使用Data Collector随附的Apache Hive JDBC驱动程序时,不需要其他步骤。

    在Hive Query执行器中,在“Hive”选项卡上配置Hive配置详细信息。如果您在配置URL时遇到任何问题,请参阅我们的Ask StreamSets帖子中的Impala驱动程序信息。

    然后,在“Query选项卡上,输入以下查询:

    invalidate metadata ${record:value('/table')}

    该查询刷新指定表的Impala缓存。该表既可以是刚刚更新的Hive Metastore事件记录中的表,也可以是Hadoop FS写入文件的表。

    这是最后的管道:

    有了这些新的事件流,Hive Metastore目标每次创建表,分区或列,并且每次Hadoop FS目标完成写入文件时,目标都会生成事件记录。当Hive Query执行器收到事件记录时,它将运行Invalidate Metadata命令,以便Impala可以使用新信息更新其缓存。完成!