目录
Spark Streaming数据存储与调优
一.缓存与持久化机制
与RDD类似,Spark Streaming也可以让开发人员手动控制,将数据流中的数据持久化到内存中,对DStream调用persist()方法,就可以让Spark Streaming自动将该数据流中的所有产生的RDD都持久化到内存中。如果要对一个DStream多次执行操作,那么,对DSteram持久化是非常有用的。因为多次操作,可以共享使用内存中的一份缓存数据。
对于基础窗口的操作,比如reduceByWindow、reduceByKeyAndWindow,以及基于状态的操作,比如updateStateByKey,默认就隐式开启了持久化机制,即Spark Streaming默认就会将上述操作产生的DStream中的数据,缓存到内存中,不需要开发人员手动调用persist()方法。
对于通过网络接收数据的输入流,比如Socket、Kafka、Flume等,默认的持久化级别是将数据复制一份,以便于容错,相当于用的是MEMORY_ONLY_SER_2。
与Spark Core中的RDD不同的是,默认的持久化级别,统一都是要序列化的。
二.Checkpoint机制
每一个Spark Streaming应用,正常来说都是要7x24小时运转的,这就是实时计算程序的特点。要持续不断的对数据进行计算,必须要能够对于应用程序逻辑无关的失败进行容错。
对于一些将多个batch的数据进行聚合的,有状态的transformation操作,这是非常有用的。在这种transformation操作中,生成的RDD是依赖之前的batch中的RDD的,这样就会随着时间的推移,依赖链条越来越长,从而导致失败恢复时间也变得越来越差。有状态的transformation操作执行过程当中产生的RDD要定期的被checkpoint到可靠的存储上,这样做可以消减RDD的依赖链条,从而缩短恢复时间。
当使用了有状态的transformation操作时,必须要开启checkpoint机制,提供checkpoint目录。
注意,并不是所有的Spark Streaming应用程序都要启用checkpoint机制
如何启用Checkpoint机制
- 配置一个文件系统(比如HDFS)的目录,作为checkpoint目录
- 使用StreamingContext的checkpoint方法,填入配置好的目录作为参数即可
三.部署、升级和监控应用程序
1.部署应用程序
- 需要有一个集群资源管理器,比如standalone模式下的Spark集群,Yarn模式下的Yarn集群等
- 打包应用程序为一个jar包
- 为Executor配置充足的内存,比如如果你要执行窗口长度为10分钟的窗口操作,那么Executor的内存资源就必须足够保存10分钟内的数据
- 配置checkpoint
2.升级应用程序
- 如果能够允许多个客户端读取各自独立的数据,也就是读取相同数据的时候,可以直接启动升级后的Spark应用程序,先与旧的Spark应用程序并行执行,确保新的程序没有问题之后,再将旧的程序停掉
- 如果是支持缓存的数据源(如Flume,Kafka等),可以用stop方法先关闭已经在运行的应用程序,然后将升级后的程序部署上去,再启动,这样不会有数据的丢失,如果是不支持缓存的数据源,就会导致数据的丢失