Hive Metadata

支持的管道类型:

  •  Data Collector

Hive Metadata处理器与Hive Metastore目标端以及Hadoop FS或MapR FS目标端配合使用,作为Hive漂移同步解决方案的一部分。

当您希望Hive Metastore目标端根据需要创建和更新表时,请使用Hive Metadata处理器将记录写入HDFS或MapR FS。处理器还生成记录头属性,Hadoop FS和MapR FS目标端可使用它们来处理数据。

配置Hive Metadata处理器时,您将定义Hive的连接信息,以及用于定义数据库、表、分区和记录所需的小数字段的表达式。您还可以指定要使用的数据格式:Avro或Parquet。

您定义Hive和Hadoop配置文件的位置,并可以选择指定其他必需属性。您还可以配置高级选项,例如最大缓存大小,时间基准,小数精度和小数位数表达式以及元数据记录的自定义记录头属性。

有关Hive的漂移同步解决方案以及用于处理Avro和Parquet数据的案例研究的更多信息,请参见Hive的漂移同步解决方案。有关教程,请查看我们在GitHub上的教程

输出流

Hive Metadata处理器包括数据和元数据输出流。下图显示了Hive Metadata处理器的输出流:

数据输出流
将记录向下传递到Hadoop FS或MapR FS目标端。您可以根据需要在Hive Metadata处理器和目标端之间添加其他阶段,但是只有Hadoop FS和MapR FS目标端可以使用生成的记录头属性来写入记录。
元数据输出流
将元数据记录向下游传递到Hive Metastore目标端。元数据输出流不传递任何类型的记录数据。

您可以在需要时在Hive Metadata处理器和Hive Metastore目标端之间添加其他阶段,但是只有Hive Metastore目标端可以使用元数据记录来更新Hive Metastore。

元数据记录和记录头属性

Hive Metadata处理器产生以下专用输出:

元数据记录
当遇到兼容的元数据更改时,Hive Metadata处理器会生成元数据记录。元数据记录将以下信息传递到Hive Metastore目标端:

  • 基于记录的兼容更改的预期表结构。

    兼容更改包括新表和分区,以及记录中字段的添加或删除。数据类型的更改不兼容。

  • 在阶段中配置的任何用户定义的记录头属性。
当Hive Metastore目标接收到元数据记录时,目标将对Hive元数据执行最终检查,并根据需要创建或更改表。
数据记录头属性
Hive Metadata处理器将以下属性添加到数据记录的记录头中:

  • targetDirectory-每个记录应写入的位置。

    处理器基于数据库、表和分区信息为每个记录生成目录,并将其写入targetDirectory头属性。

    处理Parquet数据时,Hive Metadata处理器将.avro添加到它为每个记录生成的目标目录中。这样,数据处理目标端就可以将Avro文件写入Hive忽略的临时目录中。

    结果,目标将文件写入以下目录:<generated directory>/.avro

    注意: 您可以配置MapReduce执行程序将Parquet文件写入父生成的目录,并在处理它们后删除Avro文件。您还可以根据需要在处理文件后删除临时目录。

    要使用此头属性,请将Hadoop FS或MapR FS目标端配置为使用记录头中的目录写入记录。

  • avroSchema-记录的Avro模式。

    处理器将Avro模式写入每个记录的avroSchema头属性中。当处理器发现Avro模式中的兼容更改时,它将生成新的Avro模式。此属性同时用于Avro和Parquet数据。

    要使用此头属性,请将Hadoop FS或MapR FS目标端配置为使用记录头中的Avro模式写入记录。

  • roll-用于滚动与记录关联的文件的指示器。

    仅当Avro模式以兼容方式更改时,处理器才会生成roll指示器。具有不兼容更改的记录将发送到阶段以进行错误处理。

    要使用此头属性,请在遇到记录头中的roll属性时,将Hadoop FS或MapR FS目标端配置为滚动记录。然后,使用默认的“roll”作为头属性的名称。

有关使用目标位置处理这些属性的更多信息,请参见基于记录写入的记录头属性。有关记录头属性的一般信息,请参见记录头属性。

自定义记录头属性

您可以配置Hive Metadata处理器为该处理器生成的元数据记录创建自定义记录头属性。您可以使用常量来定义自定义属性,也可以使用表达式基于记录或管道中的信息来定义属性。

将元数据记录路由到Hive Metastore目标端以外的目标时,可以使用自定义记录头属性。Hive Metastore目标端使用元数据记录中的字段信息,但是大多数其他目标端(例如Amazon S3或Kafka Producer目标端)可以根据表达式的值将元数据记录写入不同的位置。而且,您可以配置表达式以使用您定义的自定义头属性。

例如,假设每个传入记录都有一个SalesRegion值,您想使用该值将元数据记录写入不同的Amazon S3分区。您可以配置Hive Metadata处理器以创建SRegion头属性,并使用该 ${record:value('/SalesRegion')}表达式定义属性。配置Amazon S3目标时,可以使用以下表达式来定义分区前缀:${record.attribute('SRegion')}

数据库,表和分区表达式

您可以在Hive Metadata处理器中配置以下表达式:

数据库和表表达式
数据库表达式表示Hadoop FS或MapR FS目标端应在其中写入记录的数据库。如果省略数据库表达式,则处理器将使用default Hive数据库。
表表达式表示要使用的表。如果该表不存在,则处理器将生成元数据记录以创建该表。
数据库和表表达式也合并到targetDirectory中,以允许对数据库进行基于记录的写入。
有关配置数据库和表表达式的提示:

  • 如果将所有记录都写到单个数据库或表中,则可以输入数据库或表名而不是表达式。
  • 如果可以从记录数据或头属性中推断出数据库或表名,则可以输入一个计算结果为数据库或表名的表达式。
  • 如有必要,您可以在管道中的较早位置使用表达式计算器来执行计算,并将结果写入新的字段或头属性,以供Hive Metadata处理器使用。
分区配置信息
您可以选择配置分区属性以写入分区。配置分区信息时,请声明Hive分区列名称、计算结果为分区名称的表达式以及分区数据的数据格式。您可以将Int,Bigint和String数据格式用于分区数据。
与数据库和表表达式一样,您可以根据需要配置分区表达式:

  • 如果将所有记录都写入一个分区,则可以为表达式输入分区名称。
  • 如果分区取决于记录中的信息,则可以输入一个计算结果为特定分区的表达式。
  • 必要时,您可以在管道中的较早位置使用表达式计算器来生成分区名称,并将其作为新字段写入记录中,或者将记录头作为头属性写入。
您可以使用${YYYY()}或${DD()}之类的日期时间变量来创建基于日期时间的分区。创建基于日期时间的分区时,请考虑要使用的时间基准。默认情况下,处理器使用处理时间作为时间基准,但是您也可以使用与记录关联的时间。
有关日期时间变量的详细信息,请参见日期时间变量。

Hive名称和支持的字符

Hive表名称,列名称和分区名称使用小写字母创建。

下表列出了可以在名称中使用的有效字符:

名称 支持的字符
Table names 字母数字字符和下划线(_)。
Column names 字母数字字符和下划线,但必须以字母或下划线开头。
Partition names 字母数字字符和下划线,但必须以字母开头。
注意:当与记录关联的表、分区或列名包含不受支持的字符或无效格式时,处理器会将记录发送到错误。

小数字段表达式

小数字段表达式定义了用于小数字段的精度和小数位数。配置Hive Metadata处理器时,可以为精度和小数位数指定表达式。

您可以为表达式中的所有小数字段输入表达式,以相同的精度和小数位数求值。例如,如果您的用例允许,则可以对所有小数字段使用精度10和小数位2。

或者,您可以创建一个更复杂的表达式,该表达式对于不同的小数字段将得出不同的值。

这些属性的默认表达式使用JDBC头属性。在处理来自JDBC Multitable Consumer或JDBC Query Consumer的数据时,可以使用以下默认表达式:

${record:attribute(str:concat(str:concat('jdbc.', field:field()), '.precision'))}
${record:attribute(str:concat(str:concat('jdbc.', field:field()), '.scale'))}

field:field函数返回该字段的名称。因此,默认情况下,表达式解析为:

${record:attribute(jdbc.<fieldname>.precision)}
${record:attribute(jdbc.<fieldname>.scale)}
注意:默认情况下,JDBC Query Consumer创建JDBC头属性,将每个小数字段的精度和小数位写入记录头属性。JDBC Multitable Consumer始终创建JDBC头属性。

在这些表达式中,“ jdbc.”表示JDBC头属性的默认前缀。您可以在JDBC Query Consumer中更改前缀。如果更改前缀,请确保在小数字段表达式中对其进行更新。JDBC Multitable Consumer始终使用“ jdbc.”作为前缀。

有关使JDBC Query Consumer能够创建JDBC头属性的信息,请参阅Drift Synchronization Solution中的头属性。

时间基准

时间基准有助于确定何时创建基于日期时间的分区。分区用于元数据记录中,并用作targetDirectory路径的一部分。您可以使用以下时间作为时间基准:

处理时间
当您将处理时间用作时间基准时,处理器将使用处理时间和分区值表达式来确定要在元数据记录和targetDirectory头属性的分区部分中使用的分区值。
例如,假设一个分区值表达式每天创建一个新的分区,时间基准就是处理时间。然后,处理器会生成Hive Metastore目标端用来创建每日分区的每日元数据记录。处理器将每日分区值添加到targetDirectory路径。
要将处理时间用作时间基准,请使用以下表达式: ${time:now()}。这是默认的时间基准。
基于记录的时间
当您使用与记录关联的时间作为时间基准时,您可以在记录中指定日期字段作为分区值表达式的一部分。处理器使用与记录和分区值表达式关联的日期时间来确定要在元数据记录和targetDirectory头属性的分区部分中使用的分区值。
例如,假设分区值表达式每小时创建一个目录,并且时间基准基于记录。然后,对于与记录相关联的每个小时,处理器都会生成一个元数据记录,以便Hive Metastore目标端可以根据需要创建每小时的分区。然后,处理器将每小时的分区值添加到targetDirectory路径。
要使用与记录关联的时间,请使用一个表达式,该表达式调用一个字段并解析为日期时间值,例如 ${record:value("/Timestamp")}

缓存

Hive Metadata处理器向Hive查询信息并缓存结果。如果可能,它将使用缓存进行记录比较,以避免不必要的Hive查询。

处理器缓存以下Hive元数据:

  • 要写入的数据库和表
  • Hive表属性
  • 表中的列名和数据类型
  • Avro模式
  • 分区值

缓存大小和淘汰

您可以配置缓存的最大大小。当缓存达到指定的限制时,它将使用LRU淘汰策略,该策略将删除最近最少使用的数据,以允许将新条目写入缓存。

Kerberos身份验证

您可以使用Kerberos身份验证连接到HDFS或MapR FS。使用Kerberos身份验证时,Data Collector 使用Kerberos主体和密钥表连接到HiveServer2。

Kerberos主体和密钥表在Data Collector 配置文件 $SDC_CONF/sdc.properties中定义。要使用Kerberos身份验证,请在Data Collector 配置文件中配置所有Kerberos属性,并将Kerberos主体包括在HiveServer2 JDBC URL中。

Hive属性和配置文件

您必须配置Hive Metadata以使用Hive和Hadoop配置文件以及单个属性。

配置文件

Hive Metadata处理器需要以下配置文件:

  • core-site.xml
  • hdfs-site.xml
  • hive-site.xml
个别属性
您可以在处理器中配置个别Hive属性。要添加Hive属性,请指定确切的属性名称和值。处理器不验证属性名称或值。

注意:各个属性会覆盖配置文件中定义的属性。

配置Hive Metadata处理器

配置Hive Metadata处理器以评估Avro数据并为Hive Metastore和Hadoop FS或MapR FS目标端生成Hive元数据信息。
  1. 在“Properties”面板的“General选项卡上,配置以下属性:
    一般属性 描述
    Name 阶段名。
    Description 可选说明。
    Required Fields 必须包含用于将记录传递到阶段的记录的数据的字段。

    提示:您可能包括阶段使用的字段。

    根据为管道配置的错误处理,处理不包括所有必填字段的记录。

    Preconditions 必须评估为TRUE的条件才能使记录进入处理阶段。单击 添加以创建其他前提条件。

    根据为该阶段配置的错误处理,处理不满足所有前提条件的记录。

    On Record Error 该阶段的错误记录处理:

    • Discard-放弃记录。
    • To Error-将记录发送到管道以进行错误处理。
    • Stop Pipeline-停止管道。对集群管道无效。
  2. 在“Hive选项卡上,配置以下属性:
    Hive属性 描述
    JDBC URL Hive的JDBC URL。您可以使用默认值,也可以在适当时用特定的数据库名称替换数据库名称的表达式。

    如果您的URL包含带有特殊字符的密码,则必须对特殊字符进行URL编码(也称为百分比编码)。否则,在验证或运行管道时将发生错误。例如,如果您的JDBC URL如下所示:

    jdbc:hive2://sunnyvale:12345/default;user=admin;password=a#b!c$e

    对您的密码进行URL编码,以便您的JDBC URL如下所示:

    jdbc:hive2://sunnyvale:12345/default;user=admin;password=a%23b%21c%24e

    要模拟与Hive的连接中的当前用户,您可以编辑 sdc.properties文件以将Data Collector配置为自动模拟该用户,而无需在URL中指定代理用户。请参阅配置Data Collector。

    有关指定URL的更多信息,请参见我们的Ask StreamSets帖子

    JDBC Driver Name 完全限定的JDBC驱动程序名称。
    Additional JDBC Configuration Properties 传递给JDBC驱动程序的其他JDBC配置属性。

    使用 简单或批量编辑模式,单击添加以添加其他属性并定义属性名称和值。使用JDBC驱动程序期望的属性名称和值。

    Hadoop Configuration Directory

    包含Hive和Hadoop配置文件的目录的绝对路径。对于Cloudera Manager安装,请输入hive-conf。

    该阶段使用以下配置文件:

    • core-site.xml
    • hdfs-site.xml
    • hive-site.xml
    注意:配置文件中的属性被此阶段定义的单个属性覆盖。

    Additional Hadoop Configuration

    要使用的其他属性。

    使用简单或批量编辑模式,单击添加以添加其他属性并定义属性名称和值。使用Hive和HDFS或MapR FS所期望的属性名称和值。

  3. “Table”选项卡上,配置以下属性:
    表属性 描述
    Database Expression 要使用的数据库的可选名称。您可以使用计算结果为数据库名称的表达式。

    未定义时,处理器将使用default Hive数据库。

    Table Name 要使用的表的名称。您可以使用计算结果为表名的表达式。

    请注意,Hive表名称均为小写。

    Partition Column Name Hive表中分区列的名称。

    请注意,Hive分区列名称均为小写。

    Partition Value Type 分区值的数据类型。您可以将Int,Bigint和String数据格式用于分区数据。

    分区值不应包含以下字符:逗号,斜杠(/),反斜杠(\),单引号和双引号,等号(=)和方括号([])。

    Partition Value Expression 计算要使用的分区值的表达式。
    External Table 指示表是否是外部表。选择以写入Hive默认位置之外的表。

    如果未选中,则处理器使用hive-site.xml配置文件中的hive.metastore.warehouse.dir属性定义的默认位置(通常为) /user/hive/warehouse/

    Column Comment 计算结果为列注释的表达式。
    Table Path Template 该表达式定义用于外部表的路径。
    Partition Path Template 该表达式定义配置分区时用于外部表的分区路径。省略分区配置详细信息时,也可以跳过此属性。

    配置后,分区路径模板的值将附加到表路径模板的值,以确定每个记录的写入位置。

    对于单列分区,请使用以下格式:

    <partition column name>=<partition value expression>

    要使用多个列分区,请使用以下格式组合它们:

    <partition 1 column name>=<partition 1 value expression>/<partition 2 column name>=<partition 2 value expression>
    Decimal Precision Expression 定义小数字段精度的表达式。输入记录中所有小数字段要使用的单个值,或者输入一个对不同字段的精度不同的表达式。

    注意:目前,Hive中小数数据的最大精度和小数位数为38。

    缺省表达式根据JDBC头属性中的信息确定精度。

    仅当处理来自启用了JDBC头属性的JDBC Query Consumer或JDBC Multitable Consumer的数据时,才使用默认值。必要时,将“jdbc”替换为配置的JDBC头前缀。

    Decimal Scale Expression 定义小数字段的小数位的表达式。输入记录中所有小数字段要使用的单个值,或者输入一个对不同字段使用不同比例的表达式。

    注意:目前,Hive中小数数据的最大精度和小数位数为38。

    默认表达式根据JDBC头属性中的信息确定比例。

    仅当处理来自启用了JDBC标头属性的JDBC Query Consumer或JDBC Multitable Consumer的数据时,才使用默认值。必要时,将“jdbc”替换为配置的JDBC头前缀。

  4. 在“Advanced选项卡上,可以选择配置以下属性:
    高级属性 描述
    Max Cache Size (entries) 缓存中的最大条目数。

    当缓存达到最大大小时,将淘汰最旧的缓存条目以允许新数据。

    默认值为-1,无限的缓存大小。

    Time Basis 用于评估基于日期时间的分区值表达式的时间基准。
    Data Time Zone 与时间基准一起使用的时区,以评估基于日期时间的分区值表达式。
    Header Attribute Expressions 用于定义元数据记录的自定义记录头属性。

    使用简单或批量编辑模式,单击添加图标以配置定制记录头属性。

  5. 在“Data Format选项卡上,配置数据格式:
    数据格式 描述
    Data Format 数据的数据格式。选择以下之一:

    • Avro
    • Parquet

    选定的数据格式确定Hive Metastore目标如何创建Hive表以及处理器如何填充targetDirectory记录头属性。有关更多信息,请参见元数据记录和记录头属性。