streaming基本概念与入门

782 阅读4分钟

1. 概述

1. 离线与实时概念

数据处理的延迟

  1. 离线 计算开始前就已经知道所有输入数据,并在计算时,输入数据不会变化,一般用于处理大数据量,如Hadoop的MapReduce处理方式。

  2. 实时 输入数据可以序列化方式一个一个输入并处理,计算量级小,计算时间短

2. 批量和流式

数据处理方式

  1. 批量 处理离线数据,冷数据,单个处理数据量大,处理速度慢

  2. 流式 在线,实时产生数据,单次处理数据量小,速度快

3. spark streaming是什么

1.概念

Spark Streaming用于流式数据的处理。 支持数据源很多,还支持自定义数据源,处理的数据是一批,不是一条,批处理间隔是spark streaming 的核心概念与关键参数,决定了spark streaming 提交作业和数据处理的延迟,同时也影响着数据处理的吞吐量和性能。 和Spark基于RDD的概念很相似,Spark Streaming使用了一个高级抽象离散化流(discretized stream),叫作DStreams。DStreams是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD存在,而DStreams是由这些RDD所组成的序列(因此得名“离散化”)。DStreams可以由来自数据源的输入数据流来创建, 也可以通过在其他的 DStreams上应用一些高阶操作来得到

原理图:

2. 架构

  1. 架构图
  2. 整体架构图

3. 背压机制

Spark 1.5以前版本,用户如果要限制Receiver的数据接收速率,可以通过设置静态配制参数“spark.streaming.receiver.maxRate”的值来实现,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。比如:producer数据生产高于maxRate,当前集群处理能力也高于maxRate,这就会造成资源利用率下降等问题。

为了更好的协调数据接收速率与资源处理能力,1.5版本开始Spark Streaming可以动态控制数据接收速率来适配集群数据处理能力。背压机制(即Spark Streaming Backpressure): 根据JobScheduler反馈作业的执行信息来动态调整Receiver数据接收率。

通过属性“spark.streaming.backpressure.enabled”来控制是否启用backpressure机制,默认值false,即不启用

3. DStream入门

1. WC案例实操

  1. 需求:使用netcat工具向9999端口不断的发送数据,通过SparkStreaming读取端口数据并统计不同单词出现的次数
  2. 添加依赖
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming_2.11</artifactId>
  <version>2.1.1</version>
</dependency>
  1. 编写代码
object Spark01_WordCount {
def main(args: Array[String]): Unit = {
	//创建配置文件对象 注意:Streaming程序至少不能设置为local,至少需要2个线程
    val conf: SparkConf = new SparkConf().setAppName("Spark01_W").setMaster("local[*]")
    //创建Spark Streaming上下文环境对象
    val ssc = new StreamingContext(conf,Seconds(3))
    //操作数据源-从端口中获取一行数据
    val socketDS: ReceiverInputDStream[String] = ssc.socketTextStream("mayi101",9999)
    //对获取的一行数据进行扁平化操作
    val flatMapDS: DStream[String] = socketDS.flatMap(_.split(" "))
    //结构转换
    val mapDS: DStream[(String, Int)] = flatMapDS.map((_,1))
    //对数据进行聚合
    val reduceDS: DStream[(String, Int)] = mapDS.reduceByKey(_+_)
    //输出结果   注意:调用的是DS的print函数
    reduceDS.print()
    //启动采集器
    ssc.start()
    //默认情况下,上下文对象不能关闭
    //ssc.stop()
    //等待采集结束,终止上下文环境对象
    ssc.awaitTermination()
  }
}
  1. 启动程序,通过netcat发送数据
[mayi@mayi101 ~]$ nc -lk 9999

2. wc解析

Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,DStream是一系列连续的RDD来表示,每个RDD含有一段时间间隔内的数据,对这些 RDD的转换是由Spark引擎来计算的, DStream的操作隐藏的大多数的细节, 然后给开发者提供了方便使用的高级 API如下图:

3. 几点注意

  1. 一旦StreamingContext已经启动, 则不能再添加新的 streaming computations
  2. 一旦一个StreamingContext已经停止(StreamingContext.stop()), 他也不能再重启
  3. 在一个 JVM 内, 同一时间只能启动一个StreamingContext
  4. stop() 的方式停止StreamingContext, 也会把SparkContext停掉. 如果仅仅想停止StreamingContext, 则应该这样: stop(false)
  5. 一个SparkContext可以重用去创建多个StreamingContext, 前提是以前的StreamingContext已经停掉,并且SparkContext没有被停掉