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

  • 时间:
  • 浏览:0
  • 来源:uu快3开奖_uu快3娱乐_输钱

上面代码实现,得益于Scala语言的底部形态,不都还还可以 了在代码中任何位置进行class或object的定义,大伙将用来管理Redis连接的代码倒进了特定操作的内内外部,就处置了瞬态(Transient)对象跨节点序列化的问題。也不 做不都还还可以 了求大伙不不都还还可以 了解Spark内内外部是怎样才能操作RDD数据集的,更多不都还还可以 了参考RDD或Spark相关文档。

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

有关更多关于Spark Streaming的详细内容,不都还还可以 了参考官方文档。

附录

下面是大伙实现的代码,如下所示:

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

在Spark Streaming中,每个DStream暗含了有另一个 时间间隔之内的数据项的集合,大伙不都还还可以 了理解为指定时间间隔之内的有另一个 batch,每有另一个 batch就构成有另一个 RDD数据集,一点一点DStream也不 有另一个 个batch的有序序列,时间是连续的,按照时间间隔将数据流分割成有另一个 个离散的RDD数据集,如图所示(来自官网):

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

大伙的应用场景是分析用户使用手机App的行为,描述如下所示:

有另一个 事件包暗含另一个 字段:

上面代码使用了Jedis客户端来操作Redis,将分组计数结果数据累加写入Redis存储,可能性一点系统不都还还可以 了实时获取该数据,直接从Redis实时读取即可。RedisClient实现代码如下所示:

上面代码大伙分别在local[K]和Spark Standalone集群模式下运行通过。

可能性大伙是在开发环境进行调试的刚刚,也也不 使用local[K]部署模式,在本地启动K个Worker程序运行来计算,这K个Worker在同有另一个 JVM实例里,上面的代码默认情况汇报是,可能性没人传参数则是local[K]模式,一点一点可能性使用你这种 措施在创建Redis连接池或连接的刚刚,可能性非常容易调试通过,也不 在使用Spark Standalone、YARN Client(YARN Cluster)或Mesos集群部署模式的刚刚,就会报错,主也不 可能性在处置Redis连接池或连接的刚刚出错了。大伙不都还还可以 了看一下Spark架构,如图所示(来自官网):

这里,附上前面开发的应用所对应的依赖,以及打包Spark Streaming程序运行运行的Maven配置,以供参考。可能性使用maven-shade-plugin插件,配置有问題励志的话 ,打包后在Spark集群上提交Application刚刚可能性会报错Invalid signature file digest for Manifest main attributes。参考的Maven配置,如下所示:

下面,大伙根据上面提到的应用场景,来编程实现你这种 实时计算应用。首先,写了有另一个 Kafka Producer模拟程序运行,用来模拟向Kafka实时写入用户行为的事件数据,数据是JSON格式,示例如下:

通过控制上面程序运行最后一行的时间间隔来控制模拟写入速率。下面大伙来讨论实现实时统计每个用户的点击次数,它是按照用户分组进行累加次数,逻辑比较简单,关键是在实现过程中要注意一点问題,如对象序列化等。先看实现代码,稍后大伙再详细讨论,代码实现如下所示:

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

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

Kafka+Spark Streaming+Redis编程实践

Spark Streaming介绍

查看源代码打印帮助

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

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

不都还还可以 了查看集群中各个Worker节点执行计算任务的情况汇报,也不都还还可以 了非常方便地通过Web页面查看。

下面,看一下大伙存储到Redis中的计算结果,如下所示:

另你这种 措施,大伙将代码修改为,把对Redis连接的管理倒进操作DStream的Output操作范围之内,可能性大伙知道它是在特定的Executor中进行初始化的,使用有另一个 单例的对象来管理,如下所示: