1、flume整合sparkStreaming问题
(1)、如何实现sparkStreaming读取flume中的数据
可以这样说:
前期经过技术调研,查看官网相关资料,发现sparkStreaming整合flume有2种模式,一种是拉模式,一种是推模式,然后在简单的聊聊这2种模式的特点,以及如何部署实现,需要做哪些事情,最后对比两种模式的特点,选择那种模式更好。
推模式:Flume将数据Push推给Spark Streaming
拉模式:Spark Streaming从flume 中Poll拉取数据
(2)、在实际开发的时候是如何保证数据不丢失的
可以这样说:
flume那边采用的channel是将数据落地到磁盘中,保证数据源端安全性(可以在补充一下,flume在这里的channel可以设置为memory内存中,提高数据接收处理的效率,但是由于数据在内存中,安全机制保证不了,故选择channel为磁盘存储。整个流程运行有一点的延迟性)
sparkStreaming通过拉模式整合的时候,使用了FlumeUtils这样一个类,该类是需要依赖一个额外的jar包(spark-streaming-flume_2.10)
要想保证数据不丢失,数据的准确性,可以在构建StreamingConext的时候,利用StreamingContext.getOrCreate(checkpoint, creatingFunc: () => StreamingContext)来创建一个StreamingContext,使用StreamingContext.getOrCreate来创建StreamingContext对象,传入的第一个参数是checkpoint的存放目录,第二参数是生成StreamingContext对象的用户自定义函数。如果checkpoint的存放目录存在,则从这个目录中生成StreamingContext对象;如果不存在,才会调用第二个函数来生成新的StreamingContext对象。在creatingFunc函数中,除了生成一个新的StreamingContext操作,还需要完成各种操作,然后调用ssc.checkpoint(checkpointDirectory)来初始化checkpoint功能,最后再返回StreamingContext对象。
这样,在StreamingContext.getOrCreate之后,就可以直接调用start()函数来启动(或者是从中断点继续运行)流式应用了。如果有其他在启动或继续运行都要做的工作,可以在start()调用前执行。
流失计算中使用checkpoint的作用:
保存元数据,包括流式应用的配置、流式没崩溃之前定义的各种操作、未完成所有操作的batch。元数据被存储到容忍失败的存储系统上,如HDFS。这种ckeckpoint主要针对driver失败后的修复。
保存流式数据,也是存储到容忍失败的存储系统上,如HDFS。这种ckeckpoint主要针对window operation、有状态的操作。无论是driver失败了,还是worker失败了,这种checkpoint都够快速恢复,而不需要将很长的历史数据都重新计算一遍(以便得到当前的状态)。
设置流式数据checkpoint的周期
对于一个需要做checkpoint的DStream结构,可以通过调用DStream.checkpoint(checkpointInterval)来设置ckeckpoint的周期,经验上一般将这个checkpoint周期设置成batch周期的5至10倍。
使用write ahead logs功能
这是一个可选功能,建议加上。这个功能将使得输入数据写入之前配置的checkpoint目录。这样有状态的数据可以从上一个checkpoint开始计算。开启的方法是把spark.streaming.receiver.writeAheadLogs.enable这个property设置为true。另外,由于输入RDD的默认StorageLevel是MEMORY_AND_DISK_2,即数据会在两台worker上做replication。实际上,Spark Streaming模式下,任何从网络输入数据的Receiver(如kafka、flume、socket)都会在两台机器上做数据备份。如果开启了write ahead logs的功能,建议把StorageLevel改成MEMORY_AND_DISK_SER。修改的方法是,在创建RDD时由参数传入。
使用以上的checkpoint机制,确实可以保证数据0丢失。但是一个前提条件是,数据发送端必须要有缓存功能,这样才能保证在spark应用重启期间,数据发送端不会因为spark streaming服务不可用而把数据丢弃。而flume具备这种特性,同样kafka也具备。
(3)Spark Streaming的数据可靠性
有了checkpoint机制、write ahead log机制、Receiver缓存机器、可靠的Receiver(即数据接收并备份成功后会发送ack),可以保证无论是worker失效还是driver失效,都是数据0丢失。原因是:如果没有Receiver服务的worker失效了,RDD数据可以依赖血统来重新计算;如果Receiver所在worker失败了,由于Reciever是可靠的,并有write ahead log机制,则收到的数据可以保证不丢;如果driver失败了,可以从checkpoint中恢复数据重新构建。
2、kafka整合sparkStreaming问题
(1)、如何实现sparkStreaming读取kafka中的数据
可以这样说:在kafka0.10版本之前有二种方式与sparkStreaming整合,一种是基于receiver,一种是direct,然后分别阐述这2种方式分别是什么
receiver:是采用了kafka高级api,利用receiver接收器来接受kafka topic中的数据,从kafka接收来的数据会存储在spark的executor中,之后spark streaming提交的job会处理这些数据,kafka中topic的偏移量是保存在zk中的。
基本使用: val kafkaStream = KafkaUtils.createStream(streamingContext,
[ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])
还有几个需要注意的点:
在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度.
对于不同的Group和topic我们可以使用多个Receiver创建不同的Dstream来并行接收数据,之后可以利用union来统一成一个Dstream。
在默认配置下,这种方式可能会因为底层的失败而丢失数据. 因为receiver一直在接收数据,在其已经通知zookeeper数据接收完成但是还没有处理的时候,executor突然挂掉(或是driver挂掉通知executor关闭),缓存在其中的数据就会丢失. 如果希望做到高可靠, 让数据零丢失,如果我们启用了Write Ahead Logs(spark.streaming.receiver.writeAheadLog.enable=true)该机制会同步地将接收到的Kafka数据写入分布式文件系统(比如HDFS)上的预写日志中. 所以, 即使底层节点出现了失败, 也可以使用预写日志中的数据进行恢复. 复制到文件系统如HDFS,那么storage level需要设置成 StorageLevel.MEMORY_AND_DISK_SER,也就是KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER)
direct:在spark1.3之后,引入了Direct方式。不同于Receiver的方式,Direct方式没有receiver这一层,其会周期性的获取Kafka中每个topic的每个partition中的最新offsets,之后根据设定的maxRatePerPartition来处理每个batch。(设置spark.streaming.kafka.maxRatePerPartition=10000。限制每秒钟从topic的每个partition最多消费的消息条数)。
(2) 对比这2中方式的优缺点:
采用receiver方式:这种方式可以保证数据不丢失,但是无法保证数据只被处理一次,WAL实现的是At-least-once语义(至少被处理一次),如果在写入到外部存储的数据还没有将offset更新到zookeeper就挂掉,这些数据将会被反复消费. 同时,降低了程序的吞吐量。
采用direct方式:相比Receiver模式而言能够确保机制更加健壮. 区别于使用Receiver来被动接收数据, Direct模式会周期性地主动查询Kafka, 来获得每个topic+partition的最新的offset, 从而定义每个batch的offset的范围. 当处理数据的job启动时, 就会使用Kafka的简单consumer api来获取Kafka指定offset范围的数据。
优点:
1、简化并行读取
如果要读取多个partition, 不需要创建多个输入DStream然后对它们进行union操作. Spark会创建跟Kafka partition一样多的RDD partition, 并且会并行从Kafka中读取数据. 所以在Kafka partition和RDD partition之间, 有一个一对一的映射关系.
2、高性能
如果要保证零数据丢失, 在基于receiver的方式中, 需要开启WAL机制. 这种方式其实效率低下, 因为数据实际上被复制了两份, Kafka自己本身就有高可靠的机制, 会对数据复制一份, 而这里又会复制一份到WAL中. 而基于direct的方式, 不依赖Receiver, 不需要开启WAL机制, 只要Kafka中作了数据的复制, 那么就可以通过Kafka的副本进行恢复.
3、一次且仅一次的事务机制
基于receiver的方式, 是使用Kafka的高阶API来在ZooKeeper中保存消费过的offset的. 这是消费Kafka数据的传统方式. 这种方式配合着WAL机制可以保证数据零丢失的高可靠性, 但是却无法保证数据被处理一次且仅一次, 可能会处理两次. 因为Spark和ZooKeeper之间可能是不同步的. 基于direct的方式, 使用kafka的简单api, Spark Streaming自己就负责追踪消费的offset, 并保存在checkpoint中. Spark自己一定是同步的, 因此可以保证数据是消费一次且仅消费一次。不过需要自己完成将offset写入zk的过程,在官方文档中都有相应介绍.
*简单代码实例:
* messages.foreachRDD(rdd=>{
val message = rdd.map(_._2)//对数据进行一些操作
message.map(method)//更新zk上的offset (自己实现)
updateZKOffsets(rdd)
})
* sparkStreaming程序自己消费完成后,自己主动去更新zk上面的偏移量。也可以将zk中的偏移量保存在mysql或者redis数据库中,下次重启的时候,直接读取mysql或者redis中的偏移量,获取到上次消费的偏移量,接着读取数据。
3、spark streaming 读取kafka数据的两种方式
Receiver-base:
使用Kafka的高层次Consumer API来实现。receiver从Kafka中获取的数据都存储在Spark Executor的内存中,然后Spark Streaming启动的job会去处理那些数据。然而,在默认的配置下,这种方式可能会因为底层的失败而丢失数据。如果要启用高可靠机制,让数据零丢失,就必须启用Spark Streaming的预写日志机制(Write Ahead Log,WAL)。该机制会同步地将接收到的Kafka数据写入分布式文件系统(比如HDFS)上的预写日志中。所以,即使底层节点出现了失败,也可以使用预写日志中的数据进行恢复。
Direct:
Spark1.3中引入Direct方式,用来替代掉使用Receiver接收数据,这种方式会周期性地查询Kafka,获得每个topic+partition的最新的offset,从而定义每个batch的offset的范围。当处理数据的job启动时,就会使用Kafka的简单consumer api来获取Kafka指定offset范围的数据。
相关推荐
资源名称:交互动画设计:Zbrush Autodesk Unity Kinect Arduino三维体感技术整合资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
基于技术整合模型的教育类APP分类研究.pdf
【企业技术整合革新的重要性】 企业技术整合革新是当今商业环境中不可或缺的元素,它涉及到企业如何通过持续的研发活动推动技术变革,积累技术知识,从而获取技术创新带来的收益。技术竞争力是企业能够在市场竞争中...
Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003 Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003
在《信息技术与数学学科教学整合案例:信息技术整合课课例简介》中,以《统计》为例,阐述了如何在小学数学课程中运用信息技术。案例首先分析了教学背景,指出随着素质教育的推进和教育信息化的发展,信息技术教育...
加强课程与信息技术整合是当前教育领域的一个重要议题,旨在应对信息社会对教育提出的挑战,提升学生的信息素养,改进教学方式,提高教学效率。这一过程涉及到课程目标、课程内容、课程实施和课程评价等多个方面,...
【学科教学与信息技术整合】这一主题探讨了如何在教育领域中有效地融合信息技术,以提升教学质量。比利时根特大学的桑国元博士分享了欧洲在这一领域的经验和教训,这对于理解和优化我国的信息技术教育具有重要意义。...
【小学语文与信息技术整合的优势】 信息技术与小学语文教学的整合是现代教育的一种创新尝试,旨在提升教学质量,增强学生的学习兴趣和能力。以下是信息技术在小学语文教学中的一些显著优点: 1. **激发学生学习...
信息技术整合高中化学教学资源的开发与应用已经成为现代教育的重要趋势。随着信息技术的飞速发展,多媒体技术被广泛应用于教学领域,极大地改善了教学效果,提高了教学质量。本文将深入探讨信息技术如何改变高中化学...
初中语文教学与信息技术整合的知识点涵盖教育理论基础、课程整合模式、具体实施实例,以及如何有效利用多媒体和网络资源来提升教学效果,促进学生学习。以下是详细的知识点: 教育理论基础:整合的理论基础是...
本资料集为基于Java语言的jeeweb开源框架设计源码与前端技术整合学习资源,总计包含3794个文件,涵盖了1021个Java源文件、775个JavaScript文件、617个HTML文件、296个XML配置文件、221个PNG图片、197个GIF图像、178...
该项目为基于Maven的多框架融合与多视图技术整合的Java开源项目设计源码,包含314个文件,涵盖187个Java源文件、45个XML配置文件、28个JSP文件、22个JavaScript文件、7个属性文件、6个JAR包文件、4个SQL脚本文件、4...
在IT行业中,SSM技术整合是指将Spring、SpringMVC和MyBatis这三大框架集成到一个项目中,以实现高效、灵活的Web应用开发。本篇内容主要围绕"day10-SSM技术整合-V1.011"展开,详细介绍了如何进行SSM整合以及相关知识...
轻松学JavaWeb开发之框架技术整合开发优秀PPT 本节课程主要讲解了JavaWeb开发中的框架技术整合开发,包括Struts 2、Hibernate和Spring三个框架的整合开发。通过本章的学习,读者将能够了解各框架的整合思想,从而...
【文献综述】初中思想政治课与信息技术整合应注意的问题 随着信息技术的发展,现代教育技术在初中思想政治课中的应用日益广泛,多媒体教学已经成为课堂教学的重要辅助手段。然而,在实际教学中,教师们需要注意信息...
该项目为大连商务局定制开发,集成了Java与Vue两大技术栈,总计包含7001个文件。其中,Java源代码占比最高,达3326个文件,Vue相关文件1563个,...项目文件结构丰富,支持跨语言技术整合,适用于商务局信息化建设需求。
本文针对这一议题,深入探讨了大学英语写作教学与网络技术整合的社会背景、实施意义以及整合路径。 首先,网络技术的普及为大学英语写作教学提供了广阔的空间。二语习得理论强调写作与口语同属语言输出,而网络环境...
针对小学数学与信息技术整合的具体策略,我们可以从以下四个方面着手: 第一,制作符合学生需求的教学课件。教师需要深入了解学生的学习特点和需求,按照课程标准和学生的实际情况设计课件。在设计过程中,应当注重...
【文献综述】初中思想政治课与信息技术整合是一个关键议题,旨在提升教学质量,推动素质教育的深化。随着信息技术的快速发展,多媒体教学已成为教育领域的重要工具。然而,在实践中,如何有效整合信息技术和教学活动...