大数据学习15之spark streaming入门

文章目录

  • 一、概述
  • 二、应用场景
  • 三、集成Spark生态系统的使用
  • 四、发展史
  • 五、从词频统计功能着手入门
    • 1.spark-submit执行
    • 2.spark-shell执行(测试时使用)
  • 六、工作原理

一、概述

spark官网Documentation->Latest Release->Programming Guides->Spark Streaming

Spark 流是核心 Spark API 的扩展,可实现对实时数据流的可缩放、高吞吐量、容错流处理。可以从许多源(如Kafka、Kinesis 或 TCP 套接字)引入数据,并且可以使用使用高级函数(如mapreduce 、join 和 window)表示的复杂算法进行处理。最后,处理后的数据可以推送到文件系统、数据库和实时仪表板。事实上,您可以将Spark的机器学习和图形处理算法应用于数据流。

大数据学习15之spark streaming入门_第1张图片

将不同的数据源的数据经过spark streaming处理之后将结果输出到外部文件系统中

特点:低延时,能从错误中高效的恢复(容错),能够运行在成百上千的节点上,能够将批处理、机器学习、图计算等子框架和spark
streaming综合起来使用

spark streaming 不需要单独安装,有了spark就能使
大数据学习15之spark streaming入门_第2张图片

在内部,它的工作方式如下。Spark 流接收实时输入数据流并将数据划分为批次,然后由 Spark 引擎处理这些批处理,以批量生成最终的结果流。
大数据学习15之spark streaming入门_第3张图片

二、应用场景

1.交易中的实时欺诈检测
2.传感器异常实时响应
3.商品推荐
4.外界对防火墙交换机进行攻击的时候,实时监控,针对不同攻击类型实行对应的保护策略
5.运行中的系统产生异常,flume收集日志,spark streaming分类错误,统计分析系统时间点某一部分的功能容易容易出现这样的问题

三、集成Spark生态系统的使用

1.spark stream + spark core
将批处理与流式处理相结合
将数据流与静态数据集联接。从文件系统中读取数据集,将流中的每个批与数据集联接。
大数据学习15之spark streaming入门_第4张图片
2.spark streaming + MLlib
将机器学习与流式处理相结合
在线应用离线学习模型,对流数据进行训练
大数据学习15之spark streaming入门_第5张图片
3.spark sql + spark streaming
将 SQL 与流式处理相结合
使用 sql 以交互方式查询流数据
kafka来的数据流将每个批注册为临时表,,实时流数据使用sql进行查询
大数据学习15之spark streaming入门_第6张图片

四、发展史

大数据学习15之spark streaming入门_第7张图片

五、从词频统计功能着手入门

1.spark-submit执行

github中spark源码example,scala spark streaming,NetworkWordCount.scala
大数据学习15之spark streaming入门_第8张图片

虚拟机中,/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin
./spark-submit 可以查看帮助文档
大数据学习15之spark streaming入门_第9张图片

nc -lk 9999

阻塞了不用管,另起一个窗口
/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars目录,可以看到spark-examples_2.11-2.2.0.jar压缩包,就是上面的github中spark example源码。
使用spark-submit来提交spark提供的example词频统计程序运行脚本如下(生产),需要先打jar包:
在/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin下执行,

./spark-submit --master local[2] \
--class org.apache.spark.examples.streaming.NetworkWordCount \
--name NetworkWordCount \
/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.2.0.jar hadoop000 9999

local后面的数一定要大于1
我在执行这步的时候遇到的错误:

22/01/04 21:48:56 WARN Utils: Service 'sparkDriver' could not bind on a random free port. You may check whether configuring an appropriate binding address.
22/01/04 21:48:56 ERROR SparkContext: Error initializing SparkContext.
java.net.BindException: Cannot assign requested address: Service 'sparkDriver' failed after 16 retries (on a random free port)! Consider explicitly setting the appropriate binding address for the service 'sparkDriver' (for example spark.driver.bindAddress for SparkDriver) to the correct binding address.
	at sun.nio.ch.Net.bind0(Native Method)
	at sun.nio.ch.Net.bind(Net.java:433)
	at sun.nio.ch.Net.bind(Net.java:425)
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
	at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:501)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1218)
	at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:496)
	at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:481)
	at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:965)
	at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:210)
	at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:353)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446)
	at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
	at java.lang.Thread.run(Thread.java:748)

可以看到ip地址不对,切换为root用户,修改/etc/hosts文件

[hadoop@hadoop000 bin]$ hostname
hadoop000
[hadoop@hadoop000 bin]$ cat /etc/hosts
192.168.199.111 hadoop000
192.168.199.111 localhost
[hadoop@hadoop000 bin]$ ifconfig
eth2      Link encap:Ethernet  HWaddr 00:0C:29:F4:52:22  
          inet addr:192.168.10.3  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fef4:5222/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:148 errors:0 dropped:0 overruns:0 frame:0
          TX packets:173 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:18472 (18.0 KiB)  TX bytes:14975 (14.6 KiB)

运行正常,问题解决
大数据学习15之spark streaming入门_第10张图片
nc -lk 9999运行的窗口下输入a a a a b b d
在这里插入图片描述
统计结果:
大数据学习15之spark streaming入门_第11张图片

2.spark-shell执行(测试时使用)

是我们写代码贴上去运行的
在/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin下执行,

./spark-shell --master local[2] 

大数据学习15之spark streaming入门_第12张图片
拷贝如下代码进入控制台

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

val ssc = new StreamingContext(sc, Seconds(1))
val lines = ssc.socketTextStream("hadoop000", 9999)
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()

运行结果:
大数据学习15之spark streaming入门_第13张图片
在nc -lk 9999运行的窗口下输入5555 i o可以看到统计的结果:
大数据学习15之spark streaming入门_第14张图片

六、工作原理

粗粒度: spark streaming接收到实时数据流,把数据按照指定的时间段切成一片片小的数据块,然后把小的数据块传给spark engine处理。
大数据学习15之spark streaming入门_第15张图片

即,进来的实时数据流会按照指定的秒来拆分为多个批次,如上例就是按照1秒为一个批次对流进行拆分,拆分过后交给spark的子引擎进行处理,spark执行过后返回处理后的一段段结果。
细粒度: Driver端会启动很多Spark应用程序运行在Driver端,里面有一个StreamingContext和一个SparkContext,StreamingContext基于底层的SparkContext。Driver会要求Executor端启动一些接收器Receiver当作任务来运行。Receiver运行在Executor中,当输入数据流来了之后,Receiver拉到数据后会将流拆分为一个个块block放在内存中,如果设置了多副本他会将这些块数据复制到其他机器的Executor内存中作为副本,汇报块信息到StreamingContext,每当周期到了,StreamingContext会通知SparkContext,在SparkContext上启动一系列的job作业,将job分发到Executor中运行处理数据块。
大数据学习15之spark streaming入门_第16张图片

(上下文)
Spark SQL:SQLContext/HiveContext
Spark Core:SparkContext
Spark Streaming:StreamingContext

你可能感兴趣的:(大数据,学习笔记,spark,big,data,学习)