【发布时间】:2016-09-15 21:01:26
【问题描述】:
如果我在 spark 作业中使用 scala 并行集合会发生什么? (通常会产生作业来处理多个线程上的集合分区)。或者就此而言可能启动子线程的作业?
spark 的 JVM 是否将执行限制在单个核心上,还是可以将工作合理地分布在多个核心上(可能在同一个节点上?)
【问题讨论】:
标签: scala apache-spark
如果我在 spark 作业中使用 scala 并行集合会发生什么? (通常会产生作业来处理多个线程上的集合分区)。或者就此而言可能启动子线程的作业?
spark 的 JVM 是否将执行限制在单个核心上,还是可以将工作合理地分布在多个核心上(可能在同一个节点上?)
【问题讨论】:
标签: scala apache-spark
我们在 Spark rdd.mapPartitions(...) 函数中广泛使用 scala 并行集合。它非常适合我们,我们能够很好地扩展 IO 密集型作业(调用 Redis/HBase/etc...)
大警告: Scala 并行集合不是懒惰的!当您构造 par-iterator 时,它实际上将 Iterator[Row] 中的所有行都带入内存。我们主要在 Spark-Streaming 上下文中使用它,所以这对我们来说不是问题。但是当我们想用 Spark 处理巨大的 HBase 表时,这是一个问题
private def doStuff(rows: Iterator[Row]): Iterator[Row] = {
val pit = rows.toIterable.par
pit.tasksupport = new ExecutionContextTaskSupport(ExecutionContext.fromExecutor(....)
pit.map(row => transform(row)).toIterator
}
rdd.mapPartitions(doStuff)
我们使用ExecutionContextTaskSupport 将所有计算放入专用的ThreadPool,而不是使用默认的JVM 级别的ForkJoin 池。
【讨论】: