sqoop从DB2迁移数据到HDFS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqoop从DB2迁移数据到HDFS相关的知识,希望对你有一定的参考价值。

Sqoop import job failed to read data from DB2 database which has UTF8 encoding. Essentially, even the data cannot be read at DB2 with select queries as there are some characters which are not in UTF8.

Sqoop job will throw an error similar to below:

Error: java.io.IOException: SQLException in nextKeyValue
        at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:265)
..
..
Caused by: com.ibm.db2.jcc.am.SqlException: [jcc][t4][1065][12306][4.19.26] Caught java.io.CharConversionException.  See attached Throwable for details. ERRORCODE=-4220, SQLSTATE=null
        at com.ibm.db2.jcc.am.kd.a(Unknown Source)
        at com.ibm.db2.jcc.am.kd.a(Unknown Source)
..
..
Caused by: java.nio.charset.MalformedInputException: Input length = 527
        at com.ibm.db2.jcc.am.s.a(Unknown Source)
        ... 22 more
Caused by: sun.io.MalformedInputException
        at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:105)
        ... 23 more
2018-09-10 06:01:34,879 INFO mapreduce.Job:  map 0% reduce 0%
2018-09-10 06:01:45,942 INFO mapreduce.Job:  map 100% reduce 0%
2018-09-10 06:02:02,039 INFO mapreduce.Job: Task Id : attempt_1535965915754_0038_m_000000_2, Status : FAILED
Error: java.io.IOException: SQLException in nextKeyValue
        at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:277)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:556)
        at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
        at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
        at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1988)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: com.ibm.db2.jcc.am.SqlException: [jcc][t4][1065][12306][4.16.53] Caught java.io.CharConversionException.  See attached Throwable for details. ERRORCODE=-4220, SQLSTATE=null
        at com.ibm.db2.jcc.am.fd.a(fd.java:723)
        at com.ibm.db2.jcc.am.fd.a(fd.java:60)
        at com.ibm.db2.jcc.am.fd.a(fd.java:112)
        at com.ibm.db2.jcc.am.jc.a(jc.java:2870)
        at com.ibm.db2.jcc.am.jc.p(jc.java:527)
        at com.ibm.db2.jcc.am.jc.N(jc.java:1563)
        at com.ibm.db2.jcc.am.ResultSet.getStringX(ResultSet.java:1153)
        at com.ibm.db2.jcc.am.ResultSet.getString(ResultSet.java:1128)
        at org.apache.sqoop.lib.JdbcWritableBridge.readString(JdbcWritableBridge.java:71)
        at com.cloudera.sqoop.lib.JdbcWritableBridge.readString(JdbcWritableBridge.java:61)
        at PC_KPI_PC_INCIDENT_CFIUS_CONSTRAINED.readFields(PC_KPI_PC_INCIDENT_CFIUS_CONSTRAINED.java:197)
        at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:244)
        ... 12 more
Caused by: java.nio.charset.MalformedInputException: Input length = 574820
        at com.ibm.db2.jcc.am.r.a(r.java:19)
        at com.ibm.db2.jcc.am.jc.a(jc.java:2862)
        ... 20 more
Caused by: sun.io.MalformedInputException
        at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:167)
        at com.ibm.db2.jcc.am.r.a(r.java:16)
        ... 21 more

 

 

 

解决办法:

需要在yarn的mapred-site.xml文件中添加如下配置:

<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1024m -Ddb2.jcc.charsetDecoderEncoder=3</value>
</property>

http://www-01.ibm.com/support/docview.wss?uid=swg21684365




以上是关于sqoop从DB2迁移数据到HDFS的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 java.sql.SQLException:[SQL7008] database_name 中的 table_name 对操作无效,而 sqoop 从 hdfs 导出到 DB2

Sqoop 数据迁移工具

sqoop数据迁移

sqoop数据迁移

sqoop 数据迁移

Sqoop数据迁移工具