1. 程式人生 > >sqoop匯出avro格式檔案報錯

sqoop匯出avro格式檔案報錯

環境

hadoop版本:2.7.6
sqoop版本:1.4.7

問題

專案中需要匯出mysql中的二進位制資料,因此採用avro格式輸出。

[[email protected] 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版本:

[[email protected] lib]# ls avro-*
avro-1.8.1.jar  avro-mapred-1.8.1-hadoop2.jar

hadoop avro版本:

[[email protected] 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包。

[[email protected] 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

檢視匯入結果:

[[email protected] 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":"南京"}}

成功解決。