我正在尝试在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群集中,我只能访问主节点,因此上述操作不起作用因为不是作业的主节点。
有人遇到这个问题吗?
答案 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
的实现是亚马逊的。