在运行 map Reduce 作业的集群上运行 Spark 的最佳方法是什么?
第一个问题是关于与数据的共址性。当我启动 Spark 应用程序时,它会分配执行程序,对吗?它如何知道在哪里分配它们,以便它们与作业所需的数据位于同一节点中?(一个作业可能需要一条数据,而之后的作业可能需要另一条数据)
如果我保持 Spark 应用程序正常运行,则执行程序从群集中的计算机中获取插槽,这是否意味着为了协同定位,我需要在每个节点上都有一个 Spark 执行器?
运行执行程序时,这意味着我的地图减少作业的资源较少,对吗?我可以为每个作业停止和启动 Spark 应用程序,但它会剥夺让执行程序启动并运行的速度优势,正确(还有热点对长时间运行进程的好处?
我已经读到容器大小调整 (YARN-1197) 会有所帮助,但这是否意味着执行程序将停止和启动?这不等同于停止 Spark 应用程序(换句话说,如果没有实时执行程序,那么启动 Spark 应用程序与关闭它并在作业需要执行程序时启动有什么好处)
- 执行程序的数据局部性:Spark 在启动执行器时不处理数据局部性,
而是在它们上启动任务时处理数据局部性。因此,您可能需要在每个数据节点上都有执行器(即使您在每个节点上没有执行器,HDFS 冗余也可以为您提供帮助)。
长时间运行过程:是否关闭应用程序取决于用例。如果要提供实时应用程序请求/火花流,则不希望关闭火花。但是,如果您正在进行批处理,则应关闭执行程序。对于跨作业的数据缓存,您应该考虑HDFS缓存或tachyon。您还可以考虑动态分配 spark,如果执行程序一段时间不使用,您可以使用它释放它们。(http://spark.apache.org/docs/latest/configuration.html#dynamic-allocation)。
- YARN-1197 - 将有助于释放分配给容器的 cpu/内存数量。我不确定火花是否支持这一点。