公司的业务部门一直在使用Spark进行数据分析,随着跑Spark作业的需求日渐增长,之前一直在使用的Spark JobServer被吐槽的频率也越来越高,经常被评价功能过于简单和缺乏灵活性,跑一次任务的过程太过繁琐,一些个性化的需求定制也无法进行扩展实现。
更痛苦的是,有时候快接近下班的时间,大家都准备跑出一个结果就闪人,这就导致了队列资源的使用率暴涨,甚至有的吃资源大户一个人霸占了整个队列的资源,这就导致了稍微晚点提交的任务都无法得到执行,耽误很多人的下班时间,用户怨声载道。
针对他们的需求,笔者一边在规划针对Spark JobServer的二次开发,一边在开源社区寻找是否有能够直接满足或接近满足这些需求的项目可以直接拿来使用。
最近,GitHub上新开源的一个叫Linkis的项目使我眼前一亮,这里摘抄一下他们官方的项目简介:
Linkis是一个打通了多个计算存储引擎如:Spark、TiSpark、Hive、Python和HBase等,对外提供统一REST/WebSocket/JDBC接口,提交执行SQL、Pyspark、HiveQL、Scala等脚本的数据中间件。
Linkis基于微服务架构,提供了金融级多租户隔离、资源管控、权限隔离等企业级特性,支持统一变量、UDF、函数、用户资源文件管理,具备高并发、高性能、高可用的大数据作业/请求全生命周期管理能力。
乍一看,似乎是把Spark JobServer的功能扩展到了其它语言和计算存储引擎上,而仅限于spark相关的方面的话,好像还是仅仅复制了JobServer的功能。
但是,在仔细看了一遍这个项目的详细介绍,并经过实际的搭建和试用之后,笔者发现并没有那么简单,Linkis在涵盖了JobServer的功能的同时,也对这些功能做了很多增强和优化,并同时提供了很多辅助性的服务。
以下,笔者结合自己的试用体会,把Spark JobServer和Linkis的接口和功能做了一些比较。
首先是Spark JobServer,我们提交job需要进行以下步骤:
1. 自己在NewSparkJob接口的子类中实现相关逻辑,编译打成jar包
2. 通过HTTP接口上传给JobServer
3. 通过HTTP接口启动spark context
4. 通过HTTP接口运行job
5. 通过HTTP接口查询job信息、进度和结果集
在Linkis中,我只做了两步:
1. 将SparkSQL、Python或Scala等语言实现的逻辑,直接通过HTTP接口提交给Linkis的入口。
实际上做完这一步,我的代码就已经在spark里跑起来了,不禁让踩过无数个开源项目的坑的我觉得幸福来得太过简单。
2. 通过HTTP接口获取job的信息、进度和结果集。这里就不再赘述,感兴趣的可以直接看Linkis的官方HTTP文档,写得十分的简单易懂:https://github.com/WeBankFinTech/Linkis/blob/master/docs/zh_CN/ch3/HTTP%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3.md
可以感受到,在Linkis中提交作业实在是简单太多了:
1. 我们不再需要自己搭建工程进行相关的编译、打包和上传等工作,只要直接在接口中把代码片段一提交,剩下就是填写几个参数的问题了。
2. JobServer中,我们提交job的时候还要指定某个spark context去运行,否则会重新启动一个临时context。而Linkis中,我们只要把job提交之后就不用管了,所有的spark context均有专门的服务负责启动和维护,也有专门的服务负责job的调度,我们不需要关注job调度的细节,提交之后就可以安心等待结果了。
3. 在查询出现错误的情况下,Linkis也有机制来自动重试执行,而且有专门的负责智能诊断的服务来帮忙定位问题,可以说是服务到家了。
4. 总之,在用Linkis跑了几个任务之后,JobServer就自动成为了不堪回首的往事,我已经迫不及待的想要把Linkis部署并且推广给业务部门使用了。
除了使用起来简单以外,Linkis提供的资源管理服务也切实解决了笔者面临的问题。除了Yarn本身的资源管理以外,还可以对用户、应用级别的各种资源进行分别限制,能够有效阻止单个查询对资源的过度占用。而且,在用户使用资源超过限制的时候,资源管理服务会返回相应的提示以及建议的整改方案,让用户做到心中有数,不再到处抱怨查询跑不了,可以说是非常贴心了。笔者已经开始幻想摆脱用户抱怨之后的美满生活了。
另外,根据Linkis的官方文档,他们还提供了JavaSDK和更加高级的WebSocket的接入方法,据说可以进行更加细致的个性化配置,这个就有待笔者日后更加深入的探索了,如果有需要的可以康康这个链接:https://github.com/WeBankFinTech/Linkis/blob/master/docs/zh_CN/ch2/linkis%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md
除了运行Spark任务以外,Linkis作为一个完整的大数据功能平台的数据中间件,还提供了很多其它的企业级功能,根据他们的官方文档描述如下:
以及和其它类似系统的对比:
可以看出,虽然没有和JobServer的直接比较,但Linkis所支持的功能点,几乎都是JobServer无法支持和提供的。
此外,笔者还发现一个叫Scriptis的神器,也是Linkis的团队开源出来的一个配合Linkis一起使用的工具,有了这个以后,我们再也不需要教业务用户是使用一堆过于硬核的工具去调接口跑spark任务了,只要直接打开网页,轻轻松松写完代码,用鼠标点一点执行按钮,就什么东西都能直接在界面上看到了。甚至连UDF,表结构和执行参数都能找到页面去直接浏览和配置,可谓是十分方便了。又多了一个迫不及待推广给业务用户使用的项目。感兴趣的话可以直接看Scriptis的Github首页,上面有很多实例动图:https://github.com/WeBankFinTech/Scriptis
说回Linkis和Job Server。当然,Linkis毕竟是一个刚刚开源的项目,究竟是否能替换Spark JobServer,还是要看今后社区的发展和版本迭代,只有经过长时间使用的考验之后,Linkis才有资格去真正的挑战那些成熟的类似项目。根据他们目前的表现来看,笔者认为是可以给予一定期待的。