Kafka+Spark Streaming+Redis实时计算整合实践

  • 时间:
  • 浏览:0
  • 来源:uu快3大小_uu快3网站_开奖历史

或多或少人都知道,Spark支持某种类型操作:Transformations和Actions。Transformation从2个 已知的RDD数据集经过转换得到2个 新的RDD数据集,哪几个Transformation操作包括map、filter、flatMap、union、join等,或多或少Transformation具有lazy的底部形态,调用哪几个操作并没法 立刻执行对已知RDD数据集的计算操作,而是在调用了另一类型的Action操作才会真正地执行。Action执行,会真正地对RDD数据集进行操作,返回2个 计算结果给Driver应用应用程序,将会没法 返回结果,如将计算结果数据进行持久化,Action操作包括reduceByKey、count、foreach、collect等。关于Transformations和Actions更完整性内容,都不需要 查看官网文档。

同样、Spark Streaming提供了类似Spark的某种操作类型,分别为Transformations和Output操作,它们的操作对象是DStream,作用也和Spark类似:Transformation从2个 已知的DStream经过转换得到2个 新的DStream,或多或少Spark Streaming还额外增加了一类针对Window的操作,当然它也是Transformation,或多或少都不需要 更灵活地控制DStream的大小(时间间隔大小、数据元素个数),类似window(windowLength, slideInterval)、countByWindow(windowLength, slideInterval)、reduceByWindow(func, windowLength, slideInterval)等。Spark Streaming的Output操作允许或多或少人将DStream数据输出到2个 内部人员的存储系统,如数据库或文件系统等,执行Output操作类似执行Spark的Action操作,使得该操作要我lazy的Transformation操作序列真正地执行。

另某种妙招,或多或少人将代码修改为,把对Redis连接的管理放入去操作DStream的Output操作范围之内,将会或多或少人知道它是在特定的Executor中进行初始化的,使用2个 单例的对象来管理,如下所示:

Spark Streaming介绍

底下代码使用了Jedis客户端来操作Redis,将分组计数结果数据累加写入Redis存储,将会或多或少系统都要实时获取该数据,直接从Redis实时读取即可。RedisClient实现代码如下所示:

基于Spark通用计算平台,都不需要 很好地扩展各种计算类型的应用,尤其是Spark提供了内建的计算库支持,像Spark Streaming、Spark SQL、MLlib、GraphX,哪几个内建库都提供了高级抽象,都不需要 用非常简洁的代码实现繁杂的计算逻辑、这也得益于Scala编程语言的简洁性。这里,或多或少人基于1.3.0版本的Spark搭建了计算平台,实现基于Spark Streaming的实时计算。

或多或少人的应用场景是分析用户使用手机App的行为,描述如下所示:

下面,或多或少人根据底下提到的应用场景,来编程实现你是什么 实时计算应用。首先,写了2个 Kafka Producer模拟应用应用程序,用来模拟向Kafka实时写入用户行为的事件数据,数据是JSON格式,示类似下:

底下代码实现,得益于Scala语言的底部形态,都不需要 在代码中任何位置进行class或object的定义,或多或少人将用来管理Redis连接的代码放入去了特定操作的内部人员,就补救了瞬态(Transient)对象跨节点序列化的难题。而是做都要求或多或少人不需要 了解Spark内部人员是怎样才能操作RDD数据集的,更多都不需要 参考RDD或Spark相关文档。

在集群上,以Standalone模式运行,执行如下命令:

查看源代码打印帮助

2个 事件饱含 2个 字段:

Kafka+Spark Streaming+Redis编程实践

这里,附上前面开发的应用所对应的依赖,以及打包Spark Streaming应用应用程序运行的Maven配置,以供参考。将会使用maven-shade-plugin插件,配置有难题句子,打包后在Spark集群上提交Application要我将会会报错Invalid signature file digest for Manifest main attributes。参考的Maven配置,如下所示:

有关更多关于Spark Streaming的完整性内容,都不需要 参考官方文档。

Spark Streaming提供了2个 叫做DStream(Discretized Stream)的高级抽象,DStream表示2个 持续不断输入的数据流,都不需要 基于Kafka、TCP Socket、Flume等输入数据流创建。在内部人员,2个 DStream实际上是由2个 RDD序列组成的。Sparking Streaming是基于Spark平台的,也就继承了Spark平台的各种底部形态,如容错(Fault-tolerant)、可扩展(Scalable)、高吞吐(High-throughput)等。

在Spark Streaming中,每个DStream饱含 了2个 时间间隔之内的数据项的集合,或多或少人都不需要 理解为指定时间间隔之内的2个 batch,每2个 batch就构成2个 RDD数据集,而是DStream而是2个 个batch的有序序列,时间是连续的,按照时间间隔将数据流分割成2个 个离散的RDD数据集,如图所示(来自官网):

附录

下面是或多或少人实现的代码,如下所示:

通过控制底下应用应用程序最后一行的时间间隔来控制模拟写入速度。下面或多或少人来讨论实现实时统计每个用户的点击次数,它是按照用户分组进行累加次数,逻辑比较简单,关键是在实现过程中要注意或多或少难题,如对象序列化等。先看实现代码,稍后或多或少人再完整性讨论,代码实现如下所示:

都不需要 查看集群中各个Worker节点执行计算任务的状态,也都不需要 非常方便地通过Web页面查看。

下面,看一下或多或少人存储到Redis中的计算结果,如下所示:

底下代码或多或少人分别在local[K]和Spark Standalone集群模式下运行通过。

将会或多或少人是在开发环境进行调试的要我,也而是使用local[K]部署模式,在本地启动K个Worker应用应用程序来计算,这K个Worker在同2个 JVM实例里,底下的代码默认状态是,将会没法 传参数则是local[K]模式,而是将会使用你是什么 妙招在创建Redis连接池或连接的要我,将会非常容易调试通过,或多或少在使用Spark Standalone、YARN Client(YARN Cluster)或Mesos集群部署模式的要我,就会报错,主而是将会在补救Redis连接池或连接的要我出错了。或多或少人都不需要 看一下Spark架构,如图所示(来自官网):

无论是在本地模式、Standalone模式,还是在Mesos或YARN模式下,整个Spark集群的底部形态都都不需要 用上图抽象表示,而是各个组件的运行环境不同,原因组件将会是分布式的,或本地的,或单个JVM实例的。如在本地模式,则上图表现为在同一节点上的单个应用应用程序运行之内的多个组件;而在YARN Client模式下,Driver应用应用程序是在YARN集群之外的2个 节点上提交Spark Application,或多或少的组件都运行在YARN集群管理的节点上。

在Spark集群环境部署Application后,在进行计算的要我会将作用于RDD数据集上的函数(Functions)发送到集群中Worker上的Executor上(在Spark Streaming中是作用于DStream的操作),没法 哪几个函数操作所作用的对象(Elements)都而是可序列化的,通过Scala也都不需要 使用lazy引用来补救,或多或少哪几个对象(Elements)在跨节点序列化传输后,无法正确地执行反序列化重构成实际可用的对象。底下代码或多或少人使用lazy引用(Lazy Reference)来实现的,代码如下所示: