我正在使用Mesos上的spark-submit在集群模式下在Spark 2.2 / Scala上运行XGBoost。
我希望XGBoost并行运行,所以我设置了tree_method=approx
,因为在XGBoost Parameters for R中这样说:
分布式和外部存储器版本仅支持近似算法
我不清楚这对于XGBoost的Spark版本也是如此。
我已将XGBoost设置为使用100个工作程序(nWorkers=100
),在我的total-executor-cores 100
设置中使用spark-submit
,在我的.config("spark.executor.cores", 5)
设置中使用SparkSession
。这样一来,我总共有20位执行者+ 1位驱动程序。每个执行器有5个CPU。
在我的Stage3中,XGBoost开始运行。我在StdOut中看到了这一点:
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=192.168.50.105, DMLC_TRACKER_PORT=9091, DMLC_NUM_WORKER=100}
在StdErr中,我看到:
[Stage 3:> (0 + 100) / 100]
[Stage 3:> (0 + 100) / 100]
[Stage 3:> (0 + 100) / 100]
(repeated many times)
在SparkUI-executors选项卡中,我看到所有20个执行程序各自运行5个任务。
在SparkUI阶段标签中,我一次看到100个任务。
在Mesos UI-“代理”选项卡中,我看到作业在每个节点和执行器上运行,但从未运行所有cpu。对于每个执行者,杯子利用率最多可以达到1.5,而不是要求的5。看来我的资源没有得到充分利用。
XGBoost保持这种状态约30分钟,产生许多[Stage 3:> ... 0 + 100) / 100] messages
,然后所有任务立即结束,模型准备就绪。
我看到了这篇帖子Spark ML gradient boosted trees not using all nodes ,但并没有太大帮助
我还看到了这三篇关于XGBoost培训阶段并行化的文章
问题: