Spark Streaming简介与代码实例

这篇具有很好参考价值的文章主要介绍了Spark Streaming简介与代码实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

Spark Streaming是准实时流处理框架,处理响应时间一般以分钟为单位,处理实时数据的延迟时间一般是秒级别的;其他容易混淆的例如Storm实时流处理框架,处理响应是毫秒级。

在我们项目实施选择流框架时需要看具体业务场景:使用MapReduce和Spark进行大数据处理,能够解决很多生产环境下的计算问题,但是随着业务逐渐丰富,数据逐渐丰富,这种批处理在很多场景已经不能满足生产环境的需要了,体现例如①离线计算一般就会建立一个数据仓库,数据量大的情况下,计算耗时也会很长。②例如一个业务场景,需要在根绝客户访问一个网站时的浏览、点击行为,实时做出一些业务上的反馈,时延太长这个数据也流失了很多价值。③现在技术发展的需要,许多机器学习和人工智能应用需要大量的实时数据进行训练和优化。

数据是源源不断产生,计算程序也是一直存在的,即实时计算。

1.流式计算和批处理的关系

批处理和流式本来就存在某种微妙的关系,不是完全隔离的。Spark Streaming充分利用了这种微妙关系,将其发挥到极致。批量处理是Spark Streaming流式处理的一个窗口特别大的特例,实际上,如果我们定时执行某个Spark程序,或者每天执行一次,也相当于是流失计算,不过是以天为事件窗口。但是如果细加观察,Spark Streaming的每个batch又都是一个批处理,只是因为这个批处理可以足够小,看起来就像数据在真实流动一样,所以我们也称之为流式处理。

2.主流的流式计算框架

流式计算最具代表性的框架之一就是Storm。在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology)。这个拓扑将会被提交给集群,由集群中的主控节点(Master node)分发代码,将任务分配给工作节点(Worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。

Spark Streaming是核心Spark API的一个扩展,它并不会像Storm那样一次一个地处理数据流,而是在处理前按时间间隔预先将其切分为一段一段的批处理作业。Spark针对持续性数据流的抽象称为DStream(DiscretizedStream),一个DStream是一个微批处理(micro-batching)的RDD(弹性分布式数据集);RDD则是一种分布式数据集,能够以两种方式并行运作,分别是任意函数和滑动窗口数据的转换。

除了Spark,Flink也是类似Spark的计算框架,Flink是一个针对流数据和批数据的分布式处理引擎。它主要是由Java代码实现。对Flink而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。Flink会把所有任务当成流来处理,这也是其最大的特点。Flink可以支持本地的快速迭代,以及一些环形的迭代任务,并且Flink可以定制化内存管理。在这点,如果要对比Flink和Spark的话,Flink并没有将内存完全交给应用层。这也是为什么Spark相对于Flink,更容易出现OOM的原因(out ofmemory)。就框架本身与应用场景来说,Flink更相似与Storm。

3.自定义流式计算举例

为了更好理解流式计算思想,我们来举例一个更具体的流式计算的程序。常见的实时计算需要有数据源、消息队列、数据处理。我们的数据源来自Socket,消息队列为了保证线程安全,我们使用Java自带的BlockingQueue,而数据处理就通过一个独立线程读取消息队列的内容处理,结果我们放在ConcurrentHashMap中,保证线程安全。

Spark Streaming的基本原理是将输入数据流以时间片(秒级)为单位进行拆分,然后以类似批处理的方式处理每个时间片数据,见下图:

Spark Streaming简介与代码实例,大数据知识,大数据,Spark Streaming

首先,Spark Streaming把实时输入数据流以时间片Δt(如1秒)为单位切分成块。Spark Streaming会把每块数据作为一个RDD,并使用RDD操作处理每一小块数据。每个块都会生成一个Spark Job处理,最终结果也返回多个块。使用Spark Streaming编写的程序与编写Spark程序非常相似,在Spark程序中,主要通过操作RDD提供的接口,如Map、Reduce、Filter等,实现数据的批处理。而在Spark Streaming中,则通过操作DStream(表示数据流的RDD序列)提供的接口,这些接口和RDD提供的接口类似。下图显示了Spark Streaming程序到Spark Job的转换:

Spark Streaming简介与代码实例,大数据知识,大数据,Spark Streaming

Spark Streaming把程序中对DStream的操作转换为DStream Graph,对于每个时间片,DSteam Graph都会产生一个RDD Graph;针对每个输出操作(如Print、Foreach等),SparkStreaming都会创建一个Spark Action;对于每个Spark Action,Spark Streaming都会产生一个相应的Spark Job,Spark会调度Task到相应的Spark Executor上执行。

Spark Streaming的一些常用组件如下:

1.StreamingContext:Spark Streaming中Driver端的上下文对象,初始化的时候会构造Spark Streaming应用程序需要使用的组件,比如DStreamGraph、JobScheduler 等

2.JobGenerator:主要是从DStream产生Job,且根据指定时间执行checkpoint。它维护着一个定时器,该定时器在批处理时间到来的时候会生成作业的操作。

3.JobScheduler:主要用于调度Job。JobScheduler主要通过JobGenerator产生Job,并且通过ReceiverTracker管理流数据接收器Receiver。

4.ReceiverTracker:管理各个Executor上的Receiver的元数据。它在启动的时候,需要根据流数据接收器Receiver分发策略通知对应的Executor中的ReceiverSupervisor(接收器管理着)启动,然后再由ReceiverSupervisor来启动对应节点的Receiver。

数据源:

数据源程序,使用Java编写一个程序,使用socket来向7777端口发送数据:

Package test;

import java.io.Bufferedwriter;

import java.io.IOException;

import java.io.Outputstream;

import java.net.ServerSocket;

import java.net.socket;

import java.io.Outputstreamwriter;



public class DataGenerator{

         public static void main(string[] args) throws IOException{

                  //设置发送端口为7777

                  ServerSocket ss = new ServerSocket(7777);

                  Socket accept = ss.accept();

                  Outputstream outputstream = accept.getoutputstream();

                  Bufferedwriter writer = new Bufferedwriter(new Outputstreamhriter(outputstream));

                  //发送的字符串

                  String[] words = new String[]{"hello Hadoop\n", "hello spark\n", "world hello\n", "hello\n", "hadoop\n"};

                  while (true){

                          try{

                                   Thread.sleep(1000);

                          }catch (InterruptedException e){

                         

                          }

                          //随机发送一个字符串

                          writer.write(words[(int)(Math.random() * 5)]);

                          writer.flush();

                  }

         }

}

数据接收处理:

import org.apache.spark.streaming.streamingContext

import org.apache.spark.streaming.streamingContext

import org.apache.spark.streaming.dstream.Dstream

import org.apache.spark.streaming.Duration

import org.apache.spark.streaming.seconds

import org.apache.spark.SparkContext

import org.apache.spark.SparkConf

import org.apache.spark. storage.storageLevel



val sparkconf = new SparkConf().setApplame("NetworkWordCount").setMaster("localhost")

//设置每秒处理一次

val ssc = new streamingContext(sc, Seconds(1))

//使用socket发送数据,ip为localhost,端门为7777

val lines =ssc.socketTextstream("localhost",7777,StorageLevel.MEMORY_AND_DISK_SER)

//flatMap以空格分隔

val words = lines.flatmap(_.split(" "))

//对每一组数据各个字符串数量累加

val wordCounts = words.map(x => (x,1)).reduceBykey(_+_)

//对每一组数据各个字符串数量累加,每10秒一次,统计最近30秒的结果

val wordCounts = words.map(x => (x,1)).reduceByKeyAndWindow((a:Int,b:Int) => (a+b),Seconds(30),Seconds(10))

//输出



wordCounts.print()

ssc.start()

ssc.awaitTermination()

运行数据源:

把刚刚的Java程序打包,用spark-submit执行,我们将打包好的程序放到某一个目录,例如/opt下,命名为hadoop-streaming.jar,使用spark-submit提交(命令制定类名、主机名、UI端口号、Jar包路径):

nohup .../你的路径/bin/spark-submit –class test.DataGenerator –master spark://localhost:9000 /opt/Hadoop-streaming.jar &

运行数据接收、处理程序:

进入spark-shell来运行上面写好的“数据接收处理”的代码,可收到结果。

Spark Streaming简介与代码实例,大数据知识,大数据,Spark Streaming文章来源地址https://www.toymoban.com/news/detail-779077.html

到了这里,关于Spark Streaming简介与代码实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark Streaming + Kafka构建实时数据流

    1. 使用Apache Kafka构建实时数据流 参考文档链接:https://cloud.tencent.com/developer/article/1814030 2. 数据见UserBehavior.csv 数据解释:本次实战用到的数据集是CSV文件,里面是一百零四万条淘宝用户行为数据,该数据来源是阿里云天池公开数据集 根据这一csv文档运用Kafka模拟实时数据流,

    2024年02月12日
    浏览(33)
  • 实时大数据流处理技术:Spark Streaming与Flink的深度对比

    引言 在当前的大数据时代,企业和组织越来越多地依赖于实时数据流处理技术来洞察和响应业务事件。实时数据流处理不仅能够加快数据分析的速度,还能提高决策的效率和准确性。Apache Spark Streaming和Apache Flink是目前两个主要的实时数据流处理框架,它们各自拥有独特的特

    2024年03月10日
    浏览(49)
  • Kafka传输数据到Spark Streaming通过编写程序java、scala程序实现操作

    现有一电商网站数据文件,名为buyer_favorite1,记录了用户对商品的收藏数据,数据以“t”键分割,数据内容及数据格式如下: 项目环境说明 开启hadoop集群,zookeeper服务,开启kafka服务。再另开启一个窗口,在/apps/kafka/bin目录下创建一个topic。 1、新创一个文件folder命名为li

    2024年02月13日
    浏览(46)
  • 在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算

    引言: 在当今大数据时代,实时数据处理和流式计算变得越来越重要。Apache Spark作为一个强大的大数据处理框架,提供了Spark Streaming模块,使得实时数据处理变得更加简单和高效。本文将深入浅出地介绍如何在Spring Boot中使用Spark Streaming进行实时数据处理和流式计算,并提供

    2024年03月27日
    浏览(35)
  • 大数据流处理与实时分析:Spark Streaming和Flink Stream SQL的对比与选择

    作者:禅与计算机程序设计艺术

    2024年02月07日
    浏览(35)
  • spark介绍之spark streaming

    Spark Streaming类似于Apache Storm,用于流式数据的处理。根据其官方文档介绍,Spark Streaming有高吞吐量和容错能力强等特点。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如:map、reduce、join、w

    2024年02月02日
    浏览(28)
  • Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

    目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch 方式输出数据 3.3. console sink 3.4. memory sink 3.5. fo

    2024年02月13日
    浏览(30)
  • Spark编程实验四:Spark Streaming编程

    目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四、结果分析与实验

    2024年02月03日
    浏览(29)
  • 什么是API网关,解释API网关的作用和特点?解释什么是数据流处理,如Apache Flink和Spark Streaming的应用?

    API网关是一种在分布式系统中的组件,用于管理不同系统之间的通信和交互。API网关的作用是在不同系统之间提供统一的接口和协议,从而简化系统之间的集成和互操作性。 API网关的特点包括: 路由和分发请求:API网关可以根据请求的URL、方法、参数等信息,将请求分发到

    2024年02月11日
    浏览(36)
  • Spark面试整理-解释Spark Streaming是什么

    Spark Streaming是Apache Spark的一个组件,它用于构建可扩展、高吞吐量、容错的实时数据流处理应用。Spark Streaming使得可以使用Spark的简单编程模型来处理实时数据。以下是Spark Streaming的一些主要特点: 1. 微批处理架构 微批处理: Spark Streaming的核心是微批处理模型。它将实

    2024年04月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包