在AWS EMR中作为Avro导入时Sqoop失败

时间:2019-10-29 22:32:46

标签: sqoop avro amazon-emr

我正在尝试在Amazon EMR(hadoop 2.8.5 sqoop 1.4.7)中执行sqoop import。如果未指定avro选项(--as-avrodatafile),则导入可以很好地进行。但是一旦设置好,工作就会失败

19/10/29 21:31:35 INFO mapreduce.Job: Task Id : attempt_1572305702067_0017_m_000000_1, Status : FAILED
Error: org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)V

使用此选项-D mapreduce.job.user.classpath.first=true不起作用。

在本地运行(在我的计算机中),我发现将sqoop中的avro-1.8.1.jar复制到hadoop lib文件夹中是可行的,但是在EMR群集中,我只能访问主节点,因此上述操作不起作用因为不是作业的主节点。

有人遇到这个问题吗?

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是连接到群集中的每个节点(我以为我只能访问主节点,但是我错了,在EMR中我们可以访问所有节点),并替换了包含的Avro jar通过Sqoop附带的Avro jar使用Hadoop。这不是一个优雅的解决方案,但可以。

[更新]

发生错误的情况是选项-D mapreduce.job.user.classpath.first=true不起作用,因为当亚马逊表示我们应该使用s3a时,我使用s3作为目标目录。我一开始使用s3,Sqoop即可正确执行导入。因此,无需替换节点中的任何文件。由于亚马逊自己的配置,使用s3a可能会在EMR下导致一些奇怪的错误,请不要使用它。即使在性能方面,s3也比EMR中的s3a更好,因为s3的实现是亚马逊的。