从 HDInsight 3.6 到 HDInsight 4.0 迁移 Hive 工作负载的故障排除指南

本文提供了客户在将 Hive 工作负载从 HDInsight 3.6 迁移到 HDInsight 4.0 时所面临的一些最常见问题的解答。

降低运行 DESCRIBE TABLE_NAME 时的延迟

解决方法:

  • 增加可在一个批处理中从元存储检索的最大对象数(表/分区)。 将它设置为一个较大的数字(默认值为 300),直到达到令人满意的延迟级别。 此数值越大,需要往返 Hive 元存储服务器的次数就越少,但是,这也可能导致客户端需要更高的内存。

    hive.metastore.batch.retrieve.max=2000

  • 重新启动 Hive 和所有过时服务

如果为表设置了 skip.header.line.count 和 skip.footer.line.count,则无法查询 Gzip 压缩的文本文件

此问题在 Interactive Query 4.0 中得到了修复,但在 Interactive Query 3.1.0 中仍然存在

解决方法:

  • 在不使用 "skip.header.line.count"="1""skip.footer.line.count"="1" 的情况下创建表,然后从排除了查询中的标头/页脚行的原始表创建视图。

无法使用 Unicode 字符

解决方法:

  1. 连接到你的群集的 Hive 元存储数据库。

  2. 使用以下命令备份 TBLSTABLE_PARAMS 表:

        select * into tbls_bak from tbls;
        select * into table_params_bak from table_params;
    
  3. 手动将受影响的列类型更改为 nvarchar(max)

        alter table TABLE_PARAMS alter column PARAM_VALUE nvarchar(max);
        alter table TBLS alter column VIEW_EXPANDED_TEXT nvarchar(max) null;    
        alter table TBLS alter column VIEW_ORIGINAL_TEXT nvarchar(max) null;
    

CREATE TABLE AS SELECT (CTAS) 会创建一个具有相同 UUID 的新表

Hive 3.1 (HDInsight 4.0) 提供内置 UDF 来生成唯一的 UUID。 Hive UUID () 方法将生成唯一的 ID,即使使用 CTAS 也是如此。 可以按如下所示使用它。

create table rhive as
select uuid() as UUID
from uuid_test

Hive 作业输出格式不同于 HDInsight 3.6

这是由 HDInsight 3.6 和 HDInsight 4.0 之间的 WebHCat(Templeton) 的差异所导致的。

  • Hive REST API - 添加 arg=--showHeader=false -d arg=--outputformat=tsv2 -d

  • .NET SDK - 初始化 HiveJobSubmissionParameters 的参数

    List<string> args = new List<string> { { "--showHeader=false" }, { "--outputformat=tsv2" } };
                var parameters = new HiveJobSubmissionParameters
                {
                    Query = "SELECT clientid,market from hivesampletable LIMIT 10",
                    Defines = defines,
                    Arguments = args
                };
    

降低 Hive 内部表创建延迟

  1. 从 Advanced hive-site 和 Advanced hivemetastore-site 中,删除 hive.metastore.transactional.event.listeners 的值 org.apache.hive.hcatalog.listener.DbNotificationListener

  2. 如果 hive.metastore.event.listeners 有值,请删除它。

  3. DbNotificationListener 仅在使用 REPL 命令时才需要,如果不需要,可以将它删除。

    降低 HDInsight 4.0 中的内部表延迟。

更改 Hive 默认表位置

这是针对 HDInsight 4.0 (Hive 3.1) 有意设计的行为更改。 此更改的主要原因是出于文件权限控制目的。

若要在自定义位置下创建外部表,请在 create table 语句中指定位置。

在 HDInsight 4.0 中禁用 ACID

建议在 HDInsight 4.0 中启用 ACID。 Hive 中大部分最近的增强(包括功能和性能)仅对 ACID 表可用。

在 HDInsight 4.0 上禁用 ACID 的步骤:

  1. 在 Ambari 中更改以下 Hive 配置:

    hive.strict.managed.tables=false
    hive.support.concurrency=false; 
    hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager;
    hive.enforce.bucketing=false;
    hive.compactor.initiator.on=false;
    hive.compactor.worker.threads=0;
    hive.create.as.insert.only=false;
    metastore.create.as.acid=false;
    

注意

如果 hive.strict.managed.tables 设置为 true(默认值)<>,则创建托管表和非事务表将失败,并出现以下错误:

java.lang.Exception: java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. Table <Table name> failed strict managed table checks due to the following reason: Table is marked as a managed table but is not transactional.
  1. 重新启动 Hive 服务。

重要

Azure 建议不要将相同的数据/存储与 HDInsight 3.6 和 HDInsight 4.0 Hive 托管表共享。这是不受支持的方案。

  • 通常情况下,应该在 HDInsight 4.0 集群上创建任何 Hive 表之前设置上述配置。 创建托管表后,我们不应禁用 ACID。 这可能会导致数据丢失或结果不一致。 因此,建议在创建新群集时只设置一次,之后不再更改。

  • 在创建表之后禁用 ACID 这一操作存在风险,但如果要执行此操作,请遵循以下步骤以避免潜在的数据丢失或不一致:

    1. 使用 CTAS 命令 create external table e_t1 select * from m_t1 创建具有相同架构的外部表并从原始托管表复制数据。
    2. 使用 drop table m_t1 删除托管表。
    3. 使用建议的配置禁用 ACID。
    4. 再次使用 CTAS 命令 create table m_t1 select * from e_t1 创建 m_t1 并从外部表复制数据。
    5. 使用 drop table e_t1 删除外部表。

在禁用 ACID 之前,请确保所有托管表都已转换为外部表并已被删除。 此外,请在完成每一步骤之后比较架构和数据,从而避免出现任何差异。

创建具有 755 权限的 Hive 外部表

可以通过以下两个选项之一来解决此问题:

  1. 手动将文件夹权限设置为 757 或 777,从而允许 Hive 用户写入目录。

  2. 将“Hive Authorization Manager”从 org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider 更改为 org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly

MetaStoreAuthzAPIAuthorizerEmbedOnly 会有效禁用安全检查,因为 Hive 元存储并未嵌入在 HDInsight 4.0 中。 但是,这可能会带来其他潜在的问题。 因此,使用此选项时请务必小心。

升级到 HDInsight 4.0 后 Hive 作业中的权限错误

  • 在 HDInsight 4.0 中,所有带有 Hive 组件的群集形状都配置有一个新的授权提供程序:

    org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider

  • 应该将 HDFS 文件权限分配给要访问的文件的 Hive 用户。 错误消息会提供解决此问题所需的详细信息。

  • 还可以切换到 HDInsight 3.6 Hive 群集中使用的 MetaStoreAuthzAPIAuthorizerEmbedOnly 提供程序。

    org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly

    将授权设置为 MetaStoreAuthzAPIAuthorizerEmbedOnly。

无法通过 OpenCSVSerde 查询表

csv 格式表中读取数据可能会引发如下异常:

MetaException(message:java.lang.UnsupportedOperationException: Storage schema reading not supported)

解决方法:

  • 通过 Ambari UI 在 Custom hive-site 中添加配置 metastore.storage.schema.reader.impl=org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader

  • 重启所有陈旧 Hive 服务

后续步骤

如果你的问题未在本文中列出,或者无法解决问题,请访问以下渠道之一获取更多支持:

  • 如果需要更多帮助,可以从 Azure 门户提交支持请求。 从菜单栏中选择“支持” ,或打开“帮助 + 支持” 中心。