sparkstreaming

Spark Streaming是一个实时流计算框架,以秒级批处理实现数据流处理。它支持多种数据源,如Kafka、Flume等,提供DStream进行数据操作,支持无状态、有状态和窗口操作。该框架具有高吞吐量、容错性等优点,但也存在延迟问题。本文介绍了Spark Streaming的基础概念,包括Word count示例、输入源、转换操作、输出操作、DataFrame和SQL、MLlib操作、缓存、检查点和性能调优,旨在帮助开发者深入理解并应用Spark Streaming。
摘要由CSDN通过智能技术生成

SparkStreaming教程

本文章主要讲述SparkStreaming概念原理、基本概念、以及调优等一些知识点。

1      概述

1.1  SparkStreaming是什么

Spark Streaming 是个批处理的流式(实时)计算框架。其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。

   支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如map、reduce、join等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库等。

Spark Streaming处理的数据流图:





以上的连续4个图,分别对应以下4个段落的描述:

  • Spark Streaming接收Kafka、Flume、HDFS和Kinesis等各种来源的实时输入数据,进行处理后,处理结果保存在HDFS、Databases等各种地方。
  • Spark Streaming接收这些实时输入数据流,会将它们按批次划分,然后交给Spark引擎处理,生成按照批次划分的结果流。
  • Spark Streaming提供了表示连续数据流的、高度抽象的被称为离散流的DStream。DStream本质上表示RDD的序列。任何对DStream的操作都会转变为对底层RDD的操作。
  • Spark Streaming使用数据源产生的数据流创建DStream,也可以在已有的DStream上使用一些操作来创建新的DStream。

1.2    2. Spark Streaming能做什么

目前而言SparkStreaming 主要支持以下三种业务场景

  • 无状态操作:只关注当前批次中的实时数据,例如:

  1. 商机标题分类,分类http请求端 -> kafka -> Spark Streaming -> http请求端Map -> 响应结果
  2. 网库Nginx访问日志收集,flume->kafka -> Spark Streaming -> hive/hdfs
  3. 数据同步,网库主站数据通过“主站”->kafka->Spark Streaming -> hive/hdfs
  • 有状态操作:对有状态的DStream进行操作时,需要依赖之前的数据 除了当前新生成的小批次数据,但还需要用到以前所生成的所有的历史数据。新生成的数据与历史数据合并成一份流水表的全量数据例如:
  1. 实时统计网库各个站点总的访问量
  2. 实时统计网库每个商品的总浏览量,交易量,交易额。
  • 窗口操作:定时对指定时间段范围内的DStream数据进行操作,例如:
  1.  网库主站的恶意访问、爬虫,每10分钟统计30分钟内访问次数最多的用户。

1.3        特性

1.3.1       优点:

  • 吞吐量大、速度快。
  • 容错:SparkStreaming在没有额外代码和配置的情况下可以恢复丢失的工作。checkpoint。
  • 社区活跃度高。生态圈强大。
  • 数据源广泛。

1.3.2  缺点:

  •  延迟。500毫秒已经被广泛认为是最小批次大小,这个相对storm来说,还是大很多。所以实际场景中应注意该问题,就像标题分类场景,设定的0.5s一批次,加上处理时间,分类接口会占用1s的响应时间。实时要求高的可选择使用其他框架。

2   基础概念-开发

2.1  简单示例

2.1.1  Word count词频计算demo

[java]  view plain  copy
  1. object NetworkWordCount {  
  2.   def main(args: Array[String]) {  
  3.     val sparkConf = new SparkConf()  
  4.     val ssc = new StreamingContext(sparkConf, Seconds(1))  
  5.     val lines = ssc.socketTextStream(hostname, port)  
  6.     val words = lines.flatMap(_.split(" "))  
  7.     val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)  
  8.     wordCounts.print()  
  9.     ssc.start()  
  10.     ssc.awaitTermination()  
  11.   }  

2.1.2  说明

1.  通过创建输入DStreams来定义输入源。

2.  通过将转换和输出操作应用于DStream来定义流式计算。

3.  开始接收数据并使用它进行处理streamingContext.start()

4.  等待处理停止(手动或由于任何错误)使用streamingContext.awaitTermination()

5.  可以手动停止处理streamingContext.stop()

2.1.3  注意

1.  一旦上下文开始,就不能设置或添加新的流计算。

2.  一旦上下文停止,它将无法重新启动。

3.  只有一个StreamingContext可以在JVM中同时处于活动状态。

2.2  输入源

Spark Streaming提供了两类输入源。

·        基本来源:StreamingContextAPI中直接提供的资源。示例:文件系统,套接字连接。

1.文件系统:streamingContext.fileStream(hdfsDataDirectory)

SparkStreaming将监听目录dataDirectory并处理在该目录中创建的任何文件(不支持嵌套目录中写入的文件)
文件必须具有相同的数据格式。
必须dataDirectory通过将数据原子移动重命名为数据目录来创建文件。
移动后,文件不能更改。因为,如果文件被不断附加,则不会读取新的数据。


<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值