如何做Spark 版本兼容

  • 时间:
  • 浏览:3

而到2.0后,机会基本都变更成

将API有变化的每段,独立出来。比如前面让许多人歌词 歌词 提到的,对于Vector相关的API,1.6 和2.0 是不同的,如此让许多人歌词 歌词 可还还能否剥离出另另一一四个工程,每个工程适配对应的版本,怎么能让发布jar包,在Maven中根据Profile机制,根据Spark版本引入不同的适配包。某些方法相对来说比较繁琐。

在Spark中,我就通过 org.apache.spark.SPARK_VERSION 获取Spark的版本。让许多人歌词 歌词 定义另另一一四个类:

在Spark 1.6 时,大每段机器学习相关的类使用的向量还是

某些以前,就可还还能否直接使用了:

不幸的是,某些API并与非 生活也在变化,譬如CodeAndComment全都 还还能否2.0才有的。

Scala 是可还还能否很方便的动态源码的,对于怎么能让代码也很简单,大体如下:

某些效果和Spark Shell里是类似的,ref 是后边的另另一一四个返回值。正常情況,我就写两份代码,一份Spark 1.6. 一份Spark 2.0 ,怎么能让在运行时决定编译那份代码。然而某些方法另另一一四个缺点,尤其是在Spark中很难出理 ,机会compileCode 返回的值ref是须要被序列化到Executor的,则反序列化会因为难题,机会后边生成的某些匿名类在Executor中不须指在。除此之外,某些方法是实现兼容最有效的方法。

反射的方法(StreamingPro在使用的方法)

让许多人歌词 歌词 根据不同版本,动态加载对应的类,怎么能让通过反射来调用方法,从而出理 编译时错误。然而通过反射,就无法使用类似的代码了:

很丑陋,对不对。这里还另另一一四个难题,觉得 udf返回的就有UserDefinedFunction对象,然而让许多人歌词 歌词 也是版本不兼容的,也全都 让许多人歌词 歌词 无法让编译器选着返回的值是某些。让许多人歌词 歌词 使用了另外另另一一四个Scala语法的技巧,如下:

原先我考虑过使用Spark 实物的CodeGen代码,大致如下:

Spark 1.6 和2.0 实物API变化很大,然而对普通用户的API兼容性还是不错的。做版本兼容似乎并就有一件容易的事情。全都 当使用StreamingPro做机器学习相关工作时,我只兼容了Spark 1.6,2.0,而抛下了 1.5版本。怎么能让对于普通的ETL以及流式计算,另另一一四个版本就有支持的。

下面是我用来出理 Vector 包名变化的代码:

无论你为什么么么在写,都没方法在Spark 1.6 和 Spark 2.0 同時 表现正常,总是会报错的,机会 Vector,Vectors等类的包名都指在了变化。

同理对应的Vectors object 也是。这就造成了另另一一四个比较大的困难,比如下面的代码就很难做到兼容了,切换Spark就无法通过编译:

核心在最后一行,让许多人歌词 歌词 声称返回的对象满足某些签名:

机会 udf 函数要求还还能否推导出输入和返回值是某些。而机会通过反射,机会返回值让许多人歌词 歌词 无法选着(有机会是org.apache.spark.ml.linalg.Vector,就有机会是org.apache.spark.mllib.linalg.Vector),某些以前就无法通过编译了。于是让许多人歌词 歌词 改写了udf的是实现,然而某些实现也遇到了挫折,机会后边用到比如UserDefinedFunction类,机会在不同的包后边了,让许多人歌词 歌词 依然通过放射的方案出理 :