sqoop导出avro格式文件报错

环境

hadoop版本:2.7.6
sqoop版本:1.4.7

问题

项目中需要导出mysql中的二进制数据,因此采用avro格式输出。

[root@dscn2 sqoop-1.4.7]# ./bin/sqoop import  --connect jdbc:mysql://192.168.11.75:3306/test --username root --password 123456 --table t1 --target-dir /user/root/sqoop  -m 1 --as-avrodatafile

结果报错: Error:org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)
在这里插入图片描述

通过google得知是sqoop 使用的avro库版本与hadoop不一致,一查看果然不一样。

sqoop avro版本:

[root@dscn2 lib]# ls avro-*
avro-1.8.1.jar  avro-mapred-1.8.1-hadoop2.jar

hadoop avro版本:

[root@dscn2 lib]# ls ../../hadoop/share/hadoop/tools/lib/avro-1.7.4.jar 
../../hadoop/share/hadoop/tools/lib/avro-1.7.4.jar

解决方法

在import后面接参数:-Dmapreduce.job.user.classpath.first=true
mapreduce.job.user.classpath.first 参数表示优先使用用户指定的classpath加载jar包。

[root@dscn2 sqoop-1.4.7]# ./bin/sqoop import  -Dmapreduce.job.user.classpath.first=true --connect jdbc:mysql://192.168.11.75:3306/test --username root --password 123456 --table t1 --target-dir /user/root/sqoop  -m 1 --as-avrodatafile

查看导入结果:

[root@dscn2 sqoop-1.4.7]# hdfs dfs -text /user/root/sqoop/part-m-00000.avro
{"id":{"int":1},"姓名":{"string":"张三"},"年龄":{"int":20},"住址":{"string":"北京"}}
{"id":{"int":2},"姓名":{"string":"李四"},"年龄":{"int":35},"住址":{"string":"上海"}}
{"id":{"int":3},"姓名":{"string":"王五"},"年龄":{"int":40},"住址":{"string":"成都"}}
{"id":{"int":4},"姓名":{"string":"赵六"},"年龄":{"int":32},"住址":{"string":"南京"}}

成功解决。

猜你喜欢

转载自blog.csdn.net/cl2010abc/article/details/83787906
今日推荐