我试图使用运行在Kubernetes上的ApacheSpark2.3ScalaAPI来扩展结构化流管道。这项工作的基本流程如下:
我在Kubernetes上运行,并配置了一个集群,每个集群有30个执行者,每个执行器有3个核心。Kafka目前正在每一个源id每秒流600000个指标,并且配置了600个分区。我正在尝试将它们聚合成10个不同的输出(即,每个输出聚合由60000个不同的源ids组成)。我每10秒就有管道触发器来处理卡夫卡的600万张记录。我的聚合窗口是1分钟不重叠的,我的水印设置为30秒。理想情况下,我希望使用更长的水印来解释延迟到达的数据,但是删除复制/水印阶段似乎是一个瓶颈,特别是在调用垃圾收集器时。以下是我最近运行的管道中的一些数据:
图形显示,管道每秒与输入行保持约8-9分钟,但橙色线下降到绿线以下(时间轴上为10:01),管道很难跟上输入数据速率。我在Spark中寻找为什么会出现减速的线索,并发现一个执行者在删除复制/水印阶段花费了55秒来执行GC。以下是舞台上的汇总统计数据以及事件时间表的放大部分:
我尝试了一些建议这里的技术,结果参差不齐。特别是:
内存建议的其余部分类似于“尝试修改这个参数或那个参数”,但是很难尝试每一个置换,并且它没有指示我应该期望的行为。有人能指点我下一步的方向吗?我觉得55秒的GC是不合理的,应该有一些方法来调整它,这样我的工作就不会受到1名执行者的阻碍。
发布于 2018-12-10 17:09:52
所以我应该在解决方案新鲜的时候早点回答这个问题,但最后我做了一些有助于减少垃圾收集时间的事情。我不记得所有帮助我解决这个问题的文档来源,但是我花了很多时间研究它、gceasy推荐和一般的Java文献。不管怎么说,最后帮助你的是:
因此,这是我在这之后使用的JVM参数的最后一组。我希望这能帮到你。
-XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:InitiatingHeapOccupancyPercent=35 -XX:+UseStringDeduplication -XX:ConcGCThreads=1 -XX:ParallelGCThreads=5https://stackoverflow.com/questions/52043133
复制相似问题