我想了解流程行为。基本上,这个spark过程必须创建最多五个文件,每个文件一个,并将它们保存到HDFS中。
地区由五个字符串组成。但是当我在看火花UI时,我看到很多次正在执行相同的动作。
这些是我的问题:
注意:是某人有更多说大数据解决方案来实现相同的流程目标,请建议我。
这是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
}
}
}
这是显示所有火花作业的图片:
答案 0 :(得分:1)
这是isEmpty
的RDD代码:
def isEmpty(): Boolean = withScope {
partitions.length == 0 || take(1).length == 0
}
它会调用take
。如果你认为RDD 不是是空的,那么这是一个有效的实现,但如果你认为它是,这是一个可怕的实现。
take
的实现遵循此递归步骤,从parts = 1开始:
n
项。n
parts = parts * 4
重复步骤1。如果RDD具有比take
更多的元素,这种实现策略会让执行发生短路,这通常是正确的。但是如果您的RDD元素数量少于take
所需的元素,则最终会计算分区#1 log4(nPartitions) + 1
次,分区#2-4 log4(nPartitions)
次,分区#5-16 { {1}}次,依此类推。
此实现仅通过牺牲短路能力来计算每个分区一次:
log4(nPartitions) - 1