Spark Blacklist 机制(转)

转自 https://www.iteblog.com/archives/1907.html

在使用 Spark 的时候,作业会以分布式的方式在不同的节点上运行;特别是当集群的规模很大时,集群的节点出现各种问题是很常见的,比如某个磁盘出现问题等。我们都知道 Spark 是一个高性能、容错的分布式计算框架,一旦它知道某个计算所在的机器出现问题(比如磁盘故障),会依据之前生成的 lineage 重新调度这个 Task。

现在来考虑下面的场景:

  • 有个节点上的磁盘由于某些原因出现间歇性故障,导致某些扇区不能被读取。假设我们的 Spark 作业需要的数据正好就在这些扇区上,这将会导致这个 Task 失败。
  • 这个作业的 Driver 获取到这个信息,知道 Task 失败了,所以它会重新提交这个 Task。
  • Scheduler 获取这个请求之后,会考虑到数据的本地性问题,所以很可能还是把这个 Task 分发到上述的机器,因为它并不知道上述机器的磁盘出现了问题。
  • 因为这个机器的磁盘出现问题,所以这个 Task 可能一样失败。然后 Driver 重新这些操作,最终导致了 Spark 作业出现失败。

上面提到的场景对于 Apache Spark 2.2.0 版本之前是无法避免的,不过来自 Cloudera 的工程师解决了这个问题:引入了黑名单机制 Blacklist(详情可以参见 SPARK-8425,具体的设计文档参见 Design Doc for Blacklist Mechanism),并且随着 Apache Spark 2.2.0 版本发布,不过目前还处于实验性阶段。

黑名单机制其实是通过维护之前出现问题的执行器(Executors)和节点(Hosts)的记录。当某个任务(Task)出现失败,那么黑名单机制将会追踪这个任务关联的执行器以及主机,并记下这些信息;当在这个节点调度任务出现失败的次数超过一定的数目(默认为2),那么调度器将不会再将任务分发到那台节点。调度器甚至可以杀死那台机器对应的执行器,这些都可以通过相应的配置实现。

我们可以通过 Apache Spark WEB UI 界面看到执行器的状态(Status):如果执行器处于黑名单状态,可以在页面上看到其状态为 Blacklisted ,否则为 Active。如下图所示:

拥有了黑名单机制之后,上面场景的问题就可以很好的解决。

目前黑名单机制可以通过一系列的参数来控制,主要如下:

参数 默认值 含义
spark.blacklist.enabled false 如果这个参数这为 true,将不再会往黑名单里面的 Executor 调度任务
spark.blacklist.timeout 1h (实验性)该节点或执行器在黑名单列中存在的时间
超时后无条件移除
spark.blacklist.task.maxTaskAttemptsPerExecutor 1 (实验性)在执行器被列入该任务的黑名单之前,可以重试多少次。
spark.blacklist.task.maxTaskAttemptsPerNode 2 (实验性)在节点被列入该任务的黑名单之前,可以重试多少次
.. .. ..

因为黑名单机制目前还处于实验性状态,所以上面的一些参数可能会在后面的 Spark 中有所修改。


References:

https://www.iteblog.com/archives/1907.html

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

3 × 5 =