Linkis Spark引擎介绍

1.Spark引擎的使用

        Linkis的Spark执行引擎为用户提供了向Yarn集群提交spark作业并反馈日志、进度、状态和结果集的能力。

        Spark执行引擎支持用户提交sparksql、pyspark以及scala三种类型的作业,默认采用yarn-client方式提交作业,并以引擎的形式为用户维系一个或多个spark会话。

        用户下载Linkis的release包并解压安装之后,需要正确启动若干特定的服务才能用于执行spark作业。

        下面是具体步骤。

1.1 环境变量配置

        Spark引擎依赖的环境变量:HADOOP_HOME、HADOOP_CONF_DIR、HIVE_CONF_DIR、SPARK_HOME以及SPARK_CONF_DIR。

        在启动SparkEngineManager的微服务之前,请确保以上环境变量已经设置。

        如果您没有设置,请先在/home/${USER}/.bash_rc 或 linkis-ujes-spark-enginemanager/conf目录中的 linkis.properties配置文件中设置。如以下所示

  1. HADOOP_HOME=${真实的hadoop home}
  2. HADOOP_CONF_DIR=${真实的hadoop配置目录}
  3. HIVE_CONF_DIR=${真实的hive配置目录}
  4. SPARK_CONF_DIR=${真实的hive配置目录}
  5. SPARK_HOME=${真实的spark安装目录 }

1.2 启动依赖服务

Spark引擎的启动,需要依赖以下的Linkis微服务:

  • 1)、Eureka: 用于服务注册于发现。
  • 2)、Linkis-gateway: 用于用户请求转发。
  • 3)、Linkis-publicService: 提供持久化、udf等基础功能。
  • 4)、Linkis-ResourceManager:提供Linkis的资源管理功能。

    1.3 自定义参数配置

启动spark的相关微服务之前,用户可以设置关于spark引擎的相关配置参数。

Linkis考虑到用户希望能够更自由地设置参数,提供了许多的配置参数。

下表有一些常用的参数,Spark引擎支持配置更多的参数以获得更好的性能,如您有调优需求,欢迎阅读调优手册。

用户可以在linkis.properties中配置这些参数。

参数名称 参考值 说明
wds.linkis.enginemanager.memory.max 40G 用于指定sparkEM启动的所有引擎的客户端的总内存
wds.linkis.enginemanager.cores.max 20 用于指定sparkEM启动的所有引擎的客户端的总CPU核数
wds.linkis.enginemanager.engine.instances.max 10 用于指定sparkEM可以启动的引擎个数

1.4 前端部署

上述微服务部署启动成功后,用户如需通过web浏览器来提交自己的sparkSQL、pyspark或Scala代码,可以通过部署配置微众另一款开源的前端产品Scriptis,该产品让用户能在web页面上编辑、提交代码,并能够实时接收后台给的信息。

另外,Scriptis还有一个管理台功能,用于配置spark引擎的启动参数。

1.5 spark启动参数配置

Scriptis页面为我们提供了可以设置启动参数的配置页面,其中可以设置Driver的内存大小,以及executor的个数以及内存和CPU核数等,这些参数都会被读取,用于启动一个spark引擎。

Spark启动参数配置图
图1 管理台配置界面

1.6 运行实例

在web浏览器中,打开scriptis的地址,用户可以在左侧栏的工作空间新建sql、scala或者pyspark脚本,在脚本编辑区域编写完脚本代码之后,点击运行,就可以将自己的代码提交到Linkis后台执行,提交之后,后台会通过websocket方式实时将日志、进度、状态等信息推送给用户。并在完成之后,将结果展示给用户。

Spark运行效果图1

图2 Spark运行效果图1

Spark运行效果图2
图3 Spark运行效果图2

Spark运行效果图3
图4 Spark运行效果图3

2.Spark引擎的实现方式

        Linkis-Spark执行引擎的实现,是参照Linkis引擎开发文档实现了Entrance、EngineManager和Engine三个模块的必要接口。

        在EngineManager模块,我们选择采用spark-submit这命令来进行启动java进程,所以Linkis采取了重写ProcessEngineBuilder的build方法,将用户配置的spark的启动参数与spark-submit命令进行整合,构成一个启动spark引擎的命令,然后执行该命令。

在Engine模块,Linkis默认采用了yarn-client模式进行启动spark的会话。Spark的Driver进程会以Linkis引擎的形式存在并为启动的用户所拥有。

        获取到SparkSession的实例之后,通过spark提供的API可以获取到Driver进程的SparkContext实例,通过SparkContext实例我们可以进行进度的计算获取,同时也可以将用户的任务取消。

Spark执行引擎现在支持三种类型的spark作业,sparksql, scala以及pyspark。Engine模块中的代码中实现了三个SparkExecutor分别执行,sql使用SparkSession方式提交,scala使用Console方式提交,pyspark使用py4j的方式提交。

3.spark版本的适配

        Linkis0.5.0和Linkis0.6.0的release版本只支持spark2.1.0。

        从Linkis0.7.0开始,spark开始适配spark2.4+。

        当然,如果您集群中使用的spark版本如果和我们支持版本是不适配的话,可能需要您更改顶层pom.xml的spark.version 变量,然后重新编译打包。

        如果遇到启动运行的问题,可以加群向我们咨询。

微信及QQ群

4.未来的目标

  • 1.部署方式更加简单,尝试使用容器化的方式。
  • 2.支持spark jar包方式的提交
  • 3.更好地支持spark的yarn-cluster方式的提交。