Github上的开源项目Waterdrop,此项目Star + Fork的有将近1200人,是一个基于Spark和Flink构建的生产环境的海量数据计算产品。
Waterdrop的特性包括:
1、简单易用,灵活配置,无需开发;
2、同时支持流式和离线处理;
3、模块化和插件化,易于扩展;
4、支持利用SQL做数据处理和聚合;
5、支持选择Spark或Flink作为底层引擎层。
作为Spark或者Flink的开发者,你是否也曾经想过要打造这样一款通用的计算引擎,是否曾经有这样的疑问,Waterdrop为什么能实现这么多实用又吸引人的特性呢?
哈哈哈,其实都是有”套路“的,今天我们特别邀请到了Waterdrop项目的核心开发者Gary,为我们掰开了揉碎了讲讲,这个“套路”是什么?
感兴趣的同学,你可以去这个地址(https://github.com/InterestingLab/waterdrop),学习和研究一下Waterdrop的源代码。
Apache Spark,为开发者提供了一套分布式计算API,我们只要调用这些API,就能够完成海量数据和分布式的业务计算。当你开发了多个Spark程序以后,会发现大部分数据处理的流程相似度很高,每个环节的计算逻辑也有很多相似之处。
那么我们可以通过什么办法来实现一个通用引擎,进而减少这种重复性呢?
使用Spark API开发业务需求时,由于业务的重复性,做了很多重复的Spark代码开发。Spark开发者完全可以使用Spark的API打造出一款通用的计算引擎,来应对80%的业务需求。
同时,通过实现插件体系,来应对20%的特殊需求。而这样实现的计算引擎,可以大大提高大数据开发的效率。
你可能比较感兴趣的有这样几个问题,一个是通用的数据处理流程是什么样的。另一个是Spark 如何做数据输入、输出和计算。第三个问题是:如何在Spark上实现通用的数据处理工作引擎。
接下来,先来讲一下第一个问题的解决方案,看看通用的数据处理流程到底是什么样的。
最简单的流程应该很容易想到(如图),就是有一个数据输入,Source;一个数据处理,Transform;还有一个是数据输出,也就是Sink。
这里举一个例子,以具体的场景切入,假设有一个电商网站,每天有几千万的用户访问,用户在这个网站上的行为包括:查看商品详情、加购物车、下单、评论和收藏。
各个用户行为日志已经收集上报到了分布式消息队列Kafka中,现在需要用Spark来完成分析和处理,并输出到Elasticsearch中。
接下来,我们一起来看下这个数据处理流程(如图):
如果输出到Elasticsearch的同时,还想输出到MySQL,我们称它为“分裂”,再来看下这张图(如图):
如果再增加一个transform(如图4),就是Transform1 先处理数据,之后输出,再由Transform2来处理,相当于一个管道化(Pipeline)数据处理流程。
当然还有更复杂的数据处理流程,比如同时处理多个数据输入,就是常说的“流关联”。
这个流程实现起来就比较复杂了,而且应用场景也不是特别多,今天的课程就不详细展开了,如果你感兴趣,可以自行查阅Spark中“流关联”的相关技术(以下):
今天的分享中,主要介绍的是前两种较为通用的数据处理流程的实现。
接下来,再来讲讲第二个问题:Spark 如何做数据输入、输出、数据处理?
这里需要注意一下,我们介绍的是电商数据处理场景下,使用Spark Streaming的常见用法,要构建的是这样的数据处理流程。
一个是Kafka Source:数据源是Kafka,数据类型是字符串,其中的各个字段以tab(\t)分割。
另外,来看下Split Transform:数据进入Spark后,经过一次字符串分割后,把非结构化数据转换成了结构化数据。再一个就是Elasticsearch Sink:数据计算完成后输出到Elasticsearch。
首先,来看看Kafka Source的实现方式(如下):
有了Kafka Source以后,接下来我们只要处理代码中生成的resultDstream就可以了,如果你有开发过Spark Streaming的话,就会知道,DStream提供了一个foreachRDD()方法,允许我们处理每个streaming批次的数据。
在foreachRDD方法中,我们可以把默认用来表示分布式数据集的RDD,转换为Dataset[Row] 。Row表示的是Dataset中 m的每一行数据,是数据处理的基本单位。
Dataset是Spark中常用的分布式数据集,不仅可以用在Spark SQL中,也可用在Spark Streaming中。在Dataset上面,开发者可以执行预定义好的UDF和SQL,也可以执行自己实现的函数,非常方便。所以,我们把Dataset作为整个数据处理流程中的核心数据结构。
这段代码演示的是如何从DStream 生成Dataset,我们一起来看下:
其次,Split Transform 的实现方式是这样的(如下)。我们先定义一个字符串split()函数:
然后,在分布式数据集(Dataset)上,执行字符串分割:
最后,Elasticsearch Sink的实现方式是这样的(如下):
完成了前面这些代码,只要将打包好的spark程序Jar包,通过spark-submit脚本,提交到Spark集群上就可开始运行,完成指定的业务逻辑计算。
目前讲到的是3个具体的Source、Transform、Sink案例,实际上你可以参考这些代码,开发出更多的数据处理逻辑。
最后说一下第三个问题:如何在Spark上实现通用的数据处理工作流?
前面我们讲过了一个数据处理流程的具体案例,接下来面临的问题是,这个案例和其他的案例有哪些相似之处,哪些地方可以做一下抽象分层,来实现一套通用的计算引擎呢?
我来提供一种方案,供你参考。概括来讲,用Spark实现一个通用的计算引擎的步骤是这样的,我们一起来看下:
(图6)
第一部分是搭建一套插件API体系,定义完整的BaseSource, BaseTransform, BaseSink API。
再来看下第二部分,基于插件API体系,开发出对应的流程控制代码。
第三部分是使用插件API实现常见的Source,Transform,Sink插件。
接下来,我们来逐个拆解。先来看看第一部分,定义插件接口。这里我们需要先定义一个最基础的Plugin插件接口。
这里演示的代码都是用Scala写的,可能有些同学不熟悉Scala,在这里简单地把trait理解为Java里面的interface就可以。
代码中,setConfig(), getConfig(), checkConfig() 这3个方法,分别用来设置、获取、检查传入的插件配置;name是插件名称的定义;preprare() 方法的作用是在插件开始处理数据之前,需要做的一些预处理逻辑可以在prepare()中实现。
接下来,再定义所有Source的接口:
BaseSource的定义中,我们用到了泛型符号T,来指定通过Source获取到的DStream的数据类型。
rdd2dataset(), getDStream(), start() ,这三个方法在Source插件的运行流程中完成从数据源获取数据,生成RDD并将RDD转换为Dataset,让流程后面的插件可以直接处理Dataset,这跟我们之前的预期一样。
接下来定义所有Transform的接口:
这个接口看起来就要简单一点,只有一个process()方法,输入是上一个插件处理后输出的Dataset,输出是当前这个process()方法处理后生成的Dataset。
最后再定义所有Sink的接口:
这个也很简单,只有一个process()方法,输入是Dataset[Row],没有输出,因为在此处,插件的开发者实现自己的插件时,就需要把数据输出到外部存储系统了。
再来看看第二部分,基于插件API体系,开发出对应的流程控制逻辑,概括来说就是这几个步骤的流程控制(如图):
我们假设有一个描述数据处理流程的配置文件,内容是这样的:
那么对于这个(以上)配置文件,通用计算引擎的流程控制逻辑是怎样的呢,我们一起来看下。
分为这样的几个步骤:
先来看下第一步,也就是加载配置文件。
再来看下第二步,根据第一步加载的配置,确认要加载哪些插件,然后去加载。
第三步就是根据第一步加载的配置,设置好各个插件的初始配置。
再来看下第四步,根据第一步加载的配置,把各个插件的使用顺序串联起来,组成Pipeline Graph。
Pipeline Graph,用来表示计算引擎中各个插件处理数据的先后顺序。例如,对于刚刚讲到的配置文件,数据会从kafka source插件中读取到,然后进入引擎内部,经过split transform的处理后,最终通过elasticsearch sink输出到Elasticsearch。
一起来看下第五步的具体操作,需要启动Pipeline。其实它的底层代码,就是对Spark Streaming中 StreamingContext的start() 方法的包装。
由此,我们构建出了一个插件化体系,它有三个核心要素。其中,一个是插件API;再一个就是插件的具体实现;第三个核心要素就是流程控制逻辑。
讲到这里,你可能会问,在这个计算引擎中,这么精妙的插件化体系是如何设计出来的呢。其实,这是一个很著名软件设计方法,叫“控制反转”,或者叫“依赖注入”。
“控制反转”可以用一句话来概括,也就是:上层不应该依赖底层,两者应该依赖抽象。我给它又加了一句,是这样的:明确区分什么是业务逻辑,什么是流程控制。
例如,对于我们设计的这个通用的计算引擎来说,上层指的是流程控制逻辑,底层指的是各个插件的具体实现,两者不会直接互相依赖,而是都依赖插件的API。
如果我们想要设计出一个扩展性比较好的插件化体系,就必须很好地区分代码中哪里是业务逻辑,哪里是流程控制,这里的业务逻辑指的是插件的具体实现。
接下来,我们再来讲讲第三部分,使用插件API,实现常见的Source、Transform、Sink插件。
现在我们只需要按照Source、Transform、Sink插件API的定义,实现自己的插件处理逻辑就可以。这里以生产环境中常用的插件为例,一起来看下经常会用到的插件有哪些。
常见的Source插件有:Kafka、MySQL Binlog、HDFS(下图);
那么常见的Transform插件有哪些呢?Split和SQL(下图);
常见的Sink插件,有HDFS、Elasticsearch,、MySQL,以及HBase(下图)。
刚刚讲到的这些,就是关于如何打造一个通用的计算引擎的内容,整体而言,这是比较详细的介绍。那么,这么做的优势是什么呢?
一个就是计算逻辑配置化,很容易满足各种业务逻辑的计算,另外,就是接入的新的计算需求,近乎是零开发成本的。还有就是80%的常见需求,可以用现有的插件来满足,20%的个性化需求,插件开发者,可以自行开发插件来满足。
此外,插件开发者开发自己的业务逻辑处理插件时,变得更加容易,因为大部分组件都可以复用,而且都经过了长期生产环境的功能和性能的验证。
顺便延伸讲一下,在有了这些优势基础上,如果我们想把这个通用的计算引擎做得更好,可以考虑增加这几个功能:一个是监控,一个是WebUI。
现在我来给你总结一下。为了提高海量业务数据处理效率,我介绍了一种通用的计算引擎实现方案,它在底层使用了Spark的API,上层实现了流程控制和插件API,再加上已实现的多个常用插件,最终实现了基于配置且零开发成本的通用计算引擎。
之所以说Flink与Spark是当今最流行的大数据计算引擎,是因为阿里巴巴、百度、腾讯、字节跳动、滴滴、美团等,几乎所有的互联网一二线大厂都在用Flink,Spark。
如果你是一位刚刚入门大数据的同学,一定也想进入大厂做Flink或者Spark技术,如果想得到这样的机会,可要抓紧时间学习Flink和Spark技术啦。
有哪些课程和参考资料来学习呢?
今天给大家介绍下我们的《大数据集训营》课程,一定能够帮到你,当然它是收费的,但相比这个课程的价值来说,会让你觉得不亏。有时候,免费的才是最贵的,这个贵不是体现在价格上,而是收费的课程和资料,往往是经过一些行业内极度有经验的著作者大量的研究和打磨,他们耗费了大量自身的时间,经历了多次失败,最终打造出了一个精品课程。
我们经常见到,一些标题为“XXX技术的免费学习资料大全”的公众号文章,你可以点进去看一下,大多都是放几个链接,几个脑图,几个盗版图书的网盘地址就没了,可以问一下自己,这样对你的学习有用吗?
今天为大家推荐的《大数据集训营》课程,从Hadoop基础讲解,贯穿数据采集、传输、存储、计算、展示等各个环节,着重讲解企业中如何使用spark、MapReduce、hive、flume、sqoop等各个组件,并附有经典企业案例讲解,案例均来自一线互联网工业项目。课程的讲师都曾服务于国内互联网一线大厂的大数据团队,有非常丰富的大数据经验。
核心课程内容主题如下(感兴趣的同学请看超详细大数据集训营知识大纲):
(点击图片查看大图)
共八大实战项目
讲师天团总结一下这个课程的特色:
课程特色
内容核心、全面到位
课程内容涵盖大数据技术栈全流程(数据收集、存储、计算、数据可视化),课纲是经过多次打磨后最终确定下来,用2个月的时间,将Hadoop,Spark,Flink,Elasticsearch这些大数据技术知识点和细节讲解到位。
八周大课
前四周每周两次录播课程,两次直播课程,后4周每周三次直播课程。
社直播互动教学
课程采用直播、录播相结合的模式,其中直播内容占比超过60%,学员可以在直播中与讲师关于大数据技术方案和细节进行课程内容的互动、交流和现场答疑,保证让你感受到,不是读死书、看死视频,任何想不明白,理解不了的知识和案例,直接交流,学习效率成倍提升。
社面向企业真实案例
注重知识,更注重案例,我们可以学习到这些案例:数仓设计与搭建、OLAP分析引擎设计、Flink用户行为分析、ELK实战、错误日志监控平台等。在企业案例的教学中,此课程采用的是项目制,由讲师亲自带学员做项目,挑战技术难题,提供项目案例场景、细节和代码,学员可以设计和开发实际的项目。
自带大数据求职面试辅导
几位课程讲师作为辅导员,包括大数据面试求职准备工作讲解、常见大数据面试题目解析等内容。一切为了大家更好的就业、转型、提升。
转行大数据更轻松
如果你想从普通开发、运维工程师转大数据。课程中的几位讲师可以提供一对一的指导。
附上此课程会重点讲解的几个主要的企业案例:
设计与搭建基于Hive、Presto的数据仓库与OLAP分析引擎;
Flink企业实战——直播、短视频APP用户行为分析;
ELK+Spark实现一个错误日志监控(搜索、分析、报警)平台;
如果对此课程感兴趣,请扫码添加老师微信领取免费试听课,同时我们为前30个报名的同学提供学费减免的优惠哦!
(扫码添加老师微信)
戳↓↓“阅读原文”查看课程详情!