spark官网Documentation->Latest Release->Programming Guides->Spark Streaming
Spark 流是核心 Spark API 的扩展,可实现对实时数据流的可缩放、高吞吐量、容错流处理。可以从许多源(如Kafka、Kinesis 或 TCP 套接字)引入数据,并且可以使用使用高级函数(如mapreduce 、join 和 window)表示的复杂算法进行处理。最后,处理后的数据可以推送到文件系统、数据库和实时仪表板。事实上,您可以将Spark的机器学习和图形处理算法应用于数据流。
将不同的数据源的数据经过spark streaming处理之后将结果输出到外部文件系统中
特点:低延时,能从错误中高效的恢复(容错),能够运行在成百上千的节点上,能够将批处理、机器学习、图计算等子框架和spark
streaming综合起来使用
spark streaming 不需要单独安装,有了spark就能使
在内部,它的工作方式如下。Spark 流接收实时输入数据流并将数据划分为批次,然后由 Spark 引擎处理这些批处理,以批量生成最终的结果流。
1.交易中的实时欺诈检测
2.传感器异常实时响应
3.商品推荐
4.外界对防火墙交换机进行攻击的时候,实时监控,针对不同攻击类型实行对应的保护策略
5.运行中的系统产生异常,flume收集日志,spark streaming分类错误,统计分析系统时间点某一部分的功能容易容易出现这样的问题
1.spark stream + spark core
将批处理与流式处理相结合
将数据流与静态数据集联接。从文件系统中读取数据集,将流中的每个批与数据集联接。
2.spark streaming + MLlib
将机器学习与流式处理相结合
在线应用离线学习模型,对流数据进行训练
3.spark sql + spark streaming
将 SQL 与流式处理相结合
使用 sql 以交互方式查询流数据
kafka来的数据流将每个批注册为临时表,,实时流数据使用sql进行查询
github中spark源码example,scala spark streaming,NetworkWordCount.scala
虚拟机中,/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin
./spark-submit 可以查看帮助文档
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)
运行正常,问题解决
nc -lk 9999运行的窗口下输入a a a a b b d
统计结果:
是我们写代码贴上去运行的
在/home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin下执行,
./spark-shell --master local[2]
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()
运行结果:
在nc -lk 9999运行的窗口下输入5555 i o可以看到统计的结果:
粗粒度: spark streaming接收到实时数据流,把数据按照指定的时间段切成一片片小的数据块,然后把小的数据块传给spark engine处理。
即,进来的实时数据流会按照指定的秒来拆分为多个批次,如上例就是按照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中运行处理数据块。
(上下文)
Spark SQL:SQLContext/HiveContext
Spark Core:SparkContext
Spark Streaming:StreamingContext