了解火花过程行为

时间:2017-01-10 08:13:00

标签: scala apache-spark rdd directed-acyclic-graphs

我想了解流程行为。基本上,这个spark过程必须创建最多五个文件,每个文件一个,并将它们保存到HDFS中。

地区由五个字符串组成。但是当我在看火花UI时,我看到很多次正在执行相同的动作。

这些是我的问题:

  • 为什么每个地区而不是一个地方执行了4次空行动?我希望只有一次行动。
  • 计算isEmpty时如何确定任务编号?第一次只有一个任务,第二次任务是4,第三次是20,第四次是35.这个尺寸背后的逻辑是什么?我能以某种方式控制这个号码吗?

注意:是某人有更多说大数据解决方案来实现相同的流程目标,请建议我。

这是Spark流程的代码摘录:

class IntegrationStatusD1RequestProcess {

  logger.info(s"Retrieving all measurement point from DB")
  val allMPoints = registryData.createIncrementalRegistryByMPointID()
    .setName("allMPoints")
    .persist(StorageLevel.MEMORY_AND_DISK)

  logger.info("getTerritories return always an array of five String")
  intStatusHelper.getTerritories.foreach { territory =>

    logger.info(s"Retrieving measurement point for territory $territory")
    val intStatusesChanged = allMPoints
      .filter { m => m.getmPoint.substring(0, 3) == territory }
      .setName(s"intStatusesChanged_${territory}")
      .persist(StorageLevel.MEMORY_AND_DISK)

    intStatusesChanged.isEmpty match {
      case true => logger.info(s"No changes detected for territory")
      case false =>

      //create file and save it into hdfs

    }
  }
}

这是显示所有火花作业的图片:

enter image description here

以下前两张图片显示isEmpty阶段: enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

如果你期望它是真的,

isEmpty是低效的!

这是isEmpty的RDD代码:

def isEmpty(): Boolean = withScope {
  partitions.length == 0 || take(1).length == 0
}

它会调用take。如果你认为RDD 不是是空的,那么这是一个有效的实现,但如果你认为它,这是一个可怕的实现。

take的实现遵循此递归步骤,从parts = 1开始:

  1. 收集第一个部分分区。
  2. 检查此结果是否包含> = n项。
  3. 如果是,请选择第一个n
  4. 如果不是,请使用parts = parts * 4重复步骤1。
  5. 如果RDD具有比take更多的元素,这种实现策略会让执行发生短路,这通常是正确的。但是如果您的RDD元素数量少于take所需的元素,则最终会计算分区#1 log4(nPartitions) + 1次,分区#2-4 log4(nPartitions)次,分区#5-16 { {1}}次,依此类推。

    此用例的更好实现

    此实现仅通过牺牲短路能力来计算每个分区一次:

    log4(nPartitions) - 1