我想知道设计火花作业的最佳做法,其中数据量未提前知道(或变化很大)。在我的例子中,应用程序应该处理初始加载,然后处理增量数据。
我想知道如何设置数据中的分区数(例如使用repartition
或设置spark.sql.shuffle.partitions
等参数,以避免执行程序中的OOM重复(为每个分配的内存提供固定数量)执行人)我可以
在所有选项中,我都会看到问题:
1:我认为这对于小数据量来说效率很低,因为这个数据非常小
2:需要额外的查询(例如count
),例如要设置spark.sql.shuffle.partitions
,SparkContext
需要重新启动,我想避免
3:似乎与Spark的精神相矛盾
所以我想知道对于强烈变化的数据量,最有效的策略是什么。
编辑:
我设置spark.sql.shuffle.partitions
是错误的,这可以在运行时设置woutout重新启动spark context
答案 0 :(得分:0)
正如您所提到的,您引入了一个额外的步骤来计算您的数据,乍一看似乎是错误的。但是,您不应该将此视为误用计算。通常,如果对数据进行严格分区,计算数据所需的时间远远少于进行进一步处理所需的时间。将计数操作视为投资,它当然值得。
您无需通过配置设置分区并重新启动Spark。相反,请执行以下操作:
合并操作将重新分区您的数据而不会改组,因此当它可用时效率更高。
理想情况下,您可以估算要生成的行数,而不是计算它们。此外,您需要仔细考虑何时适合执行此操作。使用较长的RDD谱系可以消除性能,因为由于scala延迟执行,您可能会无意中减少可执行复杂代码的核心数。查看检查点以缓解此问题。