在 Spark 中鼓励使用并行集合

Ant*_*n.P 3 parallel-processing scala apache-spark

在 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}))
Run Code Online (Sandbox Code Playgroud)

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

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

使用这些并行集合是否被鼓励并被认为是好的做法?

zer*_*323 8

使用这些并行集合是否被鼓励并被认为是好的做法?

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

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

最后让我们引用 Reynold Xin 的话

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