29 SparkStreaming

本文详细介绍了SparkStreaming的基本概念、工作原理和架构,包括DStream的操作和实战应用。深入探讨了不同数据源的使用,如文件、自定义(socket和MySQL)、Flume以及Kafka的0.8和0.10版本的对接。同时,讨论了DStream的无状态和有状态转换操作,以及Window Operations。最后,文章提到了SparkStreaming的容错机制,包括检查点、驱动器容错和接收器容错策略。
摘要由CSDN通过智能技术生成

SparkStreaming

1.sparkStreaming的基本介绍

1、什么是Spark Streaming

sparkStreaming是spark当中用于实时处理的一个模块,主要是用于做一些实时处理的功能,类似于storm。
sparkStreaming支持各种各样的数据源,例如kakfa,flume,tcp套接字

在这里插入图片描述
2、为什么要学sparkStreaming

主要就是用于做实时处理

在这里插入图片描述
3、sparkStreaming与strom对比:

1:编程模型不同 sparkStreaming编程模型使用的是DStream

strom编程模型使用的Spout与Bolt

2:编程语言不同

	storm使用的cloujure

	spark使用scala语言

3:实时性不太一样:

	SparkStreaming的实时性不如storm好

4:数据吞吐量不太一样:

	SparkStreaming的数据吞吐量远远高于storm

5:数据驱动模型不一样

	strom是以数据为驱动的	

	sparkStreaming是以时间为驱动的。每隔一段时间去处理一批数据。如果间隔时间足够段,直到时间缩短到0.1s钟。
	基本上就可以当做实时处理的框架来使用。

2.Spark Streaming原理与架构

1:原理 只要间隔时间足够段,就可以当做实时处理的框架来使用

2:计算流程

在这里插入图片描述
3:sparkStreaming的容错性:可以通过rdd确定lineage血统关系,实现容错性,驱动器的容错

4:sparkStreaming的实时性:最小时间间隔可以达到0.1s

5:sparkStreaming的架构

sparkCore  ==>  RDD ==>  SparkContext

sparkSQL  ==>  DF/DS  ==>  SparkSession

SparkStreaming  ==>  DStream   ==>  StreamingContext

以数据为驱动的程序实时性更高一点

3.DStream

1.什么是DStream

Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,
DStream是一系列连续的RDD来表示。每个RDD含有一段时间间隔内的数据。

4.DStream相关操作

在这里插入图片描述
1、Transformations on DStreams
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、Output Operations on DStreams
在这里插入图片描述

5.DStream操作实战

需求:SparkStreaming接受socket数据,实现单词计数WordCount

在这里插入图片描述
第一步:创建maven工程并导入jar包

<properties>
        <scala.version>2.11.8</scala.version>
        <spark.version>2.2.0</spark.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${
   scala.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${
   spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>${
   spark.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

    </dependencies>
    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!--    <verbal>true</verbal>-->
                </configuration>
            </plugin>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <args>
                                <arg>-dependencyfile</arg>
                                <arg>${
   project.build.directory}/.scala_dependencies</arg>
                            </args>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass></mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

第二步:node1服务器安装并启动生产者

首先在linux服务器上用YUM安装nc工具,nc命令是netcat命令的简称,它是用来设置路由器。我们可以利用它向某个端口发送数据。
node1服务器执行以下命令安装socket客户端工具,模拟发送数据
yum -y install nc

第三步:通过netcat工具向指定的端口发送数据

node1服务器执行以下命令,向指定的端口9999发送数据
	nc -lk 9999 

第四步:开发sparkStreaming程序,统计单词出现的次数

package cn.itcast.sparkStreaming

import org.apache.spark.streaming.dstream.{
   DStream, ReceiverInputDStream}
import org.apache.spark.{
   SparkConf, SparkContext}
import org.apache.spark.streaming.{
   Seconds, StreamingContext}

object SparkStreamingDemo1 {
   
  /**
   * 实现实时数据统计,接收socket里面的数据
   * @param args
   * sparkContext: SparkContext, batchDuration: Duration
   */
  def main(args: Array[String]): Unit = {
   
    //数据抽象叫做DStream,数据操作对象StreamingContext

    val sparkConf: SparkConf = new SparkConf().setMaster("local[4]").setAppName("streamingFirst")

    val sparkContext = new SparkContext(sparkConf)
    sparkContext.setLogLevel("WARN")

    //获取StreamingContext,设置每隔5s处理一批数据
    val streamingContext = new StreamingContext(sparkContext,Seconds(5))
    //接收数据
    val stream: ReceiverInputDStream[String] = streamingContext.socketTextStream("192.168.91.110",9999)
    //数据处理
    val key: DStream[(String, Int)] = stream.flatMap(x => x.split(" ")).map((_,1)).reduceByKey(_ + _)
    //调用out_put operation实现数据输出
    key.print()
    //启动程序
    streamingContext.start()
    //等待程序结束
    streamingContext.awaitTermination()
  }
}

未保存历史数据
在这里插入图片描述

6.sparkStreaming数据源

6.1 基本数据源

6.1.1、文件数据源

在这里插入图片描述
在这里插入图片描述

package cn.itcast.sparkStreaming

import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.{
   SparkConf, SparkContext}
import org.apache.spark.streaming.{
   Seconds, StreamingContext}

object FileStream {
   

  //使用updateStateByKey这个算子,需要传入一个updateFunc函数;
  //seq:传入数据值 option:历史累加值
  //返回值是option
  //option some none scala当中比较特殊的类型,为了解决null值的问题
  //option 是 some和none的父类
  //none: 类似于口袋里面什么也没有,但是有一张纸条,上面写着什么也没有
  /**
   * 定义一个方法,实现将历史数据全部保存下来
   * @param inputSum  Seq[Int] 将输入数据都累加
   * @param resultSum 保存历史的数据
   * @return
   */
  def updateFunc(inputSum:Seq[Int], resultSum:Option[Int]) :Option[Int] = {
   
    //getOrElse 表示获取历史数据,如果没有则给0
    val finalResult: Int = inputSum.sum + resultSum.getOrElse(0)
    Option(finalResult) //返回累加之后的结果
    //Some(finalResult)
  }

  /**
   * 监控hdfs的某一个目录,一旦有文件新生成,处理文件内容,实现单词统计
   * 并且将历史数据保存下来
   *
   * @param args
   */
  def main(args: Array
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值