Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 每个作业提交的应用程序管理员(纱线火花)?_Apache Spark_Cluster Computing_Yarn - Fatal编程技术网

Apache spark 每个作业提交的应用程序管理员(纱线火花)?

Apache spark 每个作业提交的应用程序管理员(纱线火花)?,apache-spark,cluster-computing,yarn,Apache Spark,Cluster Computing,Yarn,这可能更像是一个“理论”或“良好实践”问题,而不是严格的实际问题(代码或集群配置文件没有问题) 因此,下面是一个简单的场景: 通过RESt(ApacheLivy)提交,比如说,10个spark作业到一个Thread-spark集群 由于资源管理配置,其中5个正在运行,5个已接受/挂起 这会导致10am实例在主节点中并发运行(消耗大量ram),对吗 如果是这样的话,还有其他方法吗?考虑到这一点: 工作要求很快 每次,集群将收到近1000个请求 每一项工作都需要一个小时。完成时间为15秒(有时

这可能更像是一个“理论”或“良好实践”问题,而不是严格的实际问题(代码或集群配置文件没有问题)

因此,下面是一个简单的场景:

  • 通过RESt(ApacheLivy)提交,比如说,10个spark作业到一个Thread-spark集群
  • 由于资源管理配置,其中5个正在运行,5个已接受/挂起
这会导致10am实例在主节点中并发运行(消耗大量ram),对吗

如果是这样的话,还有其他方法吗?考虑到这一点:

  • 工作要求很快
  • 每次,集群将收到近1000个请求
  • 每一项工作都需要一个小时。完成时间为15秒(有时会更短,具体取决于每次呼叫中要处理的数据量)
  • 有限的资源数量(3名员工,每个员工拥有6gb和4个核心+主机)

    • 如果我正确理解了您的问题,请告诉我。使用单独的spark submit,您的意思是调用单独的请求。 因此,所有请求都将转到Thread scheduler,根据资源可用性,它们将处于运行、提交或挂起状态

      现在,我们有两种方式提交纱线->客户端模式和集群模式的作业

      如果在客户端模式下提交作业,则驱动程序将在客户端进程中运行,而应用程序主控程序仅用于从应用程序请求资源。因此,不同的作业请求将在同一台机器上创建不同的驱动程序(以及相关的AMs)这应该与您有关

      如果您在集群模式下提交作业,那么驱动程序将在应用程序主进程内运行,该主进程由集群上的Thread管理。因此,不同的作业请求将在不同的机器上创建不同的应用程序主控程序(内部驱动程序)

      所以,看一下您的用例,显然可以对大量传入请求使用负载平衡器。并以集群模式提交作业。
      接下来,您可以使用最佳实践属性调整应用程序。

      5个作业正在运行意味着5个实例正在运行,而不是10个。由于5个正在忙着做他们的工作,其他5个工作正在等待正在运行的工作完成,因为您一次提交了10个工作。对,我确实在使用Thread以集群模式提交工作。那么,您的建议是在集群前面放置某种负载平衡器?如果我错了,请纠正我,Thread不应该能够管理提交作业的执行,并在不依赖负载平衡器的情况下对那些无法获得资源的人进行排队吗?嗯,当您通过REST api或其他方式获得请求时,负载平衡器部分非常方便。在收到请求后,作业将提交给纱线,这也是集群模式(如您所说)。之后,纱线应根据其资源需求处理作业顺序。但很多时候,情况并非如此。我也遇到过同样的情况,大多数工作都进入了待定状态,而我不知道哪个工作进入了待定状态。因此,我采用了以下方法:在向Thread提交作业之前,我运行了一个脚本,如果(memory left>memory req)您可以使用Thread命令来标识这些内存状态,则提交作业:如
      Thread queue-status
      将为您提供有关队列的详细信息。此外,
      warn application-list | grep
      将提供运行应用程序的详细信息,从中您可以获得到目前为止的总使用量。然而,要进行所有这些检查,您需要了解工作的内存需求。可以从关闭动态分配属性开始。为ex 10分配执行器,内存开销为512mb(取决于您的作业请求),如wise set executor memory和driver memory。因此,这种方法是让作业线程等待,直到它们的内存阈值在作业队列中可用。通过这种方式,您将始终处于这样一种位置:您知道哪些作业正在等待,并且您可以采取一种方法,设置一些等待时间限制,然后您的作业中止。请稍后再试。很抱歉反应太晚,我感谢您的解释,这实际上是非常有帮助的。在接下来的几天里,我会尝试与你类似的方法,并给出一些反馈。