我试图理解,如果Spark驱动程序是一个单一的故障点时,部署在集群模式为Yarn。因此,在本文中,我想更好地了解有关spark驱动程序的yarn容器的故障转移过程的内部。
我知道spark驱动程序将在一个Yarn容器内的spark应用程序主机中运行。如果需要,spark应用程序主机将向yarn资源管理器请求资源。但是在spark应用程序主程序(和spark驱动程序)的yarn容器发生故障时,我还没有找到足够详细的关于故障转移过程的文档。
我试图找出一些详细的资源,这些资源允许我回答与以下场景相关的一些问题:如果运行spark应用程序主程序/spark驱动程序的yarn容器的主机在1小时内失去网络连接:
Yarn资源管理器是否使用另一个spark应用程序主程序/spark驱动程序生成新的Yarn容器?
在这种情况下(产生一个新的Yarn容器),它是否从零开始启动Spark驱动程序,如果至少1个执行器中的1个阶段已经完成,并在失败之前通知原始驱动程序?persist()中使用的选项在这里有区别吗?新的spark驱动程序会知道执行者已经完成了1个阶段吗?在这种情况下,超光速粒子会有帮助吗?
如果网络连接在原始spark应用程序主机的容器主机中恢复,是否会触发故障回复过程?我猜这种行为可以通过yarn来控制,但是我不知道在集群模式下部署spark时的默认值是什么。
如果您能给我指出一些文档/网页,其中详细介绍了yarn集群模式下spark的体系结构和故障转移过程,我将不胜感激。
1条答案
按热度按时间koaltpgm1#
我们刚开始用Yarn,所以我知道的不多。但我几乎可以肯定,我们没有自动故障切换在司机的水平(我们自己实现了一些。)
我不希望驱动程序有任何默认的故障转移解决方案。你(驱动程序作者)是唯一一个知道如何健康检查你的应用程序的人。驱动程序中的状态不是可以自动序列化的。当sparkcontext被销毁时,其中创建的所有RDD都将丢失,因为如果没有运行的应用程序,这些RDD将毫无意义。
你能做什么
我们实施的恢复策略非常简单。每次昂贵的Spark操作后,我们都会做一个手动检查点。我们将rdd保存到磁盘(想想
saveAsTextFile
)马上装回去。这将删除rdd的沿袭,因此如果分区丢失,它将被重新加载而不是重新计算。我们还存储我们所做的事情和文件名。因此,如果驱动程序重新启动,它就可以按照这种操作的粒度从停止的地方恢复。