为Spark作业划分RDD

时间:2015-12-14 18:31:59

标签: apache-spark yarn

当我在纱线集群中提交作业火花时,我看到spark-UI我得到4个阶段的工作但是,所有节点中使用的内存非常低,并且它表示使用4 gb中的0。我想这可能是因为我把它留在了默认分区。

文件大小范围在s3中介于1 mb到100 mb之间。大约2700 files的大小为26 GB。并且第2阶段正好运行2700 jobs

重新分配大约640个分区的东西是否值得,它会改善性能吗?或
如果分区是粒度比实际需要的那么无关紧要?或
我的提交参数需要解决吗?

Spark UI 群集详细信息,

  

具有10个节点的集群
  总记忆500 GB
  整体vCores 64

--excutor-memory 16 g
--num-executors 16
--executor-cores 1

实际上它在64个核心中运行。我不想增加核心数量,因为其他人可能会使用群集。

1 个答案:

答案 0 :(得分:0)

您进行分区,并按以下原因重新分区:

  • 确保我们有足够的工作分配到集群中的不同核心(nodes * cores_per_node)。显然,我们需要调整执行程序的数量,每个执行程序的内核数和每个执行程序的内存数,以使其按预期发生。
  • 为了确保我们能够均匀地分配工作:分区越小,一个核心比其他核心可能做的工作要少得多。如果分区太大,倾斜分布会对总的失效时间产生巨大影响。
  • 保持分区的可管理大小。不大,而不是小,所以我们不要过分GC。当我们有非线性O时,更大的分区可能会出现问题。
  • 对于小分区会产生过多的进程开销。

你可能已经注意到,将会有一个金发姑娘区。测试将帮助您确定理想的分区大小。

请注意,拥有比核心更多的分区是可以的。排队分配任务的分区是我设计的。

另外请确保正确配置您的火花作业:

  • 确保没有太多的执行者。每个节点有一个或者很少的执行器就足够了。较少的执行程序将具有较少的开销,因为它们在共享内存空间中工作,并且各个任务由线程而不是进程处理。启动进程有很多开销,但Threads非常轻量级。
  • 任务需要相互交谈。如果它们在同一个执行器中,它们可以在内存中执行。如果它们位于不同的执行程序(进程)中,则会在套接字(开销)上发生。如果这是在多个节点上,则通过传统网络连接发生(更多开销)。
  • 为执行者分配足够的内存。当使用Yarn作为调度程序时,默认情况下它将使执行程序适合其内存,而不是您声明要使用的CPU。

我不知道你的情况是什么(你让节点名称不可见),但是如果你只有一个包含15个核心的节点,那么16个执行器就没有意义了。相反,使用One executor进行设置,每个执行器使用16个核心。