sqoop匯出avro格式檔案報錯
阿新 • • 發佈:2018-12-29
環境
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":"南京"}}
成功解決。