Spark Streaming源码简介

原创 2016年08月29日 22:07:11

Spark Streaming简介

spark streaming是构建在spark core之上,提供的可扩展、高吞吐、容错的实时流处理模块,它能接受来自kafka、flume、tcp各种渠道的数据,进行用户定义的各种Map、Reduce计算,最终将数据继承到文件系统、HDFS、Hbase这样的存储平台或者将参数的数据供后端系统消费;今天我们着重介绍下Streaming模块中的类依赖关系以及自己动手写一个Dstream。
这里写图片描述

类图

这里写图片描述

spark streaming的所有类均继承自DStream,DSteam的compute方法定义了创建RDD的挂载点,子类需要实现该方法,提供创建RDD的方式;同时其也提供了一套stream的checkpoint逻辑,用户也可以根据自己的业务逻辑定义自己的DStreamCheckpointData,其包括了更新、清除、恢复等checkpoin操作;

动手写Dstream

我们提供一个基于文件的输入流,每个周期从文件中读取固定的几行生成一个RDD,这个RDD只包含一个Partition,测试方法中为对生成的RDD进行打印操作

文件流的实现

class FileInputDstream(@transient ssc: StreamingContext, file: String) extends InputDStream[String](ssc) with Logging{
  private[FileInputDstream] val batchLines = 10

  require(file != null, "file could not be null")

  var scanner: Scanner = new Scanner(new File(file))

  override def start(): Unit = {}

  override def stop(): Unit = {}

  override def compute(validTime: Time): Option[FileLineRDD]= {
    var count = 0
    val arrBuffer = ArrayBuffer[String]()
    while(scanner.hasNextLine && count < 2){
      arrBuffer += scanner.nextLine()
      count += 1
    }
    Some(new FileLineRDD(ssc.sparkContext, arrBuffer.toArray))
  }
}

RDD的实现

class FileLineRDD(sc: SparkContext, lineList: Array[String]) extends RDD[String](sc, Nil) with Logging{
  @DeveloperApi
  override def compute(split: Partition, context: TaskContext): Iterator[String] = {
    println(lineList.size)
    lineList.iterator
  }

  override protected def getPartitions: Array[Partition] = {Array(new FileLineRDDPartition("", 0, lineList.size))}
}



class FileLineRDDPartition(
                         val fileName: String,
                         val index: Int,
                         val lines: Int
                       ) extends Partition {
  /** Number of messages this partition refers to */
  def count(): Long = lines
}

测试代码

object FileStreamingTest {
  def main(args: Array[String]) {
    val sparkConf = new SparkConf
    sparkConf.setMaster("local[10]")
    sparkConf.setAppName("streaming test")
    sparkConf.set("spark.extraListeners", "com.scala.streaming.test.SimpleSparkListener")
    val jssc = new JavaStreamingContext(sparkConf, new Duration(2000));
    val file = "F:\\code\\product\\scala\\streaming-test\\src\\resource\\streaming.txt"
    new FileInputDstream(jssc.ssc, file).foreachRDD((rdd: RDD[String]) => rdd.foreachPartition(_.foreach(println _)))
    jssc.start();
    jssc.awaitTermination()
  }
}

第5课:基于案例一节课贯通Spark Streaming流计算框架的运行源码

一:案例实战演示: package com.dt.spark.sparkstreaming import org.apache.spark.SparkConf import org.apache...

第16课:Spark Streaming源码解读之数据清理内幕彻底解密

第16课:Spark Streaming源码解读之数据清理内幕彻底解密     本篇博客的主要目的是:  1. 理清楚Spark Streaming中数据清理的流程 组织思路如下:  a) 背景 ...

贯通Spark Streaming流计算框架的运行源码(第五篇)

本期内容: 基于简单案例贯通Spark Streaming的运行源码

第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

1。数据接收架构设计模式 2。数据接收源码彻底研究sparkstreaming接收数据的特征: 第一个特征:不断地持续地接收数据; 第二个特征:一般receiver和driver不再同一个进程中...

16.Spark Streaming源码解读之数据清理机制解析

原创文章,转载请注明:转载自 听风居士博客(http://blog.csdn.net/zhouzx2010) 本期内容: 一、Spark Streaming 数据清理总览 二、S...

第8课:Spark Streaming源码解读之RDD生成全生命周期彻底研究和思考

本期内容 1. DStream与RDD关系彻底研究 2. Streaming中RDD的生成彻底研究

10.Spark Streaming源码分析:Receiver数据接收全过程详解

原创文章,转载请注明:转载自 听风居士博客(http://blog.csdn.net/zhouzx2010)   在上一篇中介绍了Receiver的整体架构和设计原理,本篇内容主要介绍Receiver...

第11课:Spark Streaming源码解读之Driver中的ReceiverTracker架构设计以及具体实现彻底研究

第11课:Spark Streaming源码解读之Driver中的ReceiverTracker架构设计以及具体实现彻底研究 /* 王家林老师授课http://weibo.com/ilovepain...

第12课:Spark Streaming源码解读之Executor容错安全性

本节从安全角度来讲解sparkstreaming,因为sparkstreaming会不断的接收数据、不断的产生job、不断的提交job。所以有一个至关重要的问题就是数据安全性。     由于spar...

第13课:Spark Streaming源码解读之Driver容错安全性

第13课:Spark Streaming源码解读之Driver容错安全性   1、数据层面:ReceivedBlockTracker 是专门负责管理Spark Streaming运行的元数据。跟踪数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark Streaming源码简介
举报原因:
原因补充:

(最多只允许输入30个字)