如果我在spark工作中使用scala并行集合会发生什么?

时间:2016-09-15 21:01:26

标签: scala apache-spark

如果我在spark工作中使用scala并行集合会发生什么? (通常会生成作业以处理多个线程上的集合的分区)。或者就此而言,可能会启动子线程的作业?

spark的JVM是否将执行限制在单个核心上,还是能够在多个核心上合理地分配工作(可能是在同一个节点上?)

1 个答案:

答案 0 :(得分:5)

我们在Spark rdd.mapPartitions(...)函数中广泛使用scala并行集合。它对我们来说非常有效,我们能够很好地扩展IO密集型工作(调用Redis / HBase /等......)

BIG WARN: 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池。