文章目录
前言
你们好我是啊晨
今儿更新spark 技术Spark Streaming。
废话不多说,内容很多选择阅读,详细。
请:
一、Spark Streaming概述
1、什么是Spark Streaming
Spark Streaming类似于Apache Storm,用于流式数据的处理。根据其官方文档介绍,Spark Streaming有高吞吐量和容错能力强等特点。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如:map、reduce、join、window等进行运算。而结果也能保存在很多地方,如HDFS,数据库等。另外Spark Streaming也能和MLlib(机器学习)以及Graphx完美融合。
和Spark基于RDD的概念很相似,Spark Streaming使用离散化流(discretized stream)作为抽象表示,叫作DStream。DStream 是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD 存在,而 DStream 是由这些 RDD 所组成的序列(因此 得名“离散化”)。
DStream 可以从各种输入源创建(简单数据源socket 复杂数据源kafka),比如 Flume、Kafka 或者 HDFS。创建出来的DStream 支持两种操作,一种是转化操作(transformation),会生成一个新的DStream,另一种是输出操作(output operation),可以把数据写入外部系统中,每个时间区间分别输出到不同的文件。DStream 提供了许多与 RDD 所支持的操作相类似的操作支持,还增加了与时间相关的新操作,比如滑动窗口。
2、为什么要学习Spark Streaming
1.易用
2.容错
3.易整合到Spark体系
3、Spark与Storm的对比
Spark | Storm |
---|---|
![]() |
![]() |
开发语言:Scala | 开发语言:Clojure |
编程模型:DStream | 编程模型:Spout/Bolt |
![]() |
![]() |
目前流行的三种实时框架对比
Apache | Flink | SparkSteaming | Storm |
---|---|---|---|
架构 | 架构介于spark和storm之间,主从结构与sparkStreaming相似,DataFlow Grpah与storm相似,数据流可以被表示为一个有向图,每个顶点是一个定义的运算,每向边表示数据的流动 Native | 架构依赖Spark,主从模式,每个batch批次处理都依赖driver主,可以理解为时间维度上的spark DAG Micro-Batch | 主从模式,且依赖ZK,处理过程中对主的依赖不大 Native |
容错 | 基于Ghandy-Lamport distributed snapshots checkpoint机制 Medium | WAL及RDD血统机制 High(高) | Records Ack Medium(一般) |
处理模型与延时 | 单条时间处理亚秒级低延时 | 一个事件窗口内的所有事件 秒级低延时 | 每次传入的一个事件 亚秒级低延时 |
吞吐量 | High | High | Low(低) |
数据处理保证 | Exactly once High | Exactly once(实现架用Chandy-Lamport算法,即marker-checkpoint) High | At least once(实现架用record-level acknowledgments),Trident可以支持storm提供exactly once语义 Medium |
高级API | Flink,栈中提供了很多高级API和满足不同场景的类库:机器学习、图分析、关系式数据处理 High | 能够很容易的对接Spark生态圈里面的组件,同时额能够对接主流的消息传输组件及存储系统 High | 应用需要按照特定的storm定义的规模编写 Low |
易用性 | 支持SQL Streaming,Batch和Streaming采用统一编程框架 High | 支持SQL Streaming,Batch和Streaming采用统一编程框架 High | 不支持SQL Streaming Medium |
成熟性 | 新兴项目,处于发展阶段 Low 大家都在观望,用户量比较低 | 已经发展一段时间 Medium 用户量在逐渐增加 | 相对较早的流系统,比较稳定 High |
社区活动度 | 212 contributor 上升阶段 Medium | 937 contributor High | 216 contributor,活跃比较稳定 Medium |
部署性 | 部署相对简单,只依赖JRE环境 Low | 部署相对简单,只依赖JRE环境 Low | 依赖JRE环境和ZK High |
二、运行Spark Streaming
IDEA编写程序
Pom.xml 加入以下依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.1.1</version>
</dependency>
package com.bigdata.streaming
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{
Seconds, StreamingContext}
object WorldCount {
def main(args: Array[String]) {
//注意运输模式为local的时候必须至少设置2个core, local[2]
//接收socket的数据,需要一个对应的接收器,这个接收器就会使用cpu核
//处理数据就需要一个执行器,这个执行器也会使用cpu核
val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
//需要两个参数 第一个是 SparkConf 第二个是时间间隔,每个批次的数据的时间范围的长度
val ssc = new StreamingContext(conf, Seconds(1))