背景:我正在开发一个spark流媒体管道,以实现200k+rps的高吞吐量。管道使用多个自定义接收器流(60-80)从pubsub读取数据,并在其间使用一些自定义转换将数据写入bigtable,以收集度量(无乱序)。我已经把dag附在下面了。每个微批处理有两个作业,一个用于空检查,一个用于写操作。批处理间隔为10秒。5-10个并行作业。执行器的数量(5cores/13g,每个gcp n1-standard-16机器有3个执行器)大于具有25个节点群集的流的数量。
我面临着处理时间不一致的问题,这导致管道在几个小时后变得不稳定。这会导致吞吐量下降。例如,有时一批740k记录的处理时间约为9秒,而500k记录的处理时间则高达1.3分钟(见下面所附的屏幕截图)。
我检查了任务执行时间,发现对于500k批处理,任务并行度不够,而对于740k批处理,并行度很高(请参阅随附的屏幕截图)。有没有人能提供帮助和建议,以解决这些问题,并实现一致的处理时间?或者关于使用pubsub自定义接收器的spark流媒体的任何其他建议?
管道dag:
740k批处理作业的任务执行图:
500k批处理作业的任务执行图:
使用额外的Spark配置,
“spark.executor.instances”:“90”
“spark.executor.heartbeat.maxfailures”:“6”,
“spark.warn.maxappattempts”:“4”,
“spark.yarn.am.attemptfailuresvalidityinterval”:“1h”,
“spark.yarn.executor.failuresvalidityinterval”:“1h”,
“spark.task.maxfailure”:“8”,
“spark.streaming.concurrentjobs”:“10”,
“spark.streaming.numstreams”:“80”,
“spark.scheduler.allocation.file”:“/usr/lib/spark/conf/fairscheduler.xml”,
“spark.streaming.dynamicallocation.enabled”:“true”
暂无答案!
目前还没有任何答案,快来回答吧!