【问题标题】:What about the files with smaller size than the hadoop block size: spark + machine learning比 hadoop 块大小小的文件怎么办:spark + 机器学习
【发布时间】:2016-10-02 05:22:30
【问题描述】:

如果我的 hadoop 块大小为 128 MB,而我的文件为 30 MB。 我运行 spark 的集群是一个 4 节点集群,总共有 64 个内核。

现在我的任务是运行随机森林或梯度提升算法,在此基础上使用参数网格和 3 折交叉验证。

几行代码:

import org.apache.spark.ml.tuning.{ParamGridBuilder, TrainValidationSplit, CrossValidator}
import org.apache.spark.ml.regression.GBTRegressor

val gbt_model = new GBTRegressor().setLabelCol(target_col_name).setFeaturesCol("features").setMaxIter(2).setMaxDepth(2).setMaxBins(1700)
var stages: Array[org.apache.spark.ml.PipelineStage] = index_transformers :+ assembler :+ gbt_model
val paramGrid = new ParamGridBuilder().addGrid(gbt_model.maxIter, Array(100, 200)).addGrid(gbt_model.maxDepth, Array(2, 5, 10)).build()

val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(new RegressionEvaluator).setEstimatorParamMaps(paramGrid).setNumFolds(5)
val cvModel = cv.fit(df_train)

我的文件有

输入: 10 个离散/字符串/字符特征 + 2 个整数特征

输出:一个整数响应/输出变量

这需要 4 个多小时才能在我的集群上运行。我观察到的是,我的代码仅在 1 个节点上运行,只有 3 个容器。

问题:

  1. 我可以在这里做些什么来确保我的代码在所有四个节点上运行或使用尽可能多的内核进行快速计算。
  2. 在对数据进行分区(Scala 中的 DataFrame 和 Hadoop 集群上的 csv 文件)方面我可以做些什么来提高速度和计算能力

问候,

【问题讨论】:

    标签: hadoop apache-spark apache-spark-mllib apache-spark-ml


    【解决方案1】:

    提交作业时,您可以通过参数--num-executors 传递您想要的执行者数量。您还可以通过--executor-cores 和--executor-memory 指定每个执行程序将使用的核心数量和内存量。

    【讨论】:

    • 为什么不这样:stackoverflow.com/questions/9678180/…?
    • 有两个原因: 1. split size 不影响executor的个数,但是partition个数; 2.Spark中设置了分区数,因此无论文件中的拆分数如何,您都可以选择分区数。我认为您必须更好地理解分区(逻辑并行)和执行器(物理并行)之间的区别:更多的执行器意味着更多的任务(对数据块的操作)并行执行;更多的分区意味着更小(和更多)的数据块。
    • 嘿@mark91 非常感谢。那么我应该如何选择 spark 中的分区数?如果我没听错,你的意思是说我需要更多的执行者来解决我的问题?
    • 是的!您可以通过互联网浏览机器人,有许多最佳实践,但一个好的起点是使用您的所有资源(内核和内存),然后通过一些实验进行调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2020-10-22
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多