这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

使用 HCatalog 连接器

Vertica HCatalog 连接器允许您像访问原生 Vertica 表内数据那样,访问存储在 Apache 的 Hive 数据仓库软件中的数据。

如果您的文件是 Optimized Columnar Row (ORC) 或 Parquet 格式且不使用复杂类型,HCatalog 连接器将创建外部表并使用 ORC 或 Parquet 读取器,而不是使用 Java SerDe。有关这些读取器的详细信息,请参阅 ORCPARQUET

HCatalog 连接器执行谓词下推以提高查询性能。HCatalog 连接器将谓词评估移动到更接近数据的位置,而不是读取整个网络的所有数据来评估查询。谓词下推适用于 Hive 分区修剪、ORC 带区修剪和 Parquet 行组修剪。HCatalog 连接器支持以下谓词的谓词下推:>、>=、=、<>、<=、<。

1 - 概述

要使用 HCatalog 连接器,您必须了解几个 Hadoop 组件:

  • Apache Hive 允许您按照与查询关系数据库中所存数据相同的方式,查询 Hadoop 分布式文件系统 (HDFS) 中存储的数据。Hive 在后台使用一组序列化程序和反序列化程序 (SerDe) 类,从 HDFS 中存储的文件中提取数据并将其分解成列和行。每个 SerDe 均以特定的格式处理数据文件。例如,一个 SerDe 从以逗号分隔的数据文件中提取数据,另一个 SerDe 则可解释以 JSON 格式存储的数据。

  • Apache HCatalog 是 Hadoop 生态系统的一个组件,可向其他 Hadoop 组件(如 Pig)提供 Hive 元数据。

  • HiveServer2 通过 JDBC 使 HCatalog 和 Hive 数据可用。通过它,客户端可以请求检索 Hive 中存储的数据以及有关 Hive 架构的信息。HiveServer2 可以使用授权服务(Sentry 或 Ranger)。HiverServer2 可以使用 Hive LLAP (Live Long And Process)。

Vertica HCatalog 连接器让您可以透明地访问可通过 HiveServer2 获得的数据。您可以使用该连接器来定义 Vertica 中与 Hive 数据库或架构相对应的架构。当您在此架构内查询数据时,HCatalog 连接器可以透明地从 Hadoop 中提取数据,并将该数据格式化为表格数据。Vertica 支持授权服务和 Hive LLAP。

HCatalog 连接功能

HCatalog 连接器允许您使用 Vertica 原生 SQL 语法查询 Hive 中存储的数据。其部分主要特性有:

  • HCatalog 连接器始终反映 Hive 中存储的数据的当前状态。

  • HCatalog 连接器利用 Vertica 和 Hadoop 的并行特性来处理 Hive 数据。其结果是,通过 HCatalog 连接器查询数据通常比直接通过 Hive 查询数据速度更快。

  • 由于 Vertica 执行数据的提取和解析,HCatalog 连接器不会明显增加 Hadoop 群集上的负载。

  • 您可以像使用原生 Vertica 数据那样,使用通过 HCatalog 连接器查询的数据。例如,您可以执行能够联接 HCatalog 架构中的表数据与本地表数据的查询。

HCatalog 连接器注意事项

使用 HCatalog 连接器时,要牢记以下几点:

  • Hive 的数据存储在分布式文件系统中的平面文件内,每次查询 Hive 数据都必须对其进行读取和反序列化。这种反序列化会导致 Hive 的性能远慢于 Vertica。要读取数据,HCatalog 连接器必须执行与 Hive 相同的流程。因此,使用 HCatalog 连接器查询 Hive 中存储的数据比查询本地 Vertica 表要慢得多。如果需要对 Hive 中存储的数据执行广泛的分析,您应该考虑将其加载到 Vertica 中。Vertica 优化后,通过 HCatalog 连接器查询数据通常比直接通过 Hive 查询数据更快。

  • 如果 Hive 使用 Kerberos 安全性,则 HCatalog 连接器默认在查询中使用查询用户的凭据。如果 Hive 使用 Sentry 或 Ranger 来强制实施安全性,则您必须通过将 EnableHCatImpersonation 设置为 0 在 Vertica 中禁用这种查询行为,或者授予用户对 HDFS 中基础数据的访问权限。(Sentry 支持 ACL 同步自动授予访问权限。)或者,您可以为数据和元数据访问指定委托令牌。请参阅配置安全性

  • Hive 支持 Vertica 不支持的复杂数据类型,如 list、map 和 struct。包含这些数据类型的列将转换成以 JSON 表示的数据类型,并存储为 VARCHAR。请参阅从 Hive 到 Vertica 的数据类型转换

2 - HCatalog 连接器工作原理

规划访问 Hive 表中数据的查询时,启动程序节点上的 Vertica HCatalog 连接器将联系 Hadoop 群集中的 HiveServer2(或 WebHCat),以确定该表是否存在。如果该表存在,连接器将从元存储数据库检索该表的元数据,以便查询规划可以继续。查询执行时,Vertica 群集中的所有节点直接从 HDFS 检索完成查询所必需的数据。然后,它们使用 Hive SerDe 类提取数据,以便查询可以执行。访问 ORC 或 Parquet 格式的数据时,HCatalog 连接器使用 Vertica 的内部读取器(而不是 Hive SerDe 类)来处理这些格式。

这种方法利用了 Vertica 和 Hadoop 的并行性。此外,HCatalog 连接器还通过直接执行数据检索和提取,降低了查询对 Hadoop 群集的影响。

对于采用 Optimized Columnar Row (ORC) 或 Parquet 格式且不使用复杂类型的文件,HCatalog 连接器将创建外部表并使用 ORC 或 Parquet 读取器,而不是使用 Java SerDe。如果 Hive 在写入数据时使用自定义 Hive 分区位置,您可以指示这些读取器访问该位置。默认情况下,系统会关闭这些额外的检查以提高性能。

3 - HCatalog 连接器要求

您的 Vertica 和 Hadoop 安装必须满足以下要求,才可以使用 HCatalog 连接器。

Vertica 要求

群集中的所有节点均须安装 Java 虚拟机 (JVM)。您必须使用 Hadoop 群集所用的相同 Java 版本。请参阅在 Vertica 群集上安装 Java 运行时

您还必须将使用 Hadoop 和 Hive 分发的特定库添加到 Vertica 安装目录。请参阅为 HCatalog 配置 Vertica

Hadoop 要求

您的 Hadoop 群集必须满足几项要求才能与 Vertica Connector for HCatalog 一起正常操作:

  • 必须已安装 Hive、HiveServer2 和 HCatalog 并且正在运行。有关详细信息,请参阅 Apache 的 HCatalog 页面。

  • HiveServer2 服务器以及用于存储 HCatalog 数据的所有 HDFS 节点必须能够直接从 Vertica 数据库中的所有主机中访问。验证用于分离 Hadoop 群集和 Vertica 群集的任何防火墙是否会传递 HiveServer2、metastore 数据库和 HDFS 流量。

  • 您要查询的数据必须位于内部或外部 Hive 表中。

  • 如果您要查询的表使用一个非标准 SerDe,则必须将 SerDe 的类安装在 Vertica 群集上,然后才能查询数据。请参阅使用非标准 SerDes

4 - 在 Vertica 群集上安装 Java 运行时

HCatalog 连接器需要 64 位 Java 虚拟机 (JVM)。此 JVM 必须支持 Java 6 或更高版本,还必须与 Hadoop 节点上安装的 JVM 同属一个版本。

在 Vertica 群集上安装 Java 分为两步:

  1. 在群集中的所有主机上安装 Java 运行时。

  2. 设置 JavaBinaryForUDx 配置参数,让 Vertica 了解 Java 可执行文件的位置。

对于基于 Java 的功能,Vertica 要求使用 64 位 Java 6(Java 版本 1.6)或更高版本 Java 运行时。Vertica 支持 Oracle 或 OpenJDK 中的运行时。您可以选择安装 Java 运行时环境 (JRE) 或者 Java 开发工具包 (JDK),因为 JDK 还包括 JRE。

许多 Linux 分发版都含有一个 OpenJDK 运行时包。有关安装和配置 OpenJDK 的信息,请参阅您的 Linux 分发版的文档。

要安装 Oracle Java 运行时,请参阅 Java Standard Edition (SE) 下载页。您通常需要以 root 身份运行安装包才能安装它。有关说明,请参阅下载页。

如果已经在每台主机上安装了 JVM,请确保 java 命令位于搜索路径中,而且通过运行以下命令来调用正确的 JVM:

$ java -version

此命令的输出类似如下内容:

java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

设置 JavaBinaryForUDx 配置参数

JavaBinaryForUDx 配置参数可以让 Vertica 了解到执行 Java UDx 的 JRE 的位置。在群集中的所有节点上安装 JRE 后,请将此参数设置为 Java 可执行文件的绝对路径。您可以使用 Java 安装程序创建的符号链接(例如 /usr/bin/java)。如果 Java 可执行文件位于 shell 搜索路径中,您可以从 Linux 命令行 shell 中运行以下命令来获得 Java 可执行文件的路径。

$ which java
/usr/bin/java

如果 java 命令不在 shell 搜索路径中,请使用 JRE 安装目录中的 Java 可执行文件路径。假设您已在 /usr/java/default 中安装了 JRE(Oracle 提供的安装包会在此安装 Java 1.6 JRE)。在此情况下,Java 可执行文件为 /usr/java/default/bin/java

要设置配置参数,您可以 数据库超级用户身份执行以下语句:

=> ALTER DATABASE DEFAULT SET PARAMETER JavaBinaryForUDx = '/usr/bin/java';

有关设置配置参数的详细信息,请参阅 ALTER DATABASE

要查看配置参数的当前设置,请查询 CONFIGURATION_PARAMETERS 系统表:

=> \x
Expanded display is on.
=> SELECT * FROM CONFIGURATION_PARAMETERS WHERE parameter_name = 'JavaBinaryForUDx';
-[ RECORD 1 ]-----------------+----------------------------------------------------------
node_name                     | ALL
parameter_name                | JavaBinaryForUDx
current_value                 | /usr/bin/java
default_value                 |
change_under_support_guidance | f
change_requires_restart       | f
description                   | Path to the java binary for executing UDx written in Java

设置配置参数后,Vertica 可以在群集中的每个节点上查找 Java 可执行文件。

5 - 为 HCatalog 配置 Vertica

在使用 HCatalog 连接器之前,您必须将特定的 Hadoop 和 Hive 库添加到您的 Vertica 安装中。您还必须复制指定各项连接属性的 Hadoop 配置文件。Vertica 使用这些配置文件中的值创建自己到 Hadoop 的连接。

您只需在群集中的一个节点上执行这些更改。完成此操作后,您就可以安装 HCatalog 连接器。

复制 Hadoop 库和配置文件

Vertica 提供一个工具(即 hcatUtil)来从 Hadoop 收集所需的文件。此工具可将选中的库和 XML 配置文件从 Hadoop 群集复制到 Vertica 群集。此工具可能还需要其他库的访问权限:

  • 如果您打算用 Hive 查询使用 Snappy 压缩的文件,您需要 Snappy 本机库 libhadoop*.so 和 libsnappy*.so 的访问权限。

  • 如果您打算用 Hive 查询使用 LZO 压缩的文件,您需要 hadoop-lzo-*.jarlibgplcompression.so* 库的访问权限。您还必须在 core-site.xml 中编辑 io.compression.codecs 属性以包括 com.hadoop.compression.lzo.LzopCodec

  • 如果您打算将 JSON SerDe 用于 Hive 表,您需要其库的访问权限。这是指您用于配置 Hive 的同一个库;例如:

    hive> add jar /home/release/json-serde-1.3-jar-with-dependencies.jar;
    
    
    
    hive> create external table nationjson (id int,name string,rank int,text string)
          ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
          LOCATION '/user/release/vt/nationjson';
    
  • 如果您要使用任何其他库,而这些库并非所有受支持的 Hadoop 版本的标准配置,则您需要这些库的访问权限。

如果上述任何情况适用于您,请执行下列操作之一:

  • 将路径加入您指定为 --hcatLibPath 的值的路径中,或者

  • 将文件复制到一个已在该路径上的目录。

如果 Vertica 并未共置于 Hadoop 节点上,您应该执行以下操作:

  1. 将 /opt/vertica/packages/hcat/tools/hcatUtil 复制到一个 Hadoop 节点并在那里运行它,指定一个临时的输出目录。您的 Hadoop、HIVE 和 HCatalog 库路径可能不同。在较新版本的 Hadoop 中,HCatalog 目录通常是 HIVE 目录下的子目录,Cloudera 会为配置文件的每个修订版创建一个新目录。将您环境中的值用于以下命令:

    hcatUtil --copyJars
          --hadoopHiveHome="$HADOOP_HOME/lib;$HIVE_HOME/lib;/hcatalog/dist/share"
           --hadoopHiveConfPath="$HADOOP_CONF_DIR;$HIVE_CONF_DIR;$WEBHCAT_CONF_DIR"
          --hcatLibPath="/tmp/hadoop-files"
    

    如果您使用 Hive LLAP,请指定 hive2 目录。

  2. 验证所有必要的文件已复制:

    hcatUtil --verifyJars --hcatLibPath=/tmp/hadoop-files
    
  3. 将该输出目录(本示例中为 /tmp/hadoop-files)复制到您在安装 HCatalog 连接器时将连接到的 Vertica 节点上的 /opt/vertica/packages/hcat/lib。如果您要更新 Vertica 群集以使用新的 Hadoop 群集(或新版本的 Hadoop),请先移除 /opt/vertica/packages/hcat/lib 中除 vertica-hcatalogudl.jar 以外的所有 JAR 文件。

  4. 验证所有必要的文件已复制:

    hcatUtil --verifyJars --hcatLibPath=/opt/vertica/packages/hcat
    

如果 Vertica 共置于部分或全部 Hadoop 节点上,您可以在共享节点上以一个步骤完成此操作。Hadoop、HIVE 和 HCatalog 的 lib 路径可能有所不同;将您环境中的值用于以下命令:

hcatUtil --copyJars
      --hadoopHiveHome="$HADOOP_HOME/lib;$HIVE_HOME/lib;/hcatalog/dist/share"
      --hadoopHiveConfPath="$HADOOP_CONF_DIR;$HIVE_CONF_DIR;$WEBHCAT_CONF_DIR"
      --hcatLibPath="/opt/vertica/packages/hcat/lib"

hcatUtil 脚本具有以下参数:

复制并验证这些文件后,安装 HCatalog 连接器。

安装 HCatalog 连接器

在您将 hcatUtil 中的文件复制到的同一节点上,通过运行 install.sql 脚本安装 HCatalog 连接器。此脚本驻留在 HCatalog 采集器安装路径下的 ddl/ 文件夹中。此脚本将创建库、VHCatSource 和 VHCatParser。

现在,您可以按照使用 HCatalog 连接器定义架构中的介绍,创建指向现有 Hadoop 服务的 HCatalog 架构参数。

升级到新版本的 Vertica

升级到新版本的 Vertica 后,请执行以下步骤:

  1. 使用 uninstall.sql 脚本卸载 HCatalog 连接器。此脚本驻留在 HCatalog 采集器安装路径下的 ddl/ 文件夹中。
  2. 删除 hcatLibPath 目录中除 vertica-hcatalogudl.jar 之外的内容。
  3. 重新运行 hcatUtil。
  4. 使用 install.sql 脚本重新安装 HCatalog 连接器。

有关升级 Vertica 的详细信息,请参阅升级 Vertica

Hadoop 列式文件格式的其他选项

读取 Hadoop 的列式文件格式(ORC 或 Parquet)时,HCatalog 连接器将尝试使用内置读取器。这样做时,它默认使用 WebHDFS。您可以使用已弃用的 LibHDFS++ 库,方法是使用 hdfs URI 方案且使用 ALTER DATABASE 将 HDFSUseWebHDFS 设置为 0。此设置适用于所有 HDFS 访问,而不仅仅是 HCatalog 连接器。

无论哪种情况,您都必须执行配置 HDFS 访问中描述的配置。

6 - 配置安全性

您可以使用访问已进行 Kerberize 的 HDFS 数据中描述的任何安全选项来访问 Hive 数据。本主题描述了使用 HCatalog 连接器时特别需要的其他步骤。

如果您在 Vertica 中使用 Kerberos,则 HCatalog 连接器可以使用授权服务(Sentry 或 Ranger)。如果您使用委托令牌,则必须自己管理授权。

Kerberos

您可以在 Vertica 中使用 Kerberos,如将 Kerberos 与 Vertica 结合使用中所述。

如何配置 HCatalog 连接器取决于 Hive 如何管理授权。

  • 如果 Hive 使用 Sentry 来管理授权,并且如果 Sentry 使用 ACL 同步,则 HCatalog 连接器必须以当前用户身份访问 HDFS。验证 EnableHCatImpersonation 配置参数是否设置为 1(默认值)。ACL 同步自动为授权用户提供对底层 HDFS 文件的读取访问权限。

  • 如果 Hive 在没有 ACL 同步的情况下使用 Sentry,则 HCatalog 连接器必须作为 Vertica 主体访问 HDFS 数据。(用户仍然可以正常验证和访问元数据。)将 EnableHCatImpersonation 配置参数设置为 0。Vertica 主体必须具有对底层 HDFS 文件的读取访问权限。

  • 如果 Hive 使用 Ranger 来管理授权,并且 Vertica 用户对底层 HDFS 文件具有读取访问权限,则您可以使用用户模拟。验证 EnableHCatImpersonation 配置参数是否设置为 1(默认值)。相反,您可以禁用用户模拟并授予 Vertica 主体对 HDFS 文件的读取访问权限。

  • 如果 Hive 使用 Sentry 或 Ranger,则 HCatalog 连接器必须使用 HiveServer2(默认设置)。WebHCat 不支持授权服务。

  • 如果 Hive 不使用授权服务,或者如果您使用 WebHCat 而不是 HiveServer2 连接到 Hive,则 HCatalog 连接器以当前用户身份访问 Hive。验证 EnableHCatImpersonation 是否设置为 1。所有用户都必须具有对底层 HDFS 文件的读取访问权限。

此外,请确保在 Hadoop 配置文件(在大多数发行版中为 core-site.xml)中启用所有的 Hadoop 组件,以模拟 Vertica 用户。要做到这一点,最简单的方法是,使用通配符为所有主机上和所有组中的所有用户设置 proxyuser 属性。有关说明,请查阅您的 Hadoop 文档。确保在运行 hcatUtil 之前设置此属性(请参阅为 HCatalog 配置 Vertica)。

委托令牌

您可以将委托令牌用于会话,如自带您的委托令牌中所述。使用 HCatalog 连接器时,您指定两个委托令牌,一个用于数据,一个用于元数据。元数据令牌与 Hive 架构相关联。有关如何指定这两个委托令牌的信息,请参阅 HadoopImpersonationConfig 格式

验证安全配置

要验证 HCatalog 连接器是否可以访问 Hive 数据,请使用 HCATALOGCONNECTOR_CONFIG_CHECK 函数。

有关测试配置的详细信息,请参阅验证 HDFS 配置

7 - 使用 HCatalog 连接器定义架构

设置 HCatalog 连接器后,您可以用它来定义 Vertica 数据库中的架构,以访问 Hive 数据库中的表。您可以使用 CREATE HCATALOG SCHEMA 语句定义架构。

创建架构时,您必须提供要在 Vertica 中定义的架构名称。其它参数为可选参数。如果您不提供值,Vertica 将使用默认值。Vertica 从 HDFS 配置文件中读取一些默认值;请参阅配置参数

要创建架构,您必须具有对所有 Hive 数据的读取访问权限。验证创建架构的用户是否已直接或通过授权服务(如 Sentry 或 Ranger)被授予访问权限。dbadmin 用户没有自动的特殊权限。

创建架构后,您可以使用 ALTER HCATALOG SCHEMA 语句更改多个参数。

定义架构后,您可以按照与查询原生 Vertica 表相同的方式,查询 Hive 数据仓库中的数据。下面的示例演示了,如何创建 HCatalog 架构并随后查询几个系统表以检查新架构的内容。有关这些表的详细信息,请参阅查看 Hive 架构和表元数据

=> CREATE HCATALOG SCHEMA hcat WITH HOSTNAME='hcathost' PORT=9083
   HCATALOG_SCHEMA='default' HIVESERVER2_HOSTNAME='hs.example.com'
   SSL_CONFIG='/etc/hadoop/conf/ssl-client.xml' HCATALOG_USER='admin';
CREATE SCHEMA
=> \x
Expanded display is on.

=> SELECT * FROM v_catalog.hcatalog_schemata;
-[ RECORD 1 ]----------------+-------------------------------------------
schema_id                    | 45035996273748224
schema_name                  | hcat
schema_owner_id              | 45035996273704962
schema_owner                 | admin
create_time                  | 2017-12-05 14:43:03.353404-05
hostname                     | hcathost
port                         | -1
hiveserver2_hostname         | hs.example.com
webservice_hostname          |
webservice_port              | 50111
webhdfs_address              | hs.example.com:50070
hcatalog_schema_name         | default
ssl_config                   | /etc/hadoop/conf/ssl-client.xml
hcatalog_user_name           | admin
hcatalog_connection_timeout  | -1
hcatalog_slow_transfer_limit | -1
hcatalog_slow_transfer_time  | -1
custom_partitions            | f

=> SELECT * FROM v_catalog.hcatalog_table_list;
-[ RECORD 1 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | nation
hcatalog_user_name | admin
-[ RECORD 2 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw
hcatalog_user_name | admin
-[ RECORD 3 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw_rcfile
hcatalog_user_name | admin
-[ RECORD 4 ]------+------------------
table_schema_id    | 45035996273748224
table_schema       | hcat
hcatalog_schema    | default
table_name         | raw_sequence
hcatalog_user_name | admin

配置参数

如果您在创建架构时未覆盖这些值,HCatalog 连接器将使用 Hadoop 配置文件中的以下值。

使用分区数据

Hive 支持对数据进行分区,如下例所示:

hive> create table users (name varchar(64), address string, city varchar(64))
    partitioned by (state varchar(64)) stored as orc;

Vertica 利用元数据(ORC 和 Parquet)中提供的格式的分区信息。查询可以完全跳过不相关的分区(分区修剪),Vertica 不需要实体化分区列。有关如何在 Vertica 中使用分区的详细信息,请参阅分区文件路径。有关如何在 Hive 中创建兼容分区的详细信息,请参阅适用于 Vertica 集成的 Hive 入门知识

默认情况下,Hive 将分区信息存储在表定义的路径下,可能成为 Hive 本地的信息。但是,Hive 用户也可以选择将分区信息存储在其他位置,例如 S3 等共享位置,如下例所示:

hive> alter table users add partition (state='MA')
    location 's3a://DataLake/partitions/users/state=MA';

因此,在查询执行期间,Vertica 必须查询 Hive 以获取表分区信息的位置。

由于额外的 Hive 查询可能很昂贵,因此 Vertica 默认仅在 Hive 的默认位置查找分区信息。如果您的 Hive 表指定了自定义位置,请使用 CUSTOM_PARTITIONS 参数:

=> CREATE HCATALOG SCHEMA hcat WITH HOSTNAME='hcathost' PORT=9083
    HCATALOG_SCHEMA='default' HIVESERVER2_HOSTNAME='hs.example.com'
    SSL_CONFIG='/etc/hadoop/conf/ssl-client.xml' HCATALOG_USER='admin'
    CUSTOM_PARTITIONS='yes';

Vertica 可以访问 S3 和 S3a 方案中的分区位置,不支持 S3n 方案。

HIVE_CUSTOM_PARTITIONS_ACCESSED 系统表记录了查询中使用的所有自定义分区位置。

将 HCatalog 连接器与 WebHCat 一起使用

默认情况下,HCatalog 连接器使用 HiveServer2 访问 Hive 数据。如果您改用 WebHCat,请在创建架构之前将 HCatalogConnectorUseHiveServer2 配置参数设置为 0,如下例所示。

=> ALTER DATABASE DEFAULT SET PARAMETER HCatalogConnectorUseHiveServer2 = 0;
=> CREATE HCATALOG SCHEMA hcat WITH WEBSERVICE_HOSTNAME='webhcat.example.com';

如果您之前使用过 WebHCat,则可以通过将配置参数设置为 1 并使用 ALTER HCATALOG SCHEMA 设置 HIVESERVER2_HOSTNAME 来切换到使用 HiveServer2。您不需要移除 WebHCat 值;HCatalog 连接器使用 HCatalogConnectorUseHiveServer2 的值来确定要使用的参数。

8 - 使用 HCatalog 连接器查询 Hive 表

定义 HCatalog 架构后,您就可以通过在查询中使用该架构名称,来查询 Hive 数据库中的数据。

=> SELECT * from hcat.messages limit 10;
 messageid |   userid   |        time         |             message
-----------+------------+---------------------+----------------------------------
         1 | nPfQ1ayhi  | 2013-10-29 00:10:43 | hymenaeos cursus lorem Suspendis
         2 | N7svORIoZ  | 2013-10-29 00:21:27 | Fusce ad sem vehicula morbi
         3 | 4VvzN3d    | 2013-10-29 00:32:11 | porta Vivamus condimentum
         4 | heojkmTmc  | 2013-10-29 00:42:55 | lectus quis imperdiet
         5 | coROws3OF  | 2013-10-29 00:53:39 | sit eleifend tempus a aliquam mauri
         6 | oDRP1i     | 2013-10-29 01:04:23 | risus facilisis sollicitudin sceler
         7 | AU7a9Kp    | 2013-10-29 01:15:07 | turpis vehicula tortor
         8 | ZJWg185DkZ | 2013-10-29 01:25:51 | sapien adipiscing eget Aliquam tor
         9 | E7ipAsYC3  | 2013-10-29 01:36:35 | varius Cum iaculis metus
        10 | kStCv      | 2013-10-29 01:47:19 | aliquam libero nascetur Cum mal
(10 rows)

由于您通过 HCatalog 连接器访问的表的行为就像 Vertica 表一样,您可以执行同时使用 Hive 数据和原生 Vertica 数据的操作,如 join:

=> SELECT u.FirstName, u.LastName, d.time, d.Message from UserData u
-> JOIN hcat.messages d ON u.UserID = d.UserID LIMIT 10;
FirstName | LastName |        time         |                  Message
----------+----------+---------------------+-----------------------------------
Whitney   | Kerr     | 2013-10-29 00:10:43 | hymenaeos cursus lorem Suspendis
Troy      | Oneal    | 2013-10-29 00:32:11 | porta Vivamus condimentum
Renee     | Coleman  | 2013-10-29 00:42:55 | lectus quis imperdiet
Fay       | Moss     | 2013-10-29 00:53:39 | sit eleifend tempus a aliquam mauri
Dominique | Cabrera  | 2013-10-29 01:15:07 | turpis vehicula tortor
Mohammad  | Eaton    | 2013-10-29 00:21:27 | Fusce ad sem vehicula morbi
Cade      | Barr     | 2013-10-29 01:25:51 | sapien adipiscing eget Aliquam tor
Oprah     | Mcmillan | 2013-10-29 01:36:35 | varius Cum iaculis metus
Astra     | Sherman  | 2013-10-29 01:58:03 | dignissim odio Pellentesque primis
Chelsea   | Malone   | 2013-10-29 02:08:47 | pede tempor dignissim Sed luctus
(10 rows)

9 - 查看 Hive 架构和表元数据

使用 Hive 时,您可以通过执行用 HiveQL(Hive 版本的 SQL)编写的语句(如 SHOW TABLES),访问架构和表元数据。使用 HCatalog 连接器时,您可以通过几个 Vertica 系统表,获取 Hive 数据库中表的元数据。

您可以通过 HCatalog 连接器访问四个包含表元数据的系统表:

  • HCATALOG_SCHEMATA 列出使用 HCatalog 连接器定义的所有架构。

  • HCATALOG_TABLE_LIST 包含使用 HCatalog 连接器定义的所有架构中所有可用表的概览。此表仅显示查询表的用户可以访问的表。针对使用 HCatalog 连接器定义的每个架构均调用一次 HiveServer2 即可检索此表中的信息,这意味着查询此表时的开销非常小。

  • HCATALOG_TABLES 包含比 HCATALOG_TABLE_LIST 更深入的信息。

  • HCATALOG_COLUMNS 列出通过 HCatalog 连接器获得的所有表中所有列的元数据。至于 HCATALOG_TABLES,查询此表会导致对每个表均调用一次 HiveServer2,因此可能需要花费一段时间才能完成。

下面的示例演示了,如何查询包含通过 HCatalog 连接器获取的表元数据的系统表。

=> CREATE HCATALOG SCHEMA hcat WITH hostname='hcathost'
-> HCATALOG_SCHEMA='default' HCATALOG_DB='default' HCATALOG_USER='hcatuser';
CREATE SCHEMA
=> SELECT * FROM HCATALOG_SCHEMATA;
-[ RECORD 1 ]--------+-----------------------------
schema_id            | 45035996273864536
schema_name          | hcat
schema_owner_id      | 45035996273704962
schema_owner         | dbadmin
create_time          | 2013-11-05 10:19:54.70965-05
hostname             | hcathost
port                 | 9083
webservice_hostname  | hcathost
webservice_port      | 50111
hcatalog_schema_name | default
hcatalog_user_name   | hcatuser
metastore_db_name    | hivemetastoredb

=> SELECT * FROM HCATALOG_TABLE_LIST;
-[ RECORD 1 ]------+------------------
table_schema_id    | 45035996273864536
table_schema       | hcat
hcatalog_schema    | default
table_name         | hcatalogtypes
hcatalog_user_name | hcatuser
-[ RECORD 2 ]------+------------------
table_schema_id    | 45035996273864536
table_schema       | hcat
hcatalog_schema    | default
table_name         | tweets
hcatalog_user_name | hcatuser
-[ RECORD 3 ]------+------------------
table_schema_id    | 45035996273864536
table_schema       | hcat
hcatalog_schema    | default
table_name         | messages
hcatalog_user_name | hcatuser
-[ RECORD 4 ]------+------------------
table_schema_id    | 45035996273864536
table_schema       | hcat
hcatalog_schema    | default
table_name         | msgjson
hcatalog_user_name | hcatuser

=> -- Get detailed description of a specific table
=> SELECT * FROM HCATALOG_TABLES WHERE table_name = 'msgjson';
-[ RECORD 1 ]---------+-----------------------------------------------------------
table_schema_id       | 45035996273864536
table_schema          | hcat
hcatalog_schema       | default
table_name            | msgjson
hcatalog_user_name    | hcatuser
min_file_size_bytes   |
total_number_files    | 10
location              | hdfs://hive.example.com:8020/user/exampleuser/msgjson
last_update_time      |
output_format         | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
last_access_time      |
max_file_size_bytes   |
is_partitioned        | f
partition_expression  |
table_owner           |
input_format          | org.apache.hadoop.mapred.TextInputFormat
total_file_size_bytes | 453534
hcatalog_group        |
permission            |

=> -- Get list of columns in a specific table
=> SELECT * FROM HCATALOG_COLUMNS WHERE table_name = 'hcatalogtypes'
-> ORDER BY ordinal_position;
-[ RECORD 1 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | intcol
hcatalog_data_type       | int
data_type                | int
data_type_id             | 6
data_type_length         | 8
character_maximum_length |
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 1
-[ RECORD 2 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | floatcol
hcatalog_data_type       | float
data_type                | float
data_type_id             | 7
data_type_length         | 8
character_maximum_length |
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 2
-[ RECORD 3 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | doublecol
hcatalog_data_type       | double
data_type                | float
data_type_id             | 7
data_type_length         | 8
character_maximum_length |
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 3
-[ RECORD 4 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | charcol
hcatalog_data_type       | string
data_type                | varchar(65000)
data_type_id             | 9
data_type_length         | 65000
character_maximum_length | 65000
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 4
-[ RECORD 5 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | varcharcol
hcatalog_data_type       | string
data_type                | varchar(65000)
data_type_id             | 9
data_type_length         | 65000
character_maximum_length | 65000
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 5
-[ RECORD 6 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | boolcol
hcatalog_data_type       | boolean
data_type                | boolean
data_type_id             | 5
data_type_length         | 1
character_maximum_length |
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 6
-[ RECORD 7 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | timestampcol
hcatalog_data_type       | string
data_type                | varchar(65000)
data_type_id             | 9
data_type_length         | 65000
character_maximum_length | 65000
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 7
-[ RECORD 8 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | varbincol
hcatalog_data_type       | binary
data_type                | varbinary(65000)
data_type_id             | 17
data_type_length         | 65000
character_maximum_length | 65000
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 8
-[ RECORD 9 ]------------+-----------------
table_schema             | hcat
hcatalog_schema          | default
table_name               | hcatalogtypes
is_partition_column      | f
column_name              | bincol
hcatalog_data_type       | binary
data_type                | varbinary(65000)
data_type_id             | 17
data_type_length         | 65000
character_maximum_length | 65000
numeric_precision        |
numeric_scale            |
datetime_precision       |
interval_precision       |
ordinal_position         | 9

10 - 将 HCatalog 架构或表与局部架构或表同步

由于 Hive 的性能问题,从 HCatalog 架构查询数据可能会很慢。当您希望检查 Hive 数据库中表的结构时,这一缓慢的性能可能特别令人头疼。从 Hive 获取此信息需要您使用 HCatalog 连接器查询 HCatalog 架构的元数据。

为了避免这一性能问题,您可以使用 SYNC_WITH_HCATALOG_SCHEMA 函数,在 Vertica 架构内创建 HCatalog 架构元数据的快照。您将向此函数提供:预先存在的 Vertica 架构(通常是通过 CREATE HCATALOG SCHEMA 创建的那个架构)的名称以及一个通过 HCatalog 连接器获得的 Hive 架构。您必须在 Vertica 中拥有写入数据的权限,在 Hive 和 HDFS 中拥有读取数据的权限。

此函数将在 Vertica 架构内创建一个外部表集,而您随后可将该外部表集用于检查 Hive 数据库内表的结构。由于 Vertica 架构中的元数据是本地的,因此查询计划要快得多。您还可以使用标准 Vertica 语句和系统表查询来检查 HCatalog 架构中 Hive 表的结构。

当 SYNC_WITH_HCATALOG_SCHEMA 在 Vertica 中创建表时,它会使 Hive 的 STRING 和 BINARY 类型与 Vertica 的 VARCHAR(65000) 和 VARBINARY(65000) 类型相匹配。在以下两种情况下,您可能会希望使用 ALTER TABLE SET DATA TYPE 来更改这些长度:

  • 如果 Hive 中的值大于 65000 字节,增加其大小并使用 LONG VARCHAR 或 LONG VARBINARY,以免数据被截断。如果 Hive 字符串使用多字节编码,您必须增加 Vertica 的大小,以免数据被截断。需要执行这一步骤的原因是,Hive 按字符计算字符串长度,而 Vertica 按字节计算长度。

  • 如果 Hive 中的值远小于 65000 字节,减少其大小,以节约 Vertica 的内存。

Vertica 架构只不过是 HCatalog 架构元数据的一个快照。在您调用 SYNC_WITH_HCATALOG_SCHEMA 之后,Vertica 不会使用本地架构将后来的更改同步到 HCatalog 架构。您可以再次调用此函数,将本地架构重新同步到 HCatalog 架构。如果您更改了列数据类型,您将需要重复这些更改,因为此函数将创建新的外部表。

默认情况下,SYNC_WITH_HCATALOG_SCHEMA 不会删除出现在本地架构中、但未出现在 HCatalog 架构中的表。因此,此函数调用后,本地架构将不反映自上次调用以来 Hive 数据库中已删除的表。您可以通过以下方式更改此行为:提供可选的第三个布尔参数,让函数删除本地架构中无法与 HCatalog 架构中的表对应的任何表。

您可以使用 SYNC_WITH_HCATALOG_SCHEMA_TABLE 同步个别表,而无需同步整个架构。如果 Vertica 中已经存在该表,此函数会将其覆盖。如果 HCatalog 架构中找不到该表,此函数将返回错误。在所有其他方面,此函数的表现与 SYNC_WITH_HCATALOG_SCHEMA 相同。

如果更改任何 HCatalog 连接器配置参数 (Hadoop 参数) 的设置,则必须再次调用此函数。

示例

下面的示例演示了如何调用 SYNC_WITH_HCATALOG_SCHEMA,将 Vertica 中的 HCatalog 架构与 Hive 中的元数据同步。由于函数直接同步 HCatalog 架构,而不是将其他架构与 HCatalog 架构同步,两个参数都是相同的。

=> CREATE HCATALOG SCHEMA hcat WITH hostname='hcathost' HCATALOG_SCHEMA='default'
   HCATALOG_USER='hcatuser';
CREATE SCHEMA
=> SELECT sync_with_hcatalog_schema('hcat', 'hcat');
sync_with_hcatalog_schema
----------------------------------------
Schema hcat synchronized with hcat
tables in hcat = 56
tables altered in hcat = 0
tables created in hcat = 56
stale tables in hcat = 0
table changes erred in hcat = 0
(1 row)

=> -- Use vsql's \d command to describe a table in the synced schema

=> \d hcat.messages
List of Fields by Tables
  Schema   |   Table  | Column  |      Type      | Size  | Default | Not Null | Primary Key | Foreign Key
-----------+----------+---------+----------------+-------+---------+----------+-------------+-------------
hcat       | messages | id      | int            |     8 |         | f        | f           |
hcat       | messages | userid  | varchar(65000) | 65000 |         | f        | f           |
hcat       | messages | "time"  | varchar(65000) | 65000 |         | f        | f           |
hcat       | messages | message | varchar(65000) | 65000 |         | f        | f           |
(4 rows)

此示例演示了如何与使用 CREATE HCATALOG SCHEMA 创建的架构同步。此外,与使用 CREATE SCHEMA 创建的架构同步亦可获得支持。

将本地架构与 HCatalog 架构同步后,您可在该本地架构中查询表。然而,在同步后的架构中查询表并未比直接查询 HCatalog 架构快很多,因为 SYNC_WITH_HCATALOG_SCHEMA 仅复制 HCatalog 架构的元数据。表中的数据仍要使用 HCatalog 连接器进行检索。

11 - 从 Hive 到 Vertica 的数据类型转换

Hive 识别的数据类型与 Vertica 识别的数据类型不同。下表列出了 HCatalog 连接器如何将 Hive 数据类型转换为与 Vertica 兼容的数据类型。

Hive 和 Vertica 之间的数据宽度处理差异

HCatalog 连接器依靠 Hive SerDe 类从 HDFS 上的文件中提取数据。因此,从这些文件中读取的数据须遵从 Hive 的数据宽度限制。例如,假定 SerDe 将 INT 列的一个值解析成大于 232-1 的值(32 位整数的最大值)。在这种情况下,即使该值适合 Vertica 的 64 位 INTEGER 列也会被拒绝,因为它不属于 Hive 的 32 位 INT。

Hive 以字符为单位测量 CHAR 和 VARCHAR 的长度,而 Vertica 以字节为单位测量其长度。因此,如果使用多字节编码(如 Unicode),文本可能会在 Vertica 中被截断。

值经过解析并转换成 Vertica 数据类型后,会被视为原生数据。比较分别在 Hive 和 Vertica 中运行完全相同的查询所得的结果时,这种处理可能会导致一些混乱。例如,如果您的查询添加两个 INT 值,得到一个大于 232-1 的值,该值会溢出其 32 位 INT 数据类型,导致 Hive 返回错误。而使用 HCatalog 连接器在 Vertica 中运行具有相同数据的相同查询时,该值很可能仍然属于 Vertica 的 64 位 int 值。因此,该添加成功并返回一个值。

12 - 使用非标准 SerDes

Hive 将其数据存储在 Hadoop 分布式文件系统 (HDFS) 内的非结构化平面文件中。执行 Hive 查询时,它将使用一组序列化程序和反序列化程序 (SerDe) 类,来提取这些平面文件中的数据,并将其组织成一个关系数据库表。要想让 Hive 能够从文件中提取数据,它必须具备可以解析文件中所含数据的 SerDe。在 Hive 中创建表时,您可以选择要用于该表数据的 SerDe。

Hive 拥有一组标准的 SerDe,它们能够处理多种格式的数据,比如分隔数据和使用正则表达式提取的数据。您还可以使用第三方或自定义的 SerDe,让 Hive 处理以其他文件格式存储的数据。例如,一些常用的第三方 SerDe 能够处理以 JSON 格式存储的数据。

HCatalog 连接器直接从 HDFS 提取文件段,然后使用 Hive 的 SerDe 类从文件段中提取数据。此连接器包括 Hive 的所有标准 SerDe 类,因此可以处理 Hive 本机支持的任何文件中存储的数据。如想查询使用自定义 SerDe 的 Hive 表中的数据,您必须先在 Vertica 群集上安装 SerDe 类。

确定您需要的 SerDe

如您拥有 Hive 命令行的访问权限,就可以使用 Hive 的 SHOW CREATE TABLE 语句,确定表要使用哪种 SerDe。此语句显示了重新创建表所需的 HiveQL 语句。例如:

hive> SHOW CREATE TABLE msgjson;
OK
CREATE EXTERNAL TABLE msgjson(
messageid int COMMENT 'from deserializer',
userid string COMMENT 'from deserializer',
time string COMMENT 'from deserializer',
message string COMMENT 'from deserializer')
ROW FORMAT SERDE
'org.apache.hadoop.hive.contrib.serde2.JsonSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://hivehost.example.com:8020/user/exampleuser/msgjson'
TBLPROPERTIES (
'transient_lastDdlTime'='1384194521')
Time taken: 0.167 seconds

在此示例中,ROW FORMAT SERDE 表明一个特殊的 SerDe 已用于解析数据文件。下一行则表明,该 SerDe 类命名为 org.apache.hadoop.hive.contrib.serde2.JsonSerde。您必须为 HCatalog 连接器提供此 SerDe 类的副本,以便其可以从此表中读取数据。

您还可以通过查询使用自定义 SerDe 的表,来弄清楚您需要哪种 SerDe 类。此查询将失败并生成错误消息,其中包含解析表中数据所需的 SerDe 类名称。在下面的示例中,错误消息中指定缺失 SerDe 类的部分以粗体显示。

=> SELECT * FROM hcat.jsontable;
ERROR 3399:  Failure in UDx RPC call InvokePlanUDL(): Error in User Defined
Object [VHCatSource], error code: 0
com.vertica.sdk.UdfException: Error message is [
org.apache.hcatalog.common.HCatException : 2004 : HCatOutputFormat not
initialized, setOutput has to be called. Cause : java.io.IOException:
java.lang.RuntimeException:
MetaException(message:org.apache.hadoop.hive.serde2.SerDeException
SerDe com.cloudera.hive.serde.JSONSerDe does not exist) ] HINT If error
message is not descriptive or local, may be we cannot read metadata from hive
metastore service thrift://hcathost:9083 or HDFS namenode (check
UDxLogs/UDxFencedProcessesJava.log in the catalog directory for more information)
at com.vertica.hcatalogudl.HCatalogSplitsNoOpSourceFactory
.plan(HCatalogSplitsNoOpSourceFactory.java:98)
at com.vertica.udxfence.UDxExecContext.planUDSource(UDxExecContext.java:898)
. . .

在 Vertica 群集上安装 SerDe

要获取 HCatalog 连接器需要的 SerDe 类文件,您通常有两种选择:

  • 找到 SerDe 的安装文件,然后将其复制到 Vertica 群集。例如,您可从 Google Code 和 GitHub 等网站获取数个第三方 JSON SerDe。您可能会找到与 Hive 群集上安装的文件相匹配的 SerDe。如果是这样,那么请下载程序包,并将其复制到 Vertica 群集。

  • 将 JAR 文件从 Hive 服务器直接复制到您的 Vertica 群集。SerDe JAR 文件的位置取决于您的 Hive 安装。在某些系统上,它们可能位于 /usr/lib/hive/lib 中。

无论您从哪里得到文件,请将其复制到 Vertica 群集中各节点上的 /opt/vertica/packages/hcat/lib 目录中。

13 - 排除 HCatalog 连接器故障

使用 HCatalog 连接器时,可能会遇到以下问题。

连接错误

在定义架构和查询架构时,HCatalog 连接器都可能遇到错误。出现哪种类型的错误要看哪些 CREATE HCATALOG SCHEMA 参数是不正确的。假设您针对元存储数据库设置的参数不正确,但针对 HiveServer2 设置了正确的参数。在这种情况下,与 HCatalog 相关的系统表查询会成功,而在 HCatalog 架构上进行的查询会失败。下面的示例演示了如何使用正确的默认 HiveServer2 信息创建 HCatalog 架构。但元存储数据库的端口号是不正确的。

=> CREATE HCATALOG SCHEMA hcat2 WITH hostname='hcathost'
-> HCATALOG_SCHEMA='default' HCATALOG_USER='hive' PORT=1234;
CREATE SCHEMA
=> SELECT * FROM HCATALOG_TABLE_LIST;
-[ RECORD 1 ]------+---------------------
table_schema_id    | 45035996273864536
table_schema       | hcat2
hcatalog_schema    | default
table_name         | test
hcatalog_user_name | hive

=> SELECT * FROM hcat2.test;
ERROR 3399:  Failure in UDx RPC call InvokePlanUDL(): Error in User Defined
 Object [VHCatSource], error code: 0
com.vertica.sdk.UdfException: Error message is [
org.apache.hcatalog.common.HCatException : 2004 : HCatOutputFormat not
initialized, setOutput has to be called. Cause : java.io.IOException:
MetaException(message:Could not connect to meta store using any of the URIs
provided. Most recent failure: org.apache.thrift.transport.TTransportException:
java.net.ConnectException:
Connection refused
at org.apache.thrift.transport.TSocket.open(TSocket.java:185)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(
HiveMetaStoreClient.java:277)
. . .

要解决这些问题,您必须删除并重新创建架构,或更改架构以更正参数。如果问题仍然存在,请确定 Vertica 群集和 Hadoop 群集之间是否存在连接性问题。此类问题可能包括能够阻止一个或多个 Vertica 主机联系 HiveServer2、元存储或 HDFS 主机的防火墙。

查询数据时 UDx 发生故障:错误 3399

查询数据(而不是架构信息等元数据)时,您可能会看到错误消息。伴随该消息的出现,日志中可能会记录一个 ClassNotFoundException。发生这种情况的原因可能如下:

  • 您在 Hadoop 和 Vertica 节点上使用的 Java 版本不同。在这种情况下,您需要对其中之一进行更改,使其与另一个相匹配。

  • 您还没有使用 hcatUtil 将所有的 Hadoop 和 Hive 库以及配置文件复制到 Vertica;或者您运行了 hcatutil,然后更改了您的 Hadoop 或 Hive 版本。

  • 您将 Vertica 升级到了新版本,而没有重新运行 hcatutil 并重新安装 HCatalog 连接器。

  • 您使用的 Hadoop 版本依赖于一个必须手动复制的第三方库。

  • 您要读取使用 LZO 压缩的文件,但还没有复制库或设置 core-site.xml 中的 io.compression.codecs 属性。

  • 您要从 Hive 读取 Parquet 数据,且多个列在表中已经存在一些数据之后被添加到表中。添加列不会更新现有数据,Hive 提供并由 HCatalog 连接器使用的 ParquetSerDe 无法处理这种情况。此错误是由于 Hive 中的限制造成的,并且没有解决方法。

  • 查询花费的时间太长并且即将超时。如果这是一个常见问题,您可以增加 UDxFencedBlockTimeout 配置参数的值。请参阅常规参数

如果您未曾复制库或配置 LZO 压缩,请遵循为 HCatalog 配置 Vertica 中的说明。

如果您从 Hadoop 复制的 Hive jar 文件过期,您可能会看到像下面这样的错误消息。

ERROR 3399: Failure in UDx RPC call InvokePlanUDL(): Error in User Defined Object [VHCatSource],
error code: 0 Error message is [ Found interface org.apache.hadoop.mapreduce.JobContext, but
class was expected ]
HINT hive metastore service is thrift://localhost:13433 (check UDxLogs/UDxFencedProcessesJava.log
in the catalog directory for more information)

此错误通常指示 hive-hcatalog-core jar 出现问题。请确保您拥有此文件的最新副本。请记住,如果重新运行 hcatUtil,您还需要重新创建 HCatalog 架构。

您可能还会看到不同形式的此错误:

ERROR 3399: Failure in UDx RPC call InvokePlanUDL(): Error in User Defined Object [VHCatSource],
error code: 0 Error message is [ javax/servlet/Filter ]

即使 hcatUtil 报告您的库都是最新的,您仍可能收到此错误的报告。部分 Hadoop 版本会使用 javax.servlet.Filter 类所在的库,但该库通常情况下并非 Hadoop 安装的直接组成部分。如果您看到提及此类的错误,请在 Hadoop 节点上找到 servlet-api-*.jar,然后将其复制到所有数据库节点上的 hcat/lib 目录。如果您在 Hadoop 节点上找不到它,请通过互联网查找并下载。(这种情况很少见。)库的版本必须为 2.3 或更高版本。

将该 jar 文件复制到 hcat/lib 目录后,请按照为 HCatalog 配置 Vertica 中的说明,重新安装 HCatalog 连接器。

查询数据时发生身份验证错误

您可能已经使用 CREATE HCATALOG SCHEMA 成功创建了架构,但在查询时出现如下错误:

=> SELECT * FROM hcat.clickdata;
ERROR 6776:  Failed to glob [hdfs:///user/hive/warehouse/click-*.parquet]
because of error: hdfs:///user/hive/warehouse/click-12214.parquet: statAll failed;
error: AuthenticationFailed

如果 Hive 使用授权服务,您可能会看到此错误。如果 HDFS 中底层文件的权限与授权服务中的权限匹配,则 Vertica 在访问该数据时必须使用用户模拟。要启用用户模拟,请将 EnableHCatImpersonation 配置参数设置为 1。

Vertica 使用数据库主体访问 HDFS。因此,如果 EnableHCatImpersonation 为 0,则 Vertica 数据库主体必须有权访问 HDFS 上 Hive 仓库内的数据。如果无权访问,您可能会看到以下错误:

=> SELECT * FROM hcat.salesdata;
ERROR 6776:  Failed to glob [vertica-hdfs:///hive/warehouse/sales/*/*]
because of error: vertica-hdfs:///hive/warehouse/sales/: listStat failed;
error: Permission denied: user=vertica, access=EXECUTE, inode="/hive/warehouse/sales":hdfs:hdfs:d---------

此错误消息中的 URL 方案已从 hdfs 更改为 vertica-hdfs。这是一个内部方案,在 Vertica 之外的 URL 中无效。在 HDFS 中指定路径时不能使用此方案。

Hive 和 Vertica 查询的结果不一致

有些时候,通过 HCatalog 连接器在 Hive 和 Vertica 上运行相同的查询可能会返回不同的结果。这个问题有几种常见原因。

这种差异往往由 Hive 和 Vertica 支持的数据类型不同导致。有关受支持的数据类型的详细信息,请参阅从 Hive 到 Vertica 的数据类型转换

如果 Hive 字符串的值在 Vertica 中被截断,这可能是由 Hive 中的多字节字符编码导致的。Hive 以字符为单位报告字符串长度,而 Vertica 则以字节为单位记录该长度。对于 Unicode 等两字节编码,您需要在 Vertica 中将列大小增加一倍以避免其被截断。

如果 Hive 表使用除字符串以外的其他类型的分区列,也有可能会产生差异。

如果 Hive 表将分区数据存储在自定义位置而不是默认位置,且您在创建 Vertica 架构时未指定 CUSTOM_PARTITIONS 参数,您将看到不同的查询结果。请参阅使用分区数据。此外,即使使用自定义分区,Vertica 和 Hive 之间也存在差异:

  • 如果自定义分区在查询时不可用,则 Hive 将忽略它并返回其余结果。Vertica 报告错误。

  • 如果在创建表后在 Hive 中更改分区以使用自定义位置,则 Hive 仅从新位置读取数据,而 Vertica 从默认位置和新位置读取数据。

  • 如果分区值与其对应的目录名称不一致,Hive 将使用其元数据中的值,而 Vertica 使用目录名称中的值。

下面的示例说明了这些差异。Hive 中按状态列分区的表以下面的数据开头:

hive> select * from inventory;
+--------------+-----------------+-----------------+--+
| inventory.ID | inventory.quant | inventory.state |
+--------------+-----------------+-----------------+--+
| 2            | 300             | CA              |
| 4            | 400             | CA              |
| 5            | 500             | DC              |
| 1            | 100             | PA              |
| 2            | 200             | PA              |
+--------------+-----------------+-----------------+--+

然后,移动状态为 CA 的分区。该目录已经包含一些数据。请注意,查询现在会针对 CA 分区返回不同的结果。

hive> ALTER TABLE inventory PARTITION (state='CA') SET LOCATION 'hdfs:///partitions/inventory/state=MD';
hive> select * from inventory;
+--------------+-----------------+-----------------+--+
| inventory.ID | inventory.quant | inventory.state |
+--------------+-----------------+-----------------+--+
| 20           | 30000           | CA              |
| 40           | 40000           | CA              |
| 5            | 500             | DC              |
| 1            | 100             | PA              |
| 2            | 200             | PA              |
+--------------+-----------------+-----------------+--+
5 rows selected (0.399 seconds)

CA 分区已移至名为 state=MD 的目录。由于目录名称,Vertica 将前两行(新分区位置中的行)的状态报告为 MD。除了新位置之外,它还报告来自原始位置的 CA 值:

=> SELECT * FROM hcat.inventory;
 ID | quant | state
----+----------+------
 20 | 30000 | MD
 40 | 40000 | MD
  2 | 300   | CA
  4 | 400   | CA
  1 | 100   | PA
  2 | 200   | PA
  5 | 500   | DC
(7 rows)

MapR 上的 HCatalog 连接器安装失败

如果您将 MapR 文件系统挂载为 NFS 挂载点,然后安装 HCatalog 连接器,则可能会失败并显示如下消息:

ROLLBACK 2929: Couldn't create new UDx side process,
failed to get UDx side process info from zygote: Broken pipe

这可能伴随着 dbLog 中的如下错误:

java.io.IOException: Couldn't get lock for /home/dbadmin/node02_catalog/UDxLogs/UDxFencedProcessesJava.log
    at java.util.logging.FileHandler.openFiles(FileHandler.java:389)
    at java.util.logging.FileHandler.<init>(FileHandler.java:287)
    at com.vertica.udxfence.UDxLogger.setup(UDxLogger.java:78)
    at com.vertica.udxfence.UDxSideProcess.go(UDxSideProcess.java:75)
    ...

如果您在创建 NFS 挂载点时将其锁定,则会出现此错误。锁定是默认设置。如果您使用 HCatalog 连接器并将 MapR 挂载为 NFS 挂载点,则必须使用 -o nolock 选项创建挂载点。例如:

sudo mount -o nolock -t nfs MaprCLDBserviceHostname:/mapr/ClusterName/vertica/$(hostname -f)/ vertica

您可以将 HCatalog 连接器与 MapR 一起使用,而无需挂载 MapR 文件系统。如果您挂载 MapR 文件系统,则必须在没有锁定的情况下执行此操作。

过多的查询延迟

网络问题或 HiveServer2 服务器上的高系统负载可能会在使用 HCatalog 连接器查询 Hive 数据库时导致长时间延迟。虽然 Vertica 不能解决这些问题,但您可以设置参数,限制 Vertica 在取消 HCatalog 架构上的查询之前等待多长时间。您可以使用 Vertica 配置参数在全局范围内设置这些参数。您还可以在 CREATE HCATALOG SCHEMA 语句中针对特定的 HCatalog 架构设置这些参数。这些特定设置将覆盖配置参数中的设置。

HCatConnectionTimeout 配置参数和 CREATE HCATALOG SCHEMA 语句的 HCATALOG_CONNECTION_TIMEOUT 参数控制 HCatalog 连接器在连接到 HiveServer2 服务器时等待多少秒。值为 0(配置参数的默认设置)是指无限期地等待。如果到此超时过去后,服务器仍然没有响应,HCatalog 连接器会断开连接并取消查询。如果您发现在 HCatalog 架构上执行的某些查询暂停时间过长,请尝试将此参数设置为一个超时值,这样查询就不会无限期挂起了。

HCatSlowTransferTime 配置参数和 CREATE HCATALOG SCHEMA 语句的 HCATALOG_SLOW_TRANSFER_TIME 参数指定 HCatlog 连接器在成功连接到服务器后等待数据的时间。指定时间过去后,HCatalog 连接器将确定来自服务器的数据传输速度是否达到了在 HCatSlowTransferLimit 配置参数中(或通过 CREATE HCATALOG SCHEMA 语句的 HCATALOG_SLOW_TRANSFER_LIMIT 参数)设置的值。如果没有达到,那么 HCatalog 连接器将终止连接并取消查询。

您可以设置这些参数,以取消运行非常缓慢但最终确实可以完成的查询。然而,导致查询延迟的原因通常是连接缓慢而不是无法建立连接。因此,请先尝试调整缓慢的传输速度设置。如果您发现导致问题的原因是连接永远都无法完成,您还可以将 Linux TCP 套接字超时调整为合适的值,而不是完全依赖于 HCatConnectionTimeout 参数。

SerDe 错误

如果您尝试查询使用非标准 SerDe 的 Hive 表,可能会发生错误。如果您尚未在 Vertica 群集上安装 SerDe JAR 文件,您将收到与以下示例中类似的错误消息:

=> SELECT * FROM hcat.jsontable;
ERROR 3399:  Failure in UDx RPC call InvokePlanUDL(): Error in User Defined
Object [VHCatSource], error code: 0
com.vertica.sdk.UdfException: Error message is [
org.apache.hcatalog.common.HCatException : 2004 : HCatOutputFormat not
initialized, setOutput has to be called. Cause : java.io.IOException:
java.lang.RuntimeException:
MetaException(message:org.apache.hadoop.hive.serde2.SerDeException
SerDe com.cloudera.hive.serde.JSONSerDe does not exist) ] HINT If error
message is not descriptive or local, may be we cannot read metadata from hive
metastore service thrift://hcathost:9083 or HDFS namenode (check
UDxLogs/UDxFencedProcessesJava.log in the catalog directory for more information)
at com.vertica.hcatalogudl.HCatalogSplitsNoOpSourceFactory
.plan(HCatalogSplitsNoOpSourceFactory.java:98)
at com.vertica.udxfence.UDxExecContext.planUDSource(UDxExecContext.java:898)
. . .

您可在错误消息中看到,出错的根本原因是缺少一个 SerDe 类(以粗体显示)。要解决此问题,请在 Vertica 群集上安装 SerDe 类。有关详细信息,请参阅使用非标准 SerDes

如果群集中仅一个或少量主机没有 SerDe 类,此错误可能会间歇性出现。