您的位置:首页 > 大数据

大数据Spark企业级实战版【学习笔记】-----Spark Streaming案例分析

2017-08-29 15:23 651 查看

1.3.2.3 Spark Streaming案例分析

       在互联网应用中,网站流量统计作为一种常用的应用模式,需要在不同粒度上对不同数据进行统计,既有实时性需求,又需要涉及聚合、去重、连接等较为复杂的需求统计。传统上,若使用Hadoop MapReduce框架,可以容易地实现较为复杂的统计需求,但实时性却无法保证;若是采用Storm这样的流式框架,实时性可以得到保证,但需求的实现复杂度也大大提高。Spark Streaming在两者之间找到一个平衡点,能够以准实时的方式,容易实现较为复杂的统计需求。Kafka和Spark
Streaming搭建实时流量统计框架:

数据暂存:Kafka作为分布式消息队列,既有非常优秀的吞吐量,又有较高的可靠性和扩展性,在这里采用Kafka作为日志传递中间件来接收日志,抓取客户端发送的流量日志,同时接收Spark Streaming的请求,将流量日志按序列发送给Spark Streaming集群

数据处理:将SparkStreaming集群与Kafka集群对接,SparkStreaming从Kafka集群中获取流量日志并进行处理。Spark Streaming会实时地从Kafka集群中获取数据并将其存储在内部的可用内存空间中。当每一个batch窗口到来时,便对这些数据进行处理。

结果存储:为了便于前端展示和页面请求,处理得到的结果将写入到数据库中

  Kafka+Spark Streaming的框架有以下优点:

  1.Spark框架的高效和低延迟保证了Spark Streaming操作的准实时性。

  2.利用Spark框架提供的丰富API和高灵活性,可以精简地写出较为复杂的算法。

  3.编程模型的高度一致使得上手SparkStreaming相当容易,同时也可以保证业务逻辑在实时处理和批处理上的复用。

       在基于Kafka+Spark Streaming的流量统计应用运行过程中,有时会遇到内存不足、GC阻塞等各种问题。如何对Spark Streaming应用程序进行调优来减少甚至避免这些问题的影响?

1.   优化运行时间:

增加并行度。确保使用整个集群的资源,而不是把任务集中在几个特定的节点上。对于包含shuffle的操作,增加并行度以确保更为充分地使用集群资源。

减少数据序列化、反序列化的负担。Spark Streaming默认将接收到的数据序列化后存储以减少内存的使用。但序列化和反序列化需要更多的CPU时间,因此更加高效的序列化方式(Kryo)和自定义的序列化接口可以更高效地使用CPU。

设置合理的batch窗口。在SparkStreaming中,Job之间有可能存在着依赖关系,后面的Job必须确保前面的Job执行结束后才能提交。

2.       优化内存使用

控制batch size。Spark Streaming会把batch窗口内接收到的所有数据存放在Spark内部的可用内存区域中。

及时清理不再使用的数据。通过设置合理的spark.cleaner.ttl时长来及时清理超时的无用数据。

观察及适当调整GC策略。GC会影响Job的正常运行,延长Job的执行时间,引起一系列不可预料的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐