【问题标题】:What happens if I use scala parallel collections within a spark job?如果我在 spark 作业中使用 scala 并行集合会发生什么?
【发布时间】:2016-09-15 21:01:26
【问题描述】:

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

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    我们在 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 池。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2022-11-17
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2016-07-11
      • 2012-06-06
      相关资源
      最近更新 更多