spark读取elasticsearch数据报scala.collectino.GenTraversableOnce$class错解决办法

spark读取elasticsearch数据报scala.collectino.GenTraversableOnce$class错解决办法

spark读取elasticsearch数据报scala.collection.GenTraversableOnce$class错解决办法

spark2.3,创建temporary view表关联elasticsearch索引,通过temporary view读取elasticsearch数据时,报如下错误:

java.lang.NoClassDefFoundError:
scala/collection/GenTraversableOnce$class

原因是spark2.0以后,只支持scala的2.11以后的版本,但是这个版本里又没有scala.collection.GenTraversableOnce c l a s s . c l a s s 这 个 类 , 只 有 s c a l a . c o l l e c t i o n . G e n T r a v e r s a b l e O n c e . c l a s s 这 个 类 ( 注 意 两 个 c l a s s 不 一 样 ) 。 而 这 个 s c a l a . c o l l e c t i o n . G e n T r a v e r s a b l e O n c e class.class这个类,只有scala.collection.GenTraversableOnce.class这个类(注意两个class不一样)。而这个scala.collection.GenTraversableOnce class.class,scala.collection.GenTraversableOnce.class(class)scala.collection.GenTraversableOnceclass.class类,只在scala的2.10版本中有。因此,我们需要下载一个scala的2.10的版本,在jar包中找到scala.collection.GenTraversableOnce c l a s s . c l a s s 这 个 类 , 拼 拷 贝 出 来 , 再 使 用 w i n r a r 打 开 2.11 的 版 本 , 把 s c a l a . c o l l e c t i o n . G e n T r a v e r s a b l e O n c e class.class这个类,拼拷贝出来,再使用winrar打开2.11的版本,把scala.collection.GenTraversableOnce class.class使winrar2.11scala.collection.GenTraversableOnceclass.class加入到2.11的jar包去。上传集群后,重启集群,再试,一切OK、

结论:
scala.collection.GenTraversableOnce c l a s s . c l a s s 这 个 类 在 2.10 版 本 j a r 反 编 译 的 源 码 中 , 只 找 到 一 个 类 似 接 口 方 法 的 声 明 , 未 找 到 内 部 类 。 直 接 加 到 到 2.11 版 本 的 s c a l a 版 本 j a r 中 , 系 统 就 正 常 了 , 因 此 怀 疑 这 个 s c a l a . c o l l e c t i o n . G e n T r a v e r s a b l e O n c e class.class这个类在2.10版本jar反编译的源码中,只找到一个类似接口方法的声明,未找到内部类。直接加到到2.11版本的scala版本jar中,系统就正常了,因此怀疑这个scala.collection.GenTraversableOnce class.class2.10jar2.11scalajar怀scala.collection.GenTraversableOnceclass.class特殊的类,可能只是spark2.1.3版本中哪里有引用,并未使用。因此,加进去后可以正常运行。

有疑问,可加QQ群讨论:258143901

你可能感兴趣的:(spark,elasticsearch)