sqoop 从 netezza 失败 - "java.lang.ArrayIndexOutOfBoundsException"
sqoop fails from netezza - "java.lang.ArrayIndexOutOfBoundsException"
我正在努力解决 debug/understand 为什么我的 sqoop 命令在 Netezza 数据库中失败。
我已经对许多其他 table 使用了基本相同的 sqoop 命令,没有任何问题。此源 table 特别没有任何普通数据类型,所有 nvarchar、nchar、整数、时间戳等。
这里是指定的sqoop命令:
sqoop import \
--connect jdbc:netezza://netezza-host-name:5480/nzdatabase \
--username user \
--password secret \
--table source_table_name \
--as-sequencefile \
--hive-drop-import-delims \
--num-mappers 1
我已经尝试了很多东西,例如导入到纯文本文件,作为 avro 文件,没有 hive-drop-import-delimiters
,等等。
16/03/25 18:27:48 INFO mapreduce.Job: Job job_1458490578260_0050 running in uber mode : false
16/03/25 18:27:48 INFO mapreduce.Job: map 0% reduce 0%
16/03/25 18:28:52 INFO mapreduce.Job: Task Id : attempt_1458490578260_0050_m_000000_0, Status :
FAILED
Error: java.lang.ArrayIndexOutOfBoundsException
at org.netezza.sql.NzConnection.receiveDbosTuple(NzConnection.java:739)
at org.netezza.internal.QueryExecutor.update(QueryExecutor.java:340)
at org.netezza.sql.NzConnection.updateResultSet(NzConnection.java:2704)
at org.netezza.sql.NzResultSet.next(NzResultSet.java:1924)
at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:237)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:5
我在 Sqoop version: 1.4.6.2.3.2.0-2950
。
因此,我们了解到此问题与 sqoop 完全无关。事实证明,这是旧版本 nzjdbc.jar
的错误。将其升级到最新版本,现在 sqoop 可以正常工作了。
我们使用ora_hash函数在oracle db上用5个映射器解决这个问题。
--boundary-query 'select 1, 5 from dual'
--query "select col1,col2,col3.... from (select *, ora_hash(rowid, 4) + 1 orah from db.table) where 1=1 AND $CONDITIONS"
我正在努力解决 debug/understand 为什么我的 sqoop 命令在 Netezza 数据库中失败。
我已经对许多其他 table 使用了基本相同的 sqoop 命令,没有任何问题。此源 table 特别没有任何普通数据类型,所有 nvarchar、nchar、整数、时间戳等。
这里是指定的sqoop命令:
sqoop import \
--connect jdbc:netezza://netezza-host-name:5480/nzdatabase \
--username user \
--password secret \
--table source_table_name \
--as-sequencefile \
--hive-drop-import-delims \
--num-mappers 1
我已经尝试了很多东西,例如导入到纯文本文件,作为 avro 文件,没有 hive-drop-import-delimiters
,等等。
16/03/25 18:27:48 INFO mapreduce.Job: Job job_1458490578260_0050 running in uber mode : false
16/03/25 18:27:48 INFO mapreduce.Job: map 0% reduce 0%
16/03/25 18:28:52 INFO mapreduce.Job: Task Id : attempt_1458490578260_0050_m_000000_0, Status :
FAILED
Error: java.lang.ArrayIndexOutOfBoundsException
at org.netezza.sql.NzConnection.receiveDbosTuple(NzConnection.java:739)
at org.netezza.internal.QueryExecutor.update(QueryExecutor.java:340)
at org.netezza.sql.NzConnection.updateResultSet(NzConnection.java:2704)
at org.netezza.sql.NzResultSet.next(NzResultSet.java:1924)
at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:237)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:5
我在 Sqoop version: 1.4.6.2.3.2.0-2950
。
因此,我们了解到此问题与 sqoop 完全无关。事实证明,这是旧版本 nzjdbc.jar
的错误。将其升级到最新版本,现在 sqoop 可以正常工作了。
我们使用ora_hash函数在oracle db上用5个映射器解决这个问题。
--boundary-query 'select 1, 5 from dual'
--query "select col1,col2,col3.... from (select *, ora_hash(rowid, 4) + 1 orah from db.table) where 1=1 AND $CONDITIONS"