Spark Streaming: Spark用于处理流式数据的模块,类似Storm

核心:DStream(离散流),就是一个RDD
============================================
一、Spark Streaming基础
1、什么是Spark Streaming?
(*)Spark Streaming makes it easy to build scalable fault-tolerant streaming applications.
(*)常见的流式处理框架
(1)Apache Storm
(2)Spark Streaming
(3)JStorm:阿里巴巴
(4)Flink:可以很好的管理内存

(*)离线计算和流式计算各自的特点
                   典型代表                 数据的采集          数据源(结果)
离线计算: MR、Spark Core         Sqoop                批量操作
流式计算: Storm等等                   Flume(Kafka) 实时性

(*)典型的流式计算的框架:参考Hadoop的课件:P91

2、简介Spark Streaming内部结构

3、演示Demo:NetworkWordCount 处理的是流式数据
(*)工具:netcat
(*)文档:http://spark.apache.org/docs/latest/streaming-programming-guide.html#a-quick-example
(*)步骤:启动两个窗口
第一个窗口中:

bin/run-example streaming.NetworkWordCount bigdata11 9999

第二个窗口中:启动消息服务器(先启动)

nc -l -p 9999

注意:如果要演示成功,保证虚拟机的CPU的核数至少2以上

运行:

4、开发自己的NetworkWordCount程序

 package main.scala.demo

 import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext} /**
* Created by YOGA on 2018/2/27.
*/
object MyNetworkWordCount {
def main(args: Array[String]) {
//核心:通过StreamingContext对象,去创建一个DStream
//DStream从外部接收数据(使用的是Linux上的netcat工具) //创建一个SparkConf对象
//local[2]:相当于有两个工作线程,一个接收一个发送
val sparkconf = new SparkConf()
.setAppName("MyNetworkWordCount")
.setMaster("local[2]") //创建StreamContext,表示每隔三秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3)) //创建DStream,看成一个输入流
  //IP,端口,缓存到硬盘 val lines = ssc.socketTextStream("192.168.153.11",1234,StorageLevel.MEMORY_AND_DISK_SER) //执行WordCount
val words = lines.flatMap(_.split(" ")) //使用transform完成同样的计数,相当于map操作
//val wordPair = words.transform(x=>x.map(x=>(x,1)))
//val wordCount = wordPair.reduceByKey(_+_)
val wordCount = words.map((_,1)).reduceByKey(_+_) /*
* 参数一:执行运算
* 参数二:窗口的大小
* 参数三:创建滑动的距离
*
* 例子:每9秒钟,把过去30秒的数据进行wordcount
* 注意:第二个参数 第三个参数 必须是采样频率的整数倍
* */
//val wordCount = words.map((_,1)).reduceByKeyAndWindow((a:Int,b:Int)=>(a+b),Seconds(30),Seconds(9))
//输出
wordCount.print() //启动StreamingContext
ssc.start() //等待计算完成
ssc.awaitTermination()
} }

二、Spark Streaming进阶

bin/spark-shell --master spark://bigdata11:7077
1、类:StreamingContext(类似:Spark Context、SQLContext)
上下文对象

创建的方式:
(1)通过SparkConf来创建

val sparkconf = new SparkConf().setAppName("MyNetworkWordCount").setMaster("local[2]")

//创建StreamingContext,表示每隔3秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3))

(2)通过SparkContext对象来创建

import org.apache.spark.streaming.{Seconds, StreamingContext}
val ssc = new StreamingContext(sc,Seconds(3))

说明:
(1)setMaster("local[2]")
(2)当创建StreamingContext对象,内部会创建一个SparkContext对象
(3)当StreamingContext开始执行,不能添加新的任务
(4)同一个时刻上,JVM只能有一个活动的StreamingContext

2、DStream(离散流):把连续的数据流,变成不连续的离散流,表现形式就是RDD
简单来说:把连续的变成不连续的

操作:Transformation和Action
 (*)transform(func)
 通过RDD-to-RDD函数作用于源DStream中的各个RDD,可以是任意的RDD操作,从而返回一个新的RDD

改写上面WordCount例子,屏蔽35行

//使用transform完成同样的计数,相当于map操作
33 val wordPair = words.transform(x=>x.map(x=>(x,1)))
34 val wordCount = wordPair.reduceByKey(_+_)

(*)updateStateByKey(func)
可以进行累加操作。方法:设置检查点,定义一个累加功能的函数

 package main.scala.demo

 import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext} /**
* Created by YOGA on 2018/2/28.
*/
object MyTotalNetworkWordCount {
def main(args: Array[String]) {
val sparkconf = new SparkConf()
.setAppName("MyNetworkWordCount")
.setMaster("local[2]") //创建StreamContext,表示每隔三秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3)) //注意:如果累计,在执行计算的时候,需要保持之前的状态信息
//设置检查点
ssc.checkpoint("hdfs://192.168.153.11:9000/spark/checkpoint0228") //创建DStream,看成一个输入流
val lines = ssc.socketTextStream("192.168.153.11",1234,StorageLevel.MEMORY_AND_DISK_SER) //执行WordCount
val words = lines.flatMap(_.split(" ")) //每个单词记一次数
val pairs = words.map((_,1)) //定义一个函数,进行累加
//参数:1、当前的值 2、之前的值
val addFunc = (currentValues:Seq[Int],preValues:Option[Int]) =>{
//得到当前的值
val currentCount = currentValues.sum //先得到之前的值
val preCount = preValues.getOrElse(0) //返回累加结果
Some(currentCount + preCount)
} //统计每个单词出现的频率:累计
val totalCount = pairs.updateStateByKey(addFunc)
totalCount.print() //启动任务
ssc.start()
ssc.awaitTermination() }
}

3、窗口操作

例子:每9秒钟,把过去30秒的数据进行WordCount
注释上面的代码35行,放开下面一行代码

/*
38 * 参数一:执行运算
39 * 参数二:窗口的大小
40 * 参数三:创建滑动的距离
41 *
42 * 例子:每9秒钟,把过去30秒的数据进行wordcount
43 * 注意:第二个参数 第三个参数 必须是采样频率的整数倍,采样频率3s
44 * */
45 val wordCount = words.map((_,1)).reduceByKeyAndWindow((a:Int,b:Int)=>(a+b),Seconds(30),Seconds(9))

4、输入和输出
(1)输入:接收器接收外部数据源的数据
(*)基本数据源:文件流、RDD队列流、Socket流
(*)高级数据源:Kafka、Flume
文件流:监听一个目录,当目录下的文件发生变化的时候,将变化的数据读入DStream

package main.scala.demo

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext} /**
* Created by YOGA on 2018/2/28.
*/
object MyFileDStream {
def main(args: Array[String]) {
//创建一个SparkConf对象
//local[2]:相当于有两个工作线程,一个接收一个发送
val sparkconf = new SparkConf()
.setAppName("MyNetworkWordCount")
.setMaster("local[2]") //创建StreamContext,表示每隔三秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3)) //监听一个目录,当目录下的文件发生变化的时候,将变化的数据读入DStream
val lines = ssc.textFileStream("D:\\temp\\aaa") lines.print() ssc.start()
ssc.awaitTermination()
}
}

RDD队列流queueStream

:定义一个for循环,生成RDD放入队列

package main.scala.demo

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext} import scala.collection.mutable
import scala.collection.mutable.Queue
import org.apache.spark.rdd.RDD
/**
* Created by YOGA on 2018/2/28.
*/
object MyRDDQueueDStream {
def main(args: Array[String]){
val sparkconf = new SparkConf()
.setAppName("MyNetworkWordCount")
.setMaster("local[2]") //创建StreamContext,表示每隔三秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3)) //创建一个队列,把生成RDD放入队列
val rddQueue = new mutable.Queue[RDD[Int]]()
//初始化
for(i <- 1 to 3){
rddQueue += ssc.sparkContext.makeRDD(1 to 10) //让线程睡几秒
Thread.sleep(3000) } //创建一个RDD的DStream
val inputStream = ssc.queueStream(rddQueue)
//处理:乘以10
val result = inputStream.map(x=> (x,x*10))
result.print() ssc.start()
ssc.awaitTermination()
}
}

运行:

(2)输出操作

5、集成DataFrame和SQL: 使用SparkSQL的方式处理流式数据

把RDD转换成DataFrame,并生成临时表,然后就可以进行SQL查询

先在虚拟机开启1234端口:

[root@test ~]# nc -l -p 1234
hello spark hello hadoop

结果:

 package main.scala.demo

 import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext} /**
* Created by YOGA on 2018/2/28.
*/
object MyNetWorkWordCountBySQL {
def main(args: Array[String]) {
//核心:通过StreamingContext对象,去创建一个DStream
//DStream从外部接收数据(使用的是Linux上的netcat工具) //创建一个SparkConf对象
//local[2]:相当于有两个工作线程,一个接收一个发送
val sparkconf = new SparkConf()
.setAppName("MyNetworkWordCount")
.setMaster("local[2]") //创建StreamContext,表示每隔三秒采集一次数据
val ssc = new StreamingContext(sparkconf,Seconds(3)) //创建DStream,看成一个输入流
val lines = ssc.socketTextStream("192.168.153.11",1234,StorageLevel.MEMORY_AND_DISK_SER) //得到的所有单词
val words = lines.flatMap(_.split(" "))
//val wordPair = words.transform(x=> x.map(x=>(x,1)))
//val wordCount = wordPair.reduceByKey(_+_) //使用sparkSQL处理Spark Streaming的数据
words.foreachRDD(rdd =>{
//使用SparkSession来创建
val spark = SparkSession.builder()
.config(rdd.sparkContext.getConf)
.getOrCreate() //需要把RDD转成一个DataFrame
import spark.implicits._
val wordCountDF = rdd.toDF("word") //注册成一个表
wordCountDF.createOrReplaceTempView("words") //执行SQL
val result = spark.sql("select * from words group by word")
result.show() Thread.sleep(5000)
}) //启动StreamingContext
ssc.start() //等待计算完成
ssc.awaitTermination()
}
}

大数据笔记(三十一)——SparkStreaming详细介绍,开发spark程序的更多相关文章

  1. 大数据笔记(二十八)——执行Spark任务、开发Spark WordCount程序

    一.执行Spark任务: 客户端 1.Spark Submit工具:提交Spark的任务(jar文件) (*)spark提供的用于提交Spark任务工具 (*)example:/root/traini ...

  2. 大数据笔记(三十)——一篇文章读懂SparkSQL

    Spark SQL:类似Hive ======================================================= 一.Spark SQL基础 1.什么是Spark SQ ...

  3. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  4. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  5. 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建

    记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...

  6. 大数据笔记(三十二)——SparkStreaming集成Kafka与Flume

    三.集成:数据源 1.Apache Kafka:一种高吞吐量的分布式发布订阅消息系统 (1) (*)消息的类型 Topic:主题(相当于:广播) Queue:队列(相当于:点对点) (*)常见的消息系 ...

  7. 大数据笔记(一)——Hadoop的起源与背景知识

    一.大数据的5个特征(IBM提出): Volume(大量) Velocity(高速) Variety(多样) Value(价值) Varacity(真实性) 二.OLTP与OLAP 1.OLTP:联机 ...

  8. 大数据学习(18)—— Flume介绍

    老规矩,学习新东西先上官网瞅瞅Apache Flume Flume是什么 Flume是一个分布式.可靠的大规模高效日志收集.汇聚和传输的这么一个服务.它的架构基于流式数据,配置简单灵活.它具备可调节的 ...

  9. 大数据学习(06)——Ozone介绍

    前面几篇文章把Hadoop常用的模块都学习了,剩下一个新模块Ozone,截止到今天最新版本是0.5.0Beta,还没出正式版.好在官方网站有文档,还是中文版的,但是中文版资料没有翻译完整,我试着把它都 ...

  10. 我眼中的大数据(三)——MapReduce

    ​ 这次来聊聊Hadoop中使用广泛的分布式计算方案--MapReduce.MapReduce是一种编程模型,还是一个分布式计算框架. MapReduce作为一种编程模型功能强大,使用简单.运算内容不 ...

随机推荐

  1. POJ - 2421 Constructing Roads(最小生成树&并查集

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  2. Luogu P2612 [ZJOI2012]波浪

    题目 我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值. 在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献.如果\(i\)的某一边是一个比\ ...

  3. Luogu P2839 [国家集训队]middle

    题目 首先我们考虑解决中位数一类问题的常用手段:二分\(mid\),将大于等于它的设为\(1\),小于它的设为\(−1\),判断区间和是否\(\ge0\). 对于询问\(a,b,c,d\),二分完\( ...

  4. scrapy之盗墓笔记三级页面爬取

    #今日目标 **scrapy之盗墓笔记三级页面爬取** 今天要爬取的是盗墓笔记小说,由分析该小说的主要内容在三级页面里,故需要我们 一一解析 *代码实现* daomu.py ``` import sc ...

  5. day 03 int bool str (索引,切片) for 循环

    基础数类型总览 10203 123 3340 int +- * / 等等 '今天吃了没?' str 存储少量的数据,+ *int 切片, 其他操作方法 True False bool 判断真假 [12 ...

  6. VeryNginx详细配置说明

    自定义行为 ( Custom Action ) 匹配器 (Matcher) 匹配器 VeryNginx 会收到各种各样的Http请求,当我们定义一条规则(Action)的时候,我们可能会需要限定,这条 ...

  7. 一分钟理解sku和spu

    SPU SPU = Standard Product Unit (标准化产品单位) SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.通俗点讲,属性值 ...

  8. node.js使用express模块创建web服务器应用

    1.安装express模块 在命令行输入 npm install body-parser --save npm install express --save 2.创建app.js文件 /*应用程序入口 ...

  9. AQtime使用

    今天刚到网上下了AQtime.因为有个通信及数据存储的程序出现的内存泄漏.在用户的环境里出现了两次,在测试的环境里一次也没有出现,开发人员猜测是一部分代码引起的.说要代码的覆盖测试.看看测试环境里有那 ...

  10. kali下纯文本与窗口环境切换

    切到纯文本环境,想返回 试了半天ctrl+alt+f7不行,  最后我想试试ctrl+alt+f8竟然成了: 而且那是之前以root账户登录图像界面时切换回去是f8,普通用户是f9 ,为何如此,我还不 ...