Spark基础-SparkStreaming-官方文档学习-01

5 篇文章 0 订阅
3 篇文章 0 订阅

 

SparkStreaming 官方文档学习-01

sparkstreamming基础部门学习--主要依赖于spark官方文档(翻译+实践),版本是2.2.2,如有错误,希望大家不吝赐教~


一、入门例子:


package com.scathon.spark.example.spark_streaming

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

/**
  * Created by linhuadong on 2018/8/29.
  */
object SSDemo01 extends App {
  // 创建两个worker线程的本地StreamingContext,master需要两个core以避免饥饿的情景
  val conf = new SparkConf().setMaster("local[2]").setAppName("NCWordCount")
  // 设置批量拉取时间间隔是3秒
  val ssc = new StreamingContext(conf, Seconds(3))
  //  开启一个socket文本流,监听本地8888端口
  val lines = ssc.socketTextStream("localhost", 8888)
  //  spark标准的wordcount入门例子
  val words = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
  //  输出wordcount结果(只是当前批量拉取的时间段的wordcount,并不是从一开始累计计数)
  words.print()
  //  上面的都是初始化设置,这一步才真正开始执行spark streaming
  ssc.start()
  ssc.awaitTermination()
}
  • 测试结果:

1、使用netcat工具进行测试:

2. 启动应用程序:

现在是没有内容的。

3. netcat命令行中输入空格分割的字符串:

控制台将会显示wordcount结果。

二、基本概念


添加依赖maven为例

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_2.11</artifactId>
    <version>2.2.2</version>
</dependency>

kafka可以对接多种外部数据源,例如flume,kafka ,以及kinesis,几种外部数据源的依赖已经不再SparkStreaming的核心包中了,得添加相应的依赖,它们的命名方式都是: spark-streaming-xyz_2.11,例如:

kafkaspark-streaming-kafka-0-8_2.11
flumespark-streaming-flume_2.11
Kinesisspark-streaming-kinesis-asl_2.11 [Amazon Software License]

初始化StreamingContext

从SparkConf创建StreamingContex

import org.apache.spark._
import org.apache.spark.streaming._

val conf = new SparkConf().setAppName(appName).setMaster(master)
val ssc = new StreamingContext(conf, Seconds(1))

appName 参数是spark 集群ui界面上显示的名字,master是Spark,Mesos,YARN集群的URL,或者设置成 "local[*]" 字符串以本地模式运行。实际中,当以集群模式运行的时候,我们不想在将 master 进行硬编码,而是通过 spark-submit 发起应用。然而,对于本地模式或者单元测试,可以通过“local[*]” 运行SparkStreaming(需要探测本地中CPU核心数量),要明确一点:StreamingContext自己内部创建了一个SparkContext,可以通过ssc.sparkContext得到实例。

SparkStreaming也可以通过已经存在SparkContext实例进行创建,

import org.apache.spark.streaming._

val sc = ...                // existing SparkContext
val ssc = new StreamingContext(sc, Seconds(1))

SparkContext创建以后,我们要做的事情如下:

  1. 创建input DStreams来定义数据源
  2. 通过应用transformation和输出操作到DStream来定义流计算规则.
  3. 使用streamingContext.start()开始接收数据并且处理
  4.  使用 streamingContext.awaitTermination()等待进程停止(手动停止或者由于错误导致中断)
  5. 进程可以使用streamingContext.stop().手动停止、

注意点:

  1. 一旦容器启动了,不能添加或者设置新的流计算规则.
  2. 一旦容器停止了,它可以被重启.
  3. 同一时间一个JVM只能运行一个StreamingContext.
  4. stop()方法也会停止SparkContext,要只停止StreamingContext,需要设置stop()方法中的可选参数:stopSparkContext为false.
  5. 一个SparkContext可以被重用创建多个StreamingContext,只要前一个StreamingContext在下一个Stream创建之前被停掉(不关闭SparkContext)就可以.

离散数据流

离散数据里或者DStream 是SparkStreaming提供的基本的抽象,它代表着持续的数据流,要么是从数据源获取的输入数据流,要么是转换输入流生成的处理过的数据流。实际上,一个DStream代表着一系列持续不断地RDD,它是Spark的不可变分布式数据集的一个抽象,DStream中的每个RDD包含来自于特性时间间隔,如下所示:

任何应用在DStream上的都会被转化成对下面RDD的操作,例如,上面编写的WordCount例子,将内容流(许多行)转换成单词,flatMap操作被应用到lines DStream中的每个RDD以此来生成words DStream的RDDs,如下图所示:

 

这些底层的RDD转换有Spark引擎计算,DStream操作隐藏了大多数的细节并且为开发者提供了一个更高级的API方面使用,这些操作细节将会在稍后的模块讨论.

输入DStream和Receivers

输入DStream是代表从流式数据源获取的输入数据流,在WordCount 例子中,lines是一个输入DStream,因为它代表了从netcat server获取的数据流,每个input DStream(文件流除外,稍后讨论)关联着一个Receiver(接受者),其从数据源获取数据并且存储数据到Spark内存用来进行处理。

SparkStreaming 提供了两种内置的数据源类型:

  • 基本数据源(Basic sources): Sources可以在StreamingContext中直接获取到,例如:文件系统,socket连接.
  • 高级数据源(Advanced sources): 像kafka,flume,kinesis这种通过外置的特性类可以获取到。

我们将要讨论一些在每个数据源分类中中的一些数据源

如果你想要并行接受多个数据流在你的Streaming应用中,你可以创建多个input DSTream,这将创建多个Receivers,其将同时接受多个数据流。但是切记,Spark worker、executor是一个长时间运行的任务,因此它占据着分配个SparkStreaming应用的几个核心中的一个。因为有个重要点就是Spark Streaming应用需要被分配足够的CPU内核数(后者线程如果本地运行)来处理接受的数据,receivers也是如此。

注意的点

  • 当运行一个本地SparkStreaming程序,不要用“local” 或者“local[1]” 作为master的URL,这意味着只有一个线程能被用来本地运行任务。如果你要用一个基于receiver的input DStream例如:(sockets,kafka,flume等等),那么一个独立的线程将会被用来运行receiver,没有多余的线程用来处理接受到的数据,因此,当本地运行Streaming程序的时候,应总是用“local[n]” 作为master url,并且n>receivers的数量,.

  • 将逻辑扩展到在集群上运行,分配给Spark流应用程序的内核数量必须大于接收器数量。否则系统将接收数据,但无法处理它。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值