本文共 2042 字,大约阅读时间需要 6 分钟。
SparkStreaming概念
Spark Streaming类似于Storm,用于流式数据的处理,具有高吞吐,高容错,离散化特点
Spark Streaming使用离散化流(discretized stream)作为抽象表示,叫作DStream,单位时间区间收到的数据作为RDD存在,DStream是由这些 RDD 所组成的序列(离散化)
运行Spark Streaming
IDEA编写程序
Pom.xml 加入以下依赖:
org.apache.spark spark-sql_2.11 2.4.4 provided org.apache.spark spark-streaming_2.11 2.4.4 import org.apache.spark.SparkConfimport org.apache.spark.streaming.{Seconds, StreamingContext} object demo{ def main(args: Array[String]): Unit = { //注意运输模式为local的时候必须至少设置2个core, local[2] val conf = new SparkConf().setMaster("local[2]").setAppName("Network") //设置抓取时间间隔 val ssc = new StreamingContext(conf, Seconds(5)) //设置通信流的IP地址,及端口号 // Create a DStream that will connect to hostname:port, like localhost:9999 val lines = ssc.socketTextStream("hadoop2", 9999) lines.print() //堵塞,让其等待信息输入 //通过 streamingContext.start()来启动消息采集和处理 ssc.start() //等待程序终止,通过streamingContext.awaitTermination()设置 ssc.awaitTermination() //通过streamingContext.stop()可手动终止处理程序 }}在hadoop主机上安装 yum install nc
执行命令nc -lk 9999
输入一些字段,查看idea控制台打印变化
import org.apache.log4j.{Level, Logger}Logger.getLogger("org.apache.spark").setLevel(Level.WARN)修改日志级别WARN
架构
Spark Streaming接收器从输入源中读取数据,把数据分组为小的批次。并按单位时间创建出来RDD,处理的结果以批处理的方式传给外部系统
接收器从输入流收集数据并保存为 RDD,且把数据复制到另一个执行器进程,高容错(默认行为)。数据保存在执行器进程的内存中,和缓存 RDD 的方式一样。驱动器程序中的 StreamingContext 周期运行 Spark 作业来处理这些数据,把数据与之前时间区间中的 RDD 进行整合
DStreams输入
1、Receiver方式
【流程】
从Kafka通过Receiver接收的数据存储在Spark Executor的内存中,然后由Spark Streaming启动的job来处理数据
【解决数据丢失】
解决零数据丢失,启用Spark Streaming预写日志机制,它会同步地将接收到的Kafka数据保存到HDFS的预写日志中,以便节点在故障时恢复
【特点】
Receiver单点读数据,宕机,程序不能运行
为保证零数据丢失,数据会保存两份,冗余
数据存储在executor内存中,增大内存压力,消费不及时,造成数据冗余
2、Direct方式
周期从Kafka的Topic的partition中获取的最新偏移量,及批处理偏移范围,处理数据作业时,利用偏移范围 ,消费者API从Kafka读取数据
【特点】
1、简化并行:RDD的分区数量=Topic的分区数量
2、高效:数据存储于kafka中,没有数据冗余
3、精确:使用简单API,Offsets则利用Spark Streaming的checkpoints进行记录,消除不一致性
转载地址:http://nvazi.baihongyu.com/