spark大数据处理技术读书笔记:spark streaming学习笔记

第十章:spark streaming 流数据处理框架

一。spark streaming程序的几个步骤

1.创建StreamingContext。sparkstreaming context和spark context创建区别不大,唯一要加的就是streaming context需要添加一个Seconds(1),指定处理数据的时间间隔。就是batchDuration,而且该处理间隔一旦设定就没法改变。1就是为每隔一秒处理一次数据。

2.创建InputDStream

如果storm的spout,sparkstreaming也需要指明数据源。比如socketTextStream将用套接字作为数据源读取数据。同时也支持kafkaStream,flumeStream,fileStream,networkStream,mqttStream,zeroMQStream

3.操作Dstream

 Dstream是包含了一系列的RDD,这些RDD可以从数据源来,也可以从转换操作来。比如对从数据源得到的数据首先进行分词,然后利用mapreduce算法映射和计算、最后用print()输出结果。

4.启动Spark Streaming

当ssc.start()启动后,程序才真正开始进行所有预期的操作。

二。spark streaming基本概念

1.滑动间隔和窗口间隔都是批处理间隔的整数倍,窗口间隔是有重合的,但是spark保证了处理不会重复。

2.DStream的操作最终还是要通过RDD的操作来实现,不过是DStream提升了抽象程度,隐藏了具体的实现细节。

3.DStream操作函数

repartition(num) 改变DStream的分片数量

union(otherStream)跟其他的stream合并。

count()返回原DStream中各个RDD中元素的个数。

reduce(func)

reduceByKey(func)按照key对元素通过func进行聚合,本地环境并行度是2,集群环境并行度是8

join()  原来是DStream[(k,v)] 变成DStream[(k,(v,w))]

等等 p236页

三。性能调优

1.运行时间优化

增加并行度。把任务分散到多个节点上,特别是含有shuffle的操作

减少序列化负担,spark默认对接收到的数据是序列化存储,减少内存,所以使用自定义的序列化方式或者更搞笑的序列化方式更好。

设置合理的批处理间隔,若在间隔范围内没处理完,这就不好了,后面会不断堆积

减少任务提交和分发带来的负担,如果批处理时间间隔小的话,会不停的进行任务提交和分发,就不太好。

2.内存使用优化

控制批处理间隔数据量,过大处理起来,内存会存不下

及时清理不用的,最好是spark.streaming.unpersist()设置为true,可以自动回收。

观察和调整GC

四,容错

通过rdd的依赖关系进行恢复。能从原始数据集中恢复出来。所有中间结果都是可被计算的。

工作节点失效。数据源不丢失,就不会丢失。

驱动节点失效。从断点继续读取,启动时指定StreamingContext.getOrCreate,记录点记录的数据是类序列化后的结果,因此若重新编译代码后反序列化就会出错。

五。DStream作业的产生和调度

spark中,作业是由一系列有继承关系的RDD和作用在其上的函数所组成的完整的操作链。并由输出RDD向DAGScheduler提交操作链来提交作业。

spark是按照输出操作来判断作业产生的,有多少个输出就有多少个作业。作业内或许有依赖,这些作业会注册到DStreamGraph中等待提交执行。

作业调度是在每个批处理间隔的时间点到来,注册在DStreamGraph中的作业会被取出来放进JobScheduler进行调度和提交。

a.sparkStreaming内部维护了周期性的定时器,超时间隔就是预先设置的批处理间隔。超时后就请求DStreamGraph来产生streaming作业

b.JobScheduler内部维护线程池来运行作业。默认是1,可以通过concurrentJobs来配置。

c.最终从Graph中得到的作业还是转换成spark作业来处理,通过spark的spark scheduler来处理。

六。DStream和RDD的关系。

DStream内部可以分为下面三个部分。

1.一组基于操作链的依赖关系。就是该DStream所依赖的父DStream

2.批处理间隔

3.一个计算RDD的函数compute()。getOrCompute()函数会在其内部递归调用操作链上的所有的DStream的compute函数,来获得新的RDD,该RDD就是记录了完整的执行任务的操作链。


二。时间和窗口概念

sparkStreaming系统要等到数据汇总到一定的量后再一并操作,这个间隔就是批处理间隔。决定了提交作业的频率和数据处理的延时,同样也影响着数据处理的吞吐量和性能。

2.1滑动间隔(slide duration)和窗口间隔(window duration)

这两个间隔都是批处理间隔的整数倍,处理数据的间隔取决于滑动间隔,所使用的数据量是窗口间隔来决定的。从字面意义上来说,滑动间隔其实就窗口要开始滑动的时候,比如长度为四的窗口间隔,如果滑动间隔为2,那么在这四个批处理间隔内,会有两次的滑动操作,这两次的滑动操作中,会有两个批处理间隔的数据会重复的,但是sparkstreaming系统中做了优化,不会让重复计算发生,同时因为多次处理了很多数据,从而提升了处理速度。

2.2DStream 离散数据流 

从英文意思上看,就是从多个分布式数据源中收集到的数据流,离散数据流DStream有三种操作,一种是普通的转换操作,一种是基于窗口的变换操作,一种是输出操作。转换操作不会产生和提交作业,只构成DStream操作链 比如flatmap,filter,count reduce等

窗口的变换操作,将转换操作和窗口操作合并后得到的操作  reduceByWindow reduceByKeyAndWindow,窗口操作会在其内部隐式的将DStream中的RDD持久化到内存中而无须用户显示的调用。

输出操作  foreachRDD   saveAsTextFile

3.作业产生

操作链定义完成,提交到DAGScheduler后,就会产生作业了,一个作业有多少个输出就有多少个作业,作业之间可能会有依赖,会根据依赖关系来处理作业。

4.作业产生后也不会立刻提交,而是等到streamingContext启动后,在批处理间隔到来后才会真正的被执行。

三。streaming作业与spark作业之间的关系。

DStream在内部维护了相应的RDD,无论是转换操作还是输出操作,都会最终被映射到RDD上,因此sparkStreaming可以自然而然的产生与之一一对应的spark作业。当在构建DStream操作链时,spark内部就在构建RDD操作链,这个RDD操作链最终会在其内部产生作业并提交运行。最后用runJob()提交作业。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据算法--HadoopSpark数据处理技巧 data algorithms部分主题⾃写scala程序实现 SecondarySort (chapter 1) data 2015,1,1,10 2015,1,2,11 2015,1,3,12 2015,1,4,13 2015,2,1,22 2015,2,2,23 2015,2,3,24 2015,2,4,25 2015,3,1,20 2015,3,2,21 2015,3,3,22 2015,3,4,23 2015,3,4,23 2015,1,3,12 2015,2,2,23 code import org.apache.spark.sql.SparkSession import org.apache.spark.{Partitioner, SparkConf} class SecondarySortPartitioner(val v: Int) extends Partitioner { override def numPartitions: Int = { v } override def getPartition(key: Any): Int = key match { case (k: String, v: Int) => math.abs(k.hashCode % numPartitions) case null => 0 case _ => math.abs(key.hashCode % numPartitions) } } object SecondarySort { def main(args: Array[String]): Unit = { System.setProperty("hadoop.home.dir", "C:\\winutils-master\\hadoop-2.6.3") val conf = new SparkConf().setMaster("local").setAppName("SecondarySort") val context = SparkSession.builder().config(conf).getOrCreate().sparkContext val rdd = context.textFile("C:\\Users\\IdeaProjects\\spark_learning\\test.txt") val step1 = rdd.map(line => line.split(",")) .map(line => ((line(0) + "-" + line(1), line(3).toInt), line(3).toInt)) val step2 = step1.repartitionAndSortWithinPartitions(new SecondarySortPartitioner(4)) .map { case (k, v: Int) => (k._1, v.toString) }.reduceByKey((x, y) => x + "," + y) step2.foreach(println) } } CommonFriends (chapter 8) data 100,200 300 400 500 600 200,100 300 400 300,100 200 400 500 400,100 200 300 500,100 300 600,100 code import org.apache.spark.{HashPartitioner, SparkConf} import org.apache.spark.sql.SparkSession import scala.collection.mutable.ArrayBuffer object CommonFriends { def main(args: Array[String]): Unit = { System.setProperty("hadoop.home.dir", "C:\\winutils-master\\hadoop-2.6.3") val conf = new SparkConf().setMaster("local").setAppName("CommonFriends") val spark = SparkSession.builder().config(conf).getOrCreate() import spark.implicits._ val context = SparkSession.builder().config(conf).getOrCreate().sparkContext val rdd = context
### 回答1: Kafka和Spark Streaming是大数据领域中非常重要的技术,它们可以协同工作,实现实时数据处理和分析。Kafka是一个分布式的消息队列系统,可以高效地处理海量数据流,而Spark Streaming则是一个基于Spark的流处理框架,可以实现实时数据处理和分析。在学习Kafka和Spark Streaming时,需要掌握它们的基本概念、原理和使用方法,以及如何将它们结合起来实现实时数据处理和分析。同时,还需要了解Kafka和Spark Streaming的优缺点,以及如何优化它们的性能和可靠性。 ### 回答2: Kafka是一个高性能,可扩展的分布式消息系统。它通过将消息划分成一个或多个主题,然后将这些主题划分成一个或多个分区来进行实现。Kafka是由LinkedIn开发的,由Apache基金会进行管理。它的主要设计目标是支持分布式处理,如流处理和批处理等。Kafka通过使用Zookeeper来进行节点管理和故障转移,能够快速处理海量的数据。Kafka采用发布/订阅模式,支持多个消费者订阅同一个主题,每个消费者可以读取主题的所有分区数据,也可以选择读取其中的某个分区。 Spark Streaming是一个流处理框架,它能够利用Spark的分布式处理能力来对实时数据进行处理。Spark Streaming采用微批处理的方式,将实时数据流切片成一段一段的,并通过并行处理的方式进行计算。Spark Streaming的数据源可以是Kafka、Flume或者TCP sockets等。与Kafka相比,Spark Streaming更适合于需要进行实时计算的场景,例如:实时日志分析、实时推荐、实时风控等。同时,Spark Streaming还能够与Spark的批处理进行无缝对接,实现流处理与批处理的统一计算引擎。Spark Streaming支持机器学习、图计算等高级计算库,能够为用户提供更强大的计算能力。 学习Kafka和Spark Streaming的过程中,需要掌握Java、Scala等编程语言基础知识,并具备分布式系统的相关知识。对于Kafka,需要了解其基本概念、架构、API等,理解消息系统、发布/订阅模式、分区等内容。对于Spark Streaming,需要掌握其基本概念、流式计算流程、数据源等,同时也要熟悉Spark的RDD、DataFrame等相关知识。在学习中,需要结合实际项目,进行代码实践和调试,同时不断学习、思考和总结,以加深对Kafka和Spark Streaming的理解和应用。 ### 回答3: Kafka是由Apache SoftWare Foundation开发的一种分布式发布/订阅消息系统。其主要目的是为数据传输提供一种高吞吐量、低延迟的解决方案。Kafka提供了一种可靠的、持久化的、实时的数据传输方式,适用于众多的场景,如:日志收集、数据传输、消息系统等。 Kafka的特点: 1、高吞吐量:Kafka可以支持非常高的数据传输吞吐量,同时保持低延迟和高稳定性。 2、可扩展性:Kafka可以轻松扩展以适应更大的数据需求,并可以在运行时添加新的主题分区。 3、持久化:Kafka保证数据能够可靠地在分布式集群中传输,同时保证数据不会丢失或者被意外删除。 4、多样化的客户端:Kafka提供了多种语言的客户端接口,以满足不同的开发需求。 SparkStreaming 是由Apache Spark社区发展的一个实时数据处理框架。它用于将实时数据流分成小批处理,可以跨越不同的时间窗口进行计算。Spark Streaming提供了与Spark非常相似的编程模型,同时支持不同的输入源,包括社交媒体、传感器、消息队列等。 SparkStreaming的特点: 1、处理速度快:它可以支持毫秒级别的处理速度,并且可以在分布式系统中实现高吞吐量。 2、支持多种数据源:Spark Streaming可以从多种类型的数据源中读取数据,如HDFS、Flume、Kafka等。 3、编程简单:Spark Streaming提供了与Spark相似的编程模式,使得开发人员可以将Spark StreamingSpark整合在一起进行处理。 4、高容错性:Spark Streaming在分布式环境中实现了高可靠性和容错性,使得它可以支持大规模的实时数据处理需求。 总之,Kafka和Spark Streaming这两个工具是在大数据处理领域中非常重要的工具。它们可以很好地相互结合,支持大规模的实时数据处理和分析,进而为企业提供更好更快的数据处理方案。如果你对这两个技术感兴趣,可以从官方文档和教程开始学习,逐步掌握它们的定义、特点、应用场景和基本使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值