如果我在spark工作中使用scala并行集合会发生什么? (通常会生成作业以处理多个线程上的集合的分区)。或者就此而言,可能会启动子线程的作业?
spark的JVM是否将执行限制在单个核心上,还是能够在多个核心上合理地分配工作(可能是在同一个节点上?)
答案 0 :(得分:5)
我们在Spark rdd.mapPartitions(...)
函数中广泛使用scala并行集合。它对我们来说非常有效,我们能够很好地扩展IO密集型工作(调用Redis / HBase /等......)
BIG WARN: Scala并行集合不是懒惰!当你构造par-iterator时,它实际上将Iterator[Row]
中的所有行都带入了内存。我们主要在Spark-Streaming环境中使用它,所以它对我们来说不是问题。但是当我们想要使用Spark
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池。