在Sqoop 1.4.7和Hadoop 2.7.3中,无法将数据导入为Avro失败

时间:2019-01-31 13:05:44

标签: java mapreduce sqoop hadoop2 avro

我正在处理以下问题:我试图使用Apache Sqoop将本地PostgreSQL从属副本中的大量数据导入Avro格式的Google Cloud Storage中。

使用默认格式导入数据可以很好地工作,但是我的数据管道需要将数据导入为Avro格式,但是由于过去已多次报告的原因,这种操作一直失败,例如:

我尝试按照上述问题中的说明使用参数-Dmapreduce.job.user.classpath.first=true,但错误仍然是:

java.lang.Exception: java.lang.NoSuchMethodError: org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)V

此方法似乎是在Avro v.1.8.0上添加的,但是某些依赖项使用的是较旧版本的Avro,而该版本不可用。

我的环境具有以下这些工具的版本:

  • Hadoop 2.7.3.2.6.3.0-235
  • Sqoop 1.4.7
  • javac 1.8.0_191
  • sqoop / lib / parquet-avro-1.6.0.jar
  • sqoop / lib / avro-1.8.1.jar
  • sqoop / lib / avro-mapred-1.8.1-hadoop2.jar

还有人遇到同样的问题,并且将-Dmapreduce.job.user.classpath.first=true添加到sqoop import仍不能解决问题吗?

# Command I'm running
sqoop import -Dmapreduce.job.user.classpath.first=true \
-Dsqoop.export.records.per.statement=1 \
--connect jdbc:postgresql://XX.XX.X.XX/db \
--username postgres \
--password XXXX \
--table FOO \
--target-dir gs://test-bucket/test/ \
--as-avrodatafile \
2>&1 | tee -a /home/userA/logs/test.log

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。除了拥有Hadoop 2.9.2之外,我的配置完全相同。

当我替换了原始的

${HADOOP_HOME}/share/hadoop/common/lib/avro-1.7.7.jar

使用Sqoop 1.4.7附带的avro-1.8.1.jar,导入成功。

更改avro jar之后,我尚未测试任何其他Avro操作。