Spark Streaming

本文介绍SparkStreaming,一种高吞吐、容错的实时流数据处理框架,支持多种数据源,如Kafka、Twitter等,通过批处理机制处理实时流数据,提供丰富的DStream操作,包括普通转换、窗口转换和输出操作。

1、Spark Streaming是一个流处理框架。可以实现高吞吐的、具备容错机制的实时流数据的处理。支持从多种数据源获取数据,包括Kafk,Flume,Twitter,ZeroMQ,Kinesis,以及TCP sockets,从数据源获取数据之后,可以使用函数(map、reduce、join和window等)进行复杂算法的处理,最后还可以将处理的结果存储到文件系统中(HDFS)
2、Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处理这些批数据,最终得到处理后的一批批结果数据。
3、对应的批数据,在Spark内核对应一个RDD实例,因此对应流数据的DStream可以看成是一组RDDs,即RDD的一个序列。

以Spark Streaming官方提供的WordCount代码为例:

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

object WordCount {
  def main(args: Array[String]): Unit = {
    //local[2] 表示在本地启动两个工作线程
    val conf = new SparkConf().setMaster("local[2]").setAppName("WordCount")
    //Seconds(2)  将每两秒收集的数据当成一批
    val ssc = new StreamingContext(conf,Seconds(2))
    //要接收流数据的地址和端口号,以及设置内存+磁盘,序列化
    val lines = ssc.socketTextStream("192.168.119.136",9999,StorageLevel.MEMORY_AND_DISK_SER)
    //对数据进行处理,求出每个单词的count
    val rel = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
    //在控制台打印
    rel.print()
    //之前的步骤只是创建了流程,程序并没有真正连上数据源,当ssc.start()启动后程序才真正进行所有预期操作
    ssc.start()
    //调用awaitTermination(),driver将阻塞在这里,直到流式应用意外退出
    ssc.awaitTermination()
  }
}

-启动后,在服务器中(192.168.119.136)开始传送数据
#nc  -l  9999

Spark Streaming DStream
DStream(Discretized Stream)作为Spark Streaming的基础抽象,DStream由一组时间序列上连续的RDD来表示。每个RDD都包含自己特定时间间隔内的数据流。
DStream的操作
与RDD类似,DStream也提供了自己的一系列操作方法,这些操作可以分成三类:普通的转换操作、窗口转换操作和输出操作

1、普通的转换操作
map、flatMap、filter、union、reduce、reduceByKey、join、cogroup
repartition(numPartitions:Int) :通过输入的参数numPartitions的值来改变DStream的分区大小
count() :对源DStream内部的所含有的RDD元素数量进行计数,返回一个内部的RDD只包含一个元素的DStream
countByValue():计算DSStream中每个RDD内的元素出现的频次并返回新的DStream[(K,Long)],其中K是RDD中元素的类型,Long是元素出现的频次
transform(func) :通过对源DStrem的每个RDD应用RDD-to-RDD函数,返回一个新的DStream,这可以用来在DStream做任意RDD操作
updateStateByKey(func):返回一个新状态的DStream,其中每个键的状态是根据前一个状态和键的新值应用给定函数func后的更新。这个方法可以被用来维持每个键的任何状态数据。

2、窗口转换操作
window(windowLength,slideInterval):返回一个基于源DStream的窗口批次计算后得到的新的DStream。
countByWindow(windowLength,slideInterval):返回基于滑动窗口的DStream中的元素的数量
reduceWindow(func,windowLength,slideInterval):基于滑动窗口对源DStream中的元素进行聚合操作,得到一个新的DStream
reduceByKeyAndWindow(func,windowLength,slideInterval, [numTasks]):基于滑动窗口对(K,V)键值对类型的DStream中的值按K使用聚合函数func进行聚合操作,得到一个新的DStream
countByValueAndWindow(windowLength,slideInterval, [numTasks]):基于滑动窗口计算源DStream中每个RDD内每个元素出现的频次并返回DStream[(K,Long)],其中K是RDD中元素的类型,Long是元素频次。与countByValue一样,reduce任务的数量可以通过一个可选参数进行配置。

3、输出操作
print():在Driver中打印出DStream中的前10个元素
saveAsTtextFiles(prefix,[suffix]):将DStream中的内容以文本的形式保存为文本文件,其中每次批处理间隔内产生的文件以prefix-TIME_IN_MS[.suffix]的方式命名
saveAsObjectFiles(prefix,[suffix]):将DStream中的内容按对象序列化并且以SequenceFile的格式保存。其中每次批处理间隔内产生的文件以prefix-TIME_IN_MS[.suffix]的方式命名
saveAsHadoopFiles(prefix, [suffix]):将DStream中的内容以文本的形式保存为Hadoop文件,其中每次批处理间隔内产生的文件以prefix-TIME_IN_MS[.suffix]的方式命名
foreachRDD(func):最基本的输出操作,将func函数应用于DStream中的RDD上,这个操作会输出数据到外部系统,比如保存RDD到文件或者网络数据库等。需要注意的是func函数是在运行该streaming应用的Driver进程里执行的

案例:

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

object DStreamTest {
  def main(args: Array[String]): Unit = {
    //local[2] 表示在本地启动两个工作线程
    val conf = new SparkConf().setMaster("local[2]").setAppName("DStreamTest")
    //Seconds(3)  将每两秒收集的数据当成一批
    val ssc = new StreamingContext(conf,Seconds(3))
    //要接收流数据的地址和端口号,以及设置内存+磁盘,序列化
    val lines = ssc.socketTextStream(args(0),args(1).toInt,StorageLevel.MEMORY_AND_DISK_SER)
    //输出日志文件
    ssc.checkpoint(args(2))
    //对数据进行处理,求出每个单词的count
    val rel = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
    //输出信息保存路径
    rel.saveAsTextFiles(args(3))
    //在控制台打印
    rel.print()
    //之前的步骤只是创建了流程,程序并没有真正连上数据源,当ssc.start()启动后程序才真正进行所有预期操作
    ssc.start()
    //调用awaitTermination(),driver将阻塞在这里,直到流式应用意外退出
    ssc.awaitTermination()
  }
}

从IDEA上打成jar包放在服务器上运行
File->Project Structuer->Artifacts-> + ->Jar->Empty->-设置jar包名称->双击SparkTest(项目名)将其移至左侧->Apply->在Main Class:设置主类->OK
其次Build->Build Artcfacts->rebuild

在这里插入图片描述
在项目目录找到jar包,导入服务器

//创建目录
# mkdir -p test/data test/check
//在一台服务器中运行
# spark-submit test.jar 0.0.0.0 9999 file:///root/test/check/ file:///root/test/data/
//另开一个窗口来输出信息
# nc -l 0.0.0.0 9999
//如果要取消运行
#ps ef | grep 9999    根据端口号找到该进程
#kill -9  进程号
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值