spark kafka stream 示例
这篇文章描述了 如何搭建kafka、zk和spark集群环境
本篇文章先简要的举个demo来说明下代码实现过程
-
源码
https://gitee.com/pingfanrenbiji/spark-scala-examples/blob/master/src/main/scala/com/sparkbyexamples/spark/kafka/WriteDataFrameToKafka.scala
通过spark往kafka写入数据
通过spark读取kafka数据
-
源码
https://gitee.com/pingfanrenbiji/spark-scala-examples/blob/master/src/main/scala/com/sparkbyexamples/spark/kafka/ReadDataFromKafka.scala
Flink
1、分布式、高性能、随时可用以及准确的流处理应用程序开源处理框架
2、分布式处理引擎 用于对无界或有界数据流进行有状态的计算
3、在所有常见的集群环境中运行 以内存执行速度和任务规模来执行计算
为什么选择Flink
-
流数据真实的反映了我们的生活方式
-
传统的数据架构是基于有限数据集的
-
目标
-
低延迟
-
高吞吐
-
结果的准确性和良好的容错性
-
哪些行业需要处理流数据
-
电商和市场营销
-
数据报表、广告投放、业务流程需要
-
-
物联网
-
传感器实时数据的采集和显示、实时报警、交通运输业
-
-
电信行
-
基站流量调配
-
-
银行和金融业
-
实时结算和通知推送 实时检测异常行为
-
传统的处理架构
-
事务处理
-
分析处理
-
将数据从业务数据库复制到数仓 再进行分析和查询
-
-
有状态的流式处理
-
流处理的演变
Flink特点
-
事件驱动型(Event-driven)
事件驱动型应用是一类具有状态的应用 他从一个或多个事件流提取数据
并根据到来的事件触发计算、状态更新或其他的外部动作
以kafka为代表的消息队列几乎都是事件驱动型应用
-
基于流的世界观
flink的世界观中一切都是由流组成的
离线数据是有界限的流即有界流
实时数据是没有界限的流即无界流
无界数据流:
有一个开始但没有结束 不会在生成时终止并提供数据
必须连续处理无界流即必须在获取后立即处理
对于无界流无法等待所有数据都到达
因为输入是无界的 并且在任何时间点都不会完成
处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取event
以便能够推断结果完整性
有界数据流:
有明确的开始和结束
可以在执行任何计算之前通过获取所有数据来处理有界流
处理有界流不需要有序获取
因为可以始终对有界数据集进行排序
有界流的处理也被成为批处理
分层API
-
越顶层越抽象 表达含义越简明 使用越方便
-
越底层越具体 表达能力越丰富 使用越灵活
flink其他特点
-
支持事件时间(event-time)和处理时间(processing-time)
-
状态一致性
-
低延迟 每秒处理数百万 毫秒级延迟
-
众多常用存储系统连接
-
高可用 动态扩展
Flink和Spark Streaming比较
-
流(stream)和微批(micro-batching)
-
流处理
无界、实时 无需针对整个数据集执行操作 而是对通过系统传输的每个数据项执行操作 一般用于实时统计
-
批处理
有界、持久、大量 非常适合访问全套记录才能完成计算工作 一般用于离线统计
-
-
数据模型
-
spark采用RDD模型 spark streaming的Dstream实际上也就是一组组小批数据RDD的集合 在spark的数据观 一切都是由批次组成 离线数据是一个大批次 而实时数据是由一个一个无限的小批次组成
-
flink基本数据模型是数据流以及事件(event)序列
-
-
运行时架构
-
spark是批计算 将DAG划分为不同的stage 一个完成后才能计算下一个
-
flink是标准的流执行模式 一个事件在一个节点处理完之后可以直接发往下一个节点进行处理
-
批处理wordcount
-
源码
https://gitee.com/pingfanrenbiji/Flink-UserBehaviorAnalysis/blob/master/FlinkTutorial/src/main/scala/com/xdl/wc/WordCount.scala
流处理wordcount
开启一个指定端口的监听
nc -lk 7777
-l 开启 监听模式,用于指定nc将处于监听模式。通常 这样代表着为一个 服务等待客户端来链接指定的端口。
-p<通信端口> 设置本地主机使用的通信端口。有可能会关闭
-k<通信端口>强制 nc 待命链接.当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。
代码分析
-
源码分析
https://gitee.com/pingfanrenbiji/Flink-UserBehaviorAnalysis/blob/master/FlinkTutorial/src/main/scala/com/xdl/wc/StreamWordCount.scala
JdbcSink 示例
-
源码
https://gitee.com/pingfanrenbiji/Flink-UserBehaviorAnalysis/blob/master/FlinkTutorial/src/main/scala/com/xdl/apitest/sinktest/JdbcSinkTest.scala
数据存储可以是Mysql、Redis、Kafka、Redis
Scala Function示例
-
源码
https://gitee.com/pingfanrenbiji/Flink-UserBehaviorAnalysis/blob/master/FlinkTutorial/src/main/scala/com/xdl/apitest/tabletest/udftest/ScalarFunctionTest.scala
结语
下篇文章介绍下flink环境搭建过程