对导入和导出 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 上,如果表包含
bigint
和int8
数据类型,请勿将其导入到 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 导入的文件。
- 在 BigInsights 3 上,不支持导入到 Avro 和 Parquet,这些操作会导致以下错误:
- 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
。
- 在 Hortonworks 2.2 上,无法在
常见错误和解决方案
- 数据移动因以下错误而失败:
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
- 对于其他格式,表的行为就像是空表一样。
- 对于 AVRO 格式,任何查询都可能会抛出以下错误:
- 临时表 <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 也可用。