对导入和导出 Hadoop 格式进行故障诊断

了解如何解决导入和导出 Hadoop 特定格式时发生的问题。

已知限制

以下是将 Fast Data Movement 与 Hadoop 格式配合使用时的限制和可能错误的列表。这些限制是发布时在所列环境中测试数据移动功能部件时发现的。请注意,这些问题随时可能在数据库服务提供程序端解决。
  • 导入到 Hadoop 格式是以 Hive 语句形式实现,该语句将传输自 Db2® Warehouse 的文本数据插入到以某种 Hadoop 格式存储的 Hive 表中。这同样适用于相反方向上的导出。因此,数据传输在很大程度上依赖于 Hive 以及特定 Hadoop 发行版上的格式实现。这意味着,特定 Hadoop 发行版上存在的任何限制和缺陷也会影响到数据移动。
  • 要导入到 Hadoop 格式,必须在 Hive 中设置 enable.doAs=true。有了此设置,在 Hive 中执行的操作就会以建立连接的用户身份执行,而不是以启动 HiveServer 的用户身份执行。
  • 使用 Hadoop 格式时,无法处理非打印控制字符。如果数据中包含这些字符,请勿导入到 Hadoop 格式。
  • 如果 Db2 Warehouse 中的数据包含 NUMERIC 字段(这些字段会映射到 Hadoop 上的 DECIMAL),请勿使用 Avro 格式。转换后的数据可能会不一致。
  • 移动包含以 ORC 格式存储的时间戳记数据类型的表可能会导致数据不一致。此问题依赖于 JDBC 驱动程序和 Hive 版本。执行移动后,您始终应该核实数据一致。您可以使用校验和计算功能实现该目的。
  • IBM BigInsights 限制:
    • 在 BigInsights 3 上,不支持导入到 Avro 和 Parquet,这些操作会导致以下错误:
      com.ibm.fq.common.exception.hive.HiveException: Unable to execute Hive sql. 
      Error while processing statement: FAILED: SemanticException Unrecognized file 
      format in STORED AS clause: avr
    • 在 BigInsights 3 上,如果表包含 bigintint8 数据类型,请勿将其导入到 ORC 格式。
    • 在 BigInsights 4.0 上,不支持使用 Parquet,它会导致下列其中一个错误:
      Incompatible Long vector column and primitive category VOID
      Unimplemented vector assigner for writable type class 
      org.apache.hadoop.hive.serde2.io.HiveDecimalWritable
    • 在 BigInsights 4.0 上,不支持将时间戳记数据类型导入到 Avro 格式。
    • 不支持导入到 BigSQL。您可以将表导入到 Hive,然后手动将其与 BigSQL 同步。但是,即使在手动同步之后,也不支持查询以 Avro 格式从 BigSQL 导入的文件。
  • Cloudera 限制:
    • 版本早于 5.3 的 Cloudera 不支持导入到 Hadoop 格式。
    • 对于 Parquet,无法导入行中包含换行符的表。错误症状是,在包含换行符的记录中,存在数据未对齐的额外行。您可以使用其他压缩格式导入此类数据。
    • 在 Cloudera 上,不支持将时间戳记数据类型导入到 Avro 格式。
    • Impala 不支持 ORC 格式。
    • 在版本早于 5.5 的 Cloudera 上,不支持在 Impala 中查询已导入的 Avro 表。
  • Hortonworks 限制:
    • 在 Hortonworks 2.2 上,无法在 fq.output.compressed 中指定用于 Avro 的压缩类型。您可以保留该参数为空,这将使用缺省的 Hadoop 压缩。
    • 在 Hortonworks 2.2 上,不支持导入到 Parquet。
    • 使用 Hortonworks 2.3 时,用于 Hive JDBC 连接的 add jar 命令可能会导致 NullPointerException

常见错误和解决方案

  • 数据移动因以下错误而失败:
    ERROR com.ibm.fq.ConnectionValidator - Unable to execute Hive sql. Error while processing
          statement: Cannot modify avro.output.codec at runtime. It is not in list of params that are
          allowed to be modified at runtime
    添加或修改值为 avro.output.codec 的定制 Hive 参数“hive.security.authorization.sqlstd.confwhitelist.append”,如以下示例所示:
    <property>
    <name>hive.security.authorization.sqlstd.confwhitelist.append</name>
    <value>avro.output.codec</value>
    </property>
    如果需要多个条目(例如,同时使用 Parquet 和 Avro 压缩),那么应将此参数指定为:
    <property>
    <name>hive.security.authorization.sqlstd.confwhitelist.append</name>
    <value>parquet\.compression|avro\.output\.codec</value>
    </property>
  • 如果针对 FLOAT 列使用 WHERE 子句,那么在 Parquet 中导出 Hive 表会失败。这是 Hive 的一个问题,在以下主题中进行了描述:https://issues.apache.org/jira/browse/HIVE-13114

导入到 Hadoop 格式失败的症状

导入到 Hadoop 格式的操作由于任何原因而中断时,在 Hive/HDFS 中将会创建两个表,而不是一个表:

目标表 <table_name>_npscopy
  • 对于 AVRO 格式,任何查询都可能会抛出以下错误:
    java.io.IOException: org.apache.hadoop.hive.serde2.avro.AvroSerdeException: 
    Neither avro.schema.literal nor avro.schema.url specified, 
    can't determine table schema
  • 对于其他格式,表的行为就像是空表一样。
临时表 <table_name>_<process_id>_<miliseconds_from_1970.01.01>_npscopy
例如:table1_3480_1487843174319_npscopy
  • 用户无法查询这个表。
  • Error: java.io.IOException: cannot find class
        com.ibm.nz.codec.NzCopyInputFormat

如果执行导入操作后创建了两个表,并且您查询表时看到上述任何错误消息,那么表示导入操作在某个点失败。

用于 Hive 的定制设置

通过在配置 XML 文件中设置 fq.data.format.setting 属性,可以先定义定制设置,再将数据插入到 Hive 中。这允许您定义自己的压缩属性,或定义与目标格式相关的任何其他 Hive 设置。请提供一列以逗号分隔的设置(不含 SET 命令)作为值:
<property>
        <name>fq.data.format.setting</name>
        <value>hive.exec.compress.output=true,avro.output.codec=snappy</value>
    </property>
这会将以下命令列表发送到 Hive:
SET hive.exec.compress.output=true;
SET avro.output.codec=snappy;

验证中间文本数据文件

如果导入到 Hadoop 格式的结果不正确,您可以在 fq.debug.keep.tmptable 参数的帮助下分析问题。此参数设置为 true 时,在导入完成后,不会删除用于以 Hadoop 格式插入到目标表的中间文本文件。此参数只能与 fq.data.directmovement=false(缺省值)配合使用。使用 fq.debug.keep.tmptable=true 执行导入后,文本文件将保留在 <target_table_dir>/tmptable 子目录中,而基于此目录的 Hive 文本表 <target_table>NPSCOPY 也可用。