【问题标题】:Is using parallel collections encouraged in Spark在 Spark 中鼓励使用并行集合
【发布时间】:2017-01-02 20:46:31
【问题描述】:

在 Spark 上使用并行集合有意义吗?

到目前为止,我看到的所有 Spark 示例都使用非常简单的数据类型(单类和元组)的 RDD。但实际上集合,特别是并行集合可以用作 RDD 的居民。

worker 可能有多个可用于执行的核心,如果将常规集合用作 RDD 驻留,那么这些额外的核心将保持空闲状态。

我与当地经理一起进行的测试。

val conf: SparkConf = new SparkConf().setAppName("myApp").setMaster("local[2]")
val sc = new SparkContext(conf)

val l = List(1,2,3,4,5,6,7,8)
val l1 = l.map(item => (item, 1 to item toList))
val l2 = l1.map(item => (item._1, item._2.toParArray))
val l3 = sc.parallelize(l2)
l3.sortBy(_._1).foreach(t => t._2.map(x => {println(t._1 + " " +Thread.currentThread.getName); x / 2}))

在这种情况下,当我使用 parArray 时,我看到 16 个线程在工作,而当我使用简单 Array 时,只有 2 个线程在工作。这可以看作是 2 个 worker 有 8 个线程。

另一方面,并​​行集合的每个逻辑都可以更改为简单类型的 RDD 转换。

是否鼓励并认为是好的做法?

【问题讨论】:

    标签: scala apache-spark parallel-processing


    【解决方案1】:

    是否鼓励并认为是好的做法?

    不太可能。考虑以下事实:

    • 任务内的任何并行执行对于资源管理器来说都是完全不透明的,因此它无法自动分配所需的资源。
    • 您可以使用spark.task.cpus 在任务中明确请求特定数量的线程,但它是一个全局设置,无法根据上下文进行调整,因此无论您是否使用资源,您都可以有效地阻塞资源。
    • 如果线程未充分利用是一个有效的问题,您可以随时增加分区数。

    最后让我们quote Reynold Xin:

    并行收集相当复杂且难以管理(隐式线程池)。它有利于更多基本的线程管理,但 Spark 本身内置了更复杂的并行化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2015-05-24
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多