使用 Sqoop 1.4.7 和 Hadoop 2.7.3 作为 Avro 导入数据失败
Importing data as Avro fails with Sqoop 1.4.7 and Hadoop 2.7.3
我正在处理一个问题,我正在尝试使用 Apache Sqoop 将大量数据从内部部署的 PostgreSQL 从属副本导入 Google Avro 格式的云存储。
使用默认格式导入数据工作得很好,但我的数据管道需要将数据导入 Avro 格式,但是由于过去多次报告的原因,这一直失败,例如:
- https://community.hortonworks.com/questions/60890/sqoop-import-to-avro-failing-which-jars-to-be-used.html
- http://discuss.itversity.com/t/unable-to-execute-sqoop-import-from-mysql-to-hive-for-avrodatafile/1529
我已尝试按照上述问题中的说明使用参数 -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
我遇到了同样的问题。除了 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操作。
我正在处理一个问题,我正在尝试使用 Apache Sqoop 将大量数据从内部部署的 PostgreSQL 从属副本导入 Google Avro 格式的云存储。
使用默认格式导入数据工作得很好,但我的数据管道需要将数据导入 Avro 格式,但是由于过去多次报告的原因,这一直失败,例如:
- https://community.hortonworks.com/questions/60890/sqoop-import-to-avro-failing-which-jars-to-be-used.html
- http://discuss.itversity.com/t/unable-to-execute-sqoop-import-from-mysql-to-hive-for-avrodatafile/1529
我已尝试按照上述问题中的说明使用参数 -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
我遇到了同样的问题。除了 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操作。