本文档适用于Apache Kudu 1.15.0版本。请参考适用于Kudu集群版本的相应版本的文档。

5.1、概述

Kudu有一个可选的特性,允许它将自己的目录与Hive Metastore (HMS)集成。HMS是Hadoop生态系统中事实上的标准目录和元数据提供者。启用HMS集成后,外部HMS感知工具可以发现和使用Kudu表,即使它们不感知Kudu或与Kudu集成。此外,这些组件可以使用HMS发现连接到拥有表的Kudu集群所需的信息,例如Kudu主地址。

5.2、数据库和表名

由于Hive Metastore集成被禁用,Kudu将表作为单一的平面名称空间呈现,没有层次结构或数据库的概念。另外,Kudu对表名的唯一限制是,它们必须是有效的UTF-8编码字符串。捻角羚HMS集成启用时,这两个属性更改为匹配HMS模型:表名必须注明蜂巢数据库的表的成员,和表名称标识符(即表名和数据库名称)蜂巢表名称标识符的限制。

5.2.1、数据库

Hive有一个数据库的概念,它是单个表的集合。每个数据库形成自己独立的表名命名空间。为了适应这个模型,在启用HMS集成时,必须为Kudu表分配一个数据库。没有新增用于创建或删除数据库的api,也没有将现有的Kudu表分配给数据库的api。相反,引入了一种新的约定,即Kudu表名必须为.格式。因此,数据库是Kudu表名中隐含的一部分。通过将数据库作为Kudu表名的隐式部分包含在内,使用Kudu表的现有应用程序可以在不集成hms的表名和非集成hms的表名上操作,只需极少的更改或不更改。

Kudu没有提供额外的工具来创建或删除Hive数据库。管理员或用户应该使用现有的Hive工具,如Beeline Shell或Impala来实现这一点。

5.2.2、命名约束

Hive Metastore集成启用时,Kudu表的数据库和表名必须遵循Hive Metastore的命名约束。即数据库和表名只能包含字母、数字、ASCII字符和下划线。

当Hive .support.special.characters.tablename配置为true时,也支持在表名标识符(即表名和数据库名)中插入/字符。

此外,Hive Metastore没有对表名标识符强制区分大小写。因此,当启用时,Kudu将遵循同样的规则,当表名标识符仅因大小写不同时,不允许创建表。对于表名标识符,打开、修改或删除表的操作也不区分大小写。

由于在启用集成时不区分大小写,如果存在多个Kudu表,它们的名称只根据大小写不同而不同,那么Kudu master将无法启动。确保在启用Hive Metastore集成之前重新命名这些冲突表。

5.2.3、元数据同步

当启用Hive Metastore集成时,Kudu会自动同步与HMS之间的Kudu表的元数据变化。因此,务必使用下一节中描述的管理工具,始终确保Kudu和HMS拥有现有表的一致视图。如果不这样做,可能会导致外部hms感知组件(如Apache Sentry、Apache Impala)无法发现或使用Kudu表等问题。

Hive Metastore自动为Kudu表创建目录。这些目录是良性的,可以安全地忽略。

Impala有内部和外部Kudu表的概念。当从Impala中删除一个内部表时,该表的数据将在Kudu中删除;相反,当删除外部表时,在Kudu中不会删除表的数据。外部表引用表的名称可能与底层Kudu表的名称不同,而内部表必须使用与存储在Kudu中的相同的名称。此外,多个外部表可能引用相同的底层Kudu表。因此,由于外部表可能不会与Kudu表进行一对一的映射,Hive Metastore集成和工具只会自动同步内部表的元数据。有关Impala中的表类型的更多信息,请参阅Kudu Impala集成文档

5.3、启用Hive Metastore集成

在现有集群上启用Hive Metastore集成之前,请确保升级可能存在于Kudu或HMS目录中的任何表。有关详细信息,请参见升级现有表。

  • 当Hive Metastore配置了细粒度授权时,需要对HMS为Kudu创建的目录进行访问和修改。可以将Kudu admin用户加入Hive业务用户组,例如在HMS节点上运行usermod -aG Hive Kudu。

  • 配置Hive Metastore,包括通知事件监听器和Kudu HMS插件,允许修改和删除列,并在通知中添加完整的Thrift对象。在hive-site.xml文件的HMS配置中增加以下值: ```xml

    hive.metastore.transactional.event.listeners org.apache.hive.hcatalog.listener.DbNotificationListener, org.apache.kudu.hive.metastore.KuduMetastorePlugin
hive.metastore.disallow.incompatible.col.type.changes false

hive.metastore.notifications.add.thrift.objects true

  1. - 从源代码构建Kudu之后,将构建目录(例如build/release/bin)下找到的HMS -plugin.jar添加到HMS类路径中。
  2. - 重新启动HMS
  3. - Kudu中启用Hive Metastore集成,为Kudu master(s)配置以下属性:

—hive_metastore_uris= —hive_metastore_sasl_enabled=<value of the Hive Metastore’s hive.metastore.sasl.enabled configuration>

  1. 在安全的集群中,如果--hive_metastore配置中--hive_metastore_sasl_enabled设置为true,则--hive_metastore_kerberos_principal必须匹配Hive . Metastore配置中hive.metastore.kerberos.principal的主部分。
  2. - 重启Kudu主机。
  3. <a name="IdxiG"></a>
  4. ## 5.4、管理工具
  5. kudu提供了命令行工具kudu hms list, kudu hms precheck, kudu hms check,和捻kudu hms fix允许管理员找到并修复元数据之间的不一致性内部kudu catalog hive Metastore目录,下面描述的升级过程中或在正常操作期间kudu集群。
  6. kudu hms工具应该以kudu admin用户的身份从命令行运行。它们要求指定主地址的完整列表:

$ sudo -u kudu kudu hms check master-name-1:7051,master-name-2:7051,master-name-3:7051

  1. 查看kudu HMS工具可用选项的完整列表,使用--help标志。<br /> _当启用细粒度授权时,Kudu admin用户(通常为“Kudu”)需要访问所有Kudu表,才能运行Kudu hms工具。这可以通过--trusted_user_acl主配置将用户配置为可信用户来实现。有关受信任用户的更多信息,请参阅此处。_<br />_如果Hive Metastore配置了细粒度授权,则“Kudu admin”用户需要对HMS表项具有读写权限。在Hive Metastore中配置。对于Apache Sentry,可以使用sentry.metastore.service.users_ _属性进行配置。_
  2. **kudu hms list**<br />kudu hms list工具扫描Hive Metastore目录,并列出kudu表的hms条目(包括表名和类型),如它们的hms存储处理程序所示。
  3. **kudu hms precheck**<br />kudu hms预检查工具扫描kudu目录,验证是否有多个库表,这些库表的名称只根据大小写不同而不同,并记录冲突的表名。
  4. **kudu hms check**<br />kudu hms check工具扫描kuduHive Metastore目录,并验证这两个目录对存在的kudu表是否一致。该工具将对如何修复发现的任何不一致提出建议。通常,建议是运行kudu hms修复工具,但是一些不一致需要使用Impala Shell进行修复。
  5. **kudu hms fix**<br />kudu hms fix工具分析kuduhms目录,并尝试修复任何可自动修复的问题,例如,通过在hms中为每个尚未存在的kudu表创建一个表项。——dryrun选项显示了建议的修复,而不是实际执行它。当没有自动修复可用时,它将提供手动修复如何提供帮助的建议。
  6. _由于上述原因,kudu hms修复工具不会自动修复Impala外部表。相反,建议通过删除和重新创建外部表来修复这些问题。_
  7. **kudu hms downgrade **<br />kudu hms downgrade kuduHive Metastores的元数据降级为遗留格式。除非必要,否则不建议使用这种格式,因为在未来的版本中,遗留格式可能会被弃用。
  8. <a name="HEJ1Y"></a>
  9. ## 5.5、升级现有的表
  10. 在启用Kudu-HMS集成之前,一定要确保KuduHMS从现有表的一致视图开始。这可能需要重命名Kudu表以符合Hive命名约束。本文档详细描述了如何在启动Hive Metastore集成之前升级现有表。
  11. <a name="QmyV6"></a>
  12. ### 5.5.1、升级准备
  13. 1、建立维护窗口。在此期间,Kudu集群仍然可用,但是在升级过程中,KuduHive Metastore中的表可能会被修改或重命名。
  14. 2、使用以下命令记录所有外部表并删除它们。这减少了与Kudu表发生命名冲突的机会,这种冲突可能导致升级过程中出现错误。在目录升级破坏外部表(因为底层Kudu表被重命名)的情况下,它也有帮助。升级完成后,可以重新创建外部表。

$ sudo -u kudu kudu hms list master-name-1:7051,master-name-2:7051,master-name-3:7051

  1. <a name="x1r4I"></a>
  2. ### 5.5.2、执行升级
  3. 1、运行kudu hms precheck工具,确保所有的kudu表没有大小写差异。如果工具没有报告任何警告,您可以跳过下一步。

$ sudo -u kudu kudu hms precheck master-name-1:7051,master-name-2:7051,master-name-3:7051

  1. 2、如果kudu hms precheck工具报告冲突的表,使用以下命令将这些表重命名为不区分大小写的唯一名称:

$ sudo -u kudu kudu table rename_table master-name-1:7051,master-name-2:7051,master-name-3:7051

  1. 3、使用如下命令执行“kudu hms check”工具。如果该工具没有报告任何目录不一致,请跳到下面的步骤7
  2. ```bash
  3. $ sudo -u kudu kudu hms check master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=<hive_metastore_uris> [--ignore_other_clusters=<ignores_other_clusters>]

默认情况下,kudu hms工具将忽略hms中的元数据,这些元数据引用的是一个不同的kudu集群,而不是正在操作的集群,这可以通过指定不同的主机来表示。这些工具用来比较捻羚的价值。针对Kudu主机的RPC端点(包括端口)的每个HMS元数据项中的master_addresses表属性(在创建表时提供,或在impalad守护进程上作为—kudu_master_hosts提供)。要让工具帐户用于指定不同的主RPC端点并修复元数据项(例如,如果HMS中没有指定端口),请提供—ignore_other_clusters=false作为kud HMS检查和修复工具的参数。

示例

  1. $ sudo -u kudu kudu hms check master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=thrift://hive-metastore:9083 --ignore_other_clusters=false

4、如果kudu hms检查工具报告目录不一致,请执行一次kudu hms修复工具的试运行,以了解该工具将如何尝试解决自动修复的问题。

  1. $ sudo -u kudu kudu hms fix master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=<hive_metastore_uris> --dryrun=true [--ignore_other_clusters=<ignore_other_clusters>]

示例

  1. $ sudo -u kudu kudu hms check master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=thrift://hive-metastore:9083 --dryrun=true --ignore_other_clusters=false

5、手动修复检查工具报告的无法自动修复的任何问题。例如,用不符合hive的名称重命名任何表。

6、运行kudu hms fix工具自动修复所有剩余问题。

  1. $ sudo -u kudu kudu hms fix master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=<hive_metastore_uris> [--drop_orphan_hms_tables=<drops_orphan_hms_tables>] [--ignore_other_clusters=<ignore_other_clusters>]

示例

  1. $ sudo -u kudu kudu hms fix master-name-1:7051,master-name-2:7051,master-name-3:7051 --hive_metastore_uris=thrift://hive-metastore:9083 --ignore_other_clusters=false

—drop_orphan_hms_tables参数指示是否删除引用不存在Kudu表的孤儿Hive Metastore表。由于KUDU-2883的原因,该选项可能无法删除没有表ID的HMS表项。解决方法是通过Impala Shell删除表。

7、使用Impala Shell重新创建在准备升级时删除的任何外部表。

8、开启Hive Metastore集成,请参见开启Hive Metastore集成。