将应用程序从Spark 1.5迁移到Spark 2.1时需要做哪些更改?

时间:2019-01-31 10:40:29

标签: scala apache-spark

我必须使用Spark 1.6将用Scala 2.10.4编写的应用程序迁移到Spark 2.1。

该应用程序处理大小约为7GB的文本文件,并包含多个rdd转换。

有人告诉我尝试使用Scala 2.11重新编译它,这应该足以使其与Spark 2.1一起使用。正如我在Spark 2中所知道的那样,这对我来说听起来很奇怪,例如:

  • SparkSession对象的介绍
  • DataSet和DataFrame的合并 API

由于使用Kryo序列化程序注册,我仅用较小的更改就设法在scala 2.11中用spark 2重新编译了该应用程序。 我仍然想解决一些运行时错误,并试图弄清楚接下来会发生什么。

我的问题涉及到什么才能使应用程序像以前那样进行“必要的”更改,以及在性能优化方面(建议至少保持相同的性能水平)“建议”哪些更改?您认为对于Spark的新手可能有用:)。

谢谢!

1 个答案:

答案 0 :(得分:1)

我一年前也做过同样的事情,您不需要做很多更改,我的想法是:

  • 如果您的代码中充斥着spark/sqlContext,则只需在代码开头的SparkSession实例中提取此变量即可。
  • df.map在Spark 1.6中已切换为RDD API,在Spark 2+中,您停留在DataFrame API(现在具有map方法)中。要获得与以前相同的功能,请将df.map替换为df.rdd.mapdf.foreachdf.mapPartitions等同样如此
  • unionAll在火花1.6只是union在火花2 +
  • databrick csv库现在包含在Spark中。
  • 当您插入分区的配置单元表时,分区列现在必须作为架构中的最后一列出现,在Spark 1.6中,它必须是第一列

您应该考虑的内容(但需要做更多的工作):

  • 将RDD代码迁移到数据集代码
  • 启用CBO(基于成本的优化)
  • collect_list可以与结构一起使用,在Spark 1.6中,它只能与基元一起使用。这样可以简化一些事情
  • 数据源API已改进/统一
  • 引入了
  • leftanti连接