配置Spark事件队列大小
操作场景
Spark中的UI、EventLog、动态资源调度等功能都是通过事件传递实现的。事件有SparkListenerJobStart、SparkListenerJobEnd等,记录了每个重要的过程。
每个事件在发生后都会保存到一个队列中,Driver在创建SparkContext对象时,会启动一个线程循环地从该队列中依次拿出一个事件,然后发送给各个Listener,每个Listener感知到事件后就会做各自的处理。
当Driver日志中出现如下的日志时,表示队列溢出了。
- 普通应用:
Dropping SparkListenerEvent because no remaining room in event queue. This likely means one of the SparkListeners is too slow and cannot keep up with the rate at which tasks are being started by the scheduler.
- Spark Streaming应用:
Dropping StreamingListenerEvent because no remaining room in event queue. This likely means one of the StreamingListeners is too slow and cannot keep up with the rate at which events are being started by the scheduler.
因此当队列存放的速度大于获取的速度时,就会导致队列溢出,从而丢失了溢出的事件,影响了UI、EventLog、动态资源调度等功能。所以为了更灵活的使用,需要在此添加一个配置项,用户可以根据Driver的内存大小设置合适的值。
配置Spark事件队列大小
- 登录FusionInsight Manager系统。
详细操作请参考访问集群Manager。
- 选择“集群 > 服务 > Spark2x/Spark > 配置”,单击“全部配置”,搜索并调整以下参数。
表1 参数说明 参数
参数说明
取值示例
spark.scheduler.listenerbus.eventqueue.capacity
参数决定了事件队列可以容纳的最大事件数。
如果队列满,新的事件将被丢弃,这可能会导致某些监听器无法接收到所有的事件。
增加事件队列容量可以减少事件丢失的风险,但也会增加内存使用。因此,需要根据实际需求和Driver的内存做适当的配置。
1000000
- 修改参数配置后,单击“保存”,根据界面提示操作后,等待配置保存成功。
- Spark服务端配置更新后,如果“配置状态”为“配置过期”,则需重启组件以使配置生效。
图1 修改Spark配置
在Spark服务概览页面,选择“更多 > 重启服务/滚动重启服务”,验证管理员密码后,等待服务重启成功。
如果使用Spark客户端提交任务,修改了集群的参数“spark.scheduler.listenerbus.eventqueue.capacity”后,需要重新下载客户端才能使配置生效,请参考使用MRS客户端。组件重启期间将无法对外提供服务,可能会影响集群的上层业务正常运行,请在业务空闲期或确认操作无影响后再执行本操作。