当前位置: 首页 > 知识库问答 >
问题:

如何均匀分布数据集以避免倾斜连接(和长时间运行的任务)?

顾琛
2023-03-14

我写的应用程序使用火花数据集API在数据库笔记本。

我有两个表。一个是15亿行,第二个250万。两个表都包含电信数据,连接使用国家代码和数字的前5位数字完成。输出有550亿行。问题是我有倾斜的数据(长时间运行的任务)。无论我如何重新分区数据集,我都会因为散列键的不均匀分布而得到长时间运行的任务。

我尝试使用广播连接,尝试在内存中持久化大表分区等。。。。。

我有什么选择?

共有1个答案

庄经国
2023-03-14

Spark将根据连接键重新分区数据,因此在连接之前重新分区不会改变歪斜(只会添加不必要的洗牌)

如果您知道导致倾斜的键(通常是 null 或 0 或 “” 之类的东西),请将数据分成 2 部分 - 1 个数据集使用倾斜键,另一个数据集使用其余部分

对子数据集进行连接,并合并结果

例如:

val df1 = ...
val df2 = ...
val skewKey = null

val df1Skew = df1.where($"key" === skewKey)
val df2Skew = df2.where($"key" === skewKey)

val df1NonSkew = df1.where($"key" =!= skewKey)
val df2NonSkew = df2.where($"key" =!= skewKey)

val dfSkew    = df1Skew.join(df2Skew) //this is a cross join
val dfNonSkew = df1NonSkew.join(df2NonSkew, "key")

val res = dfSkew.union(dfNonSkew)
 类似资料:
  • 我把keyby parallism设置为30,我如何找到30个唯一的键来使datastream键控均匀?flink支持这个吗?因为我不想要太多的键,我会在influxdb中把键作为一个标记,所以我不想要太多的键,避免在influxdb中使用oom。但是我如何使用最小键来均匀地按一个datastream键呢? 我想使用flink来跟踪MySQL中表的每一次更改(如UPDATE/INSERT),并计算

  • 我有9个ignite服务器实例,其缓存处于模式,在这种模式下,我用Kafka从分区并行加载数据。这里的分区包含的条目数可以通过字段唯一标识,我还使用将条目从一个分区配置到一个实例。我将key定义为, 因此,我试图在ignite实例中的缓存项和分区之间实现一对一的映射,例如。但在我的例子中,我得到的映射是, 这里实现了关联配置部分,即具有相同分区ID的条目缓存在相同的ignite实例上。但是,数据在

  • 使用Spark Dataset/DataFrame联接时,我面临长时间运行且OOM作业失败的问题。 以下是输入: ~10个不同大小的数据集,大部分是巨大的( 经过一番分析,我发现作业失败和缓慢的原因是歪斜键:当左侧有数百万条记录时,用连接键。 我用了一些蛮力的方法来解决这个问题,这里我想和大家分享一下。 如果您有更好的或任何内置的解决方案(针对常规Apache Spark),请与他人分享。

  • 0.1-0.2:********** 0.2-0.3:******** 0.3-0.4:********* 0.5-0.6:********* 0.6-0.7:********* 0.7-0.8:********* 0.4-0.5:********* 0.5-0.6:********* 0.6-0.7:********* 0.1-0.2:********* 0.2-0.3:********* 0.

  • 问题内容: 有谁知道如何用scipy绘制偏态正态分布?我认为可以使用stats.norm类,但我不知道如何使用。此外,如何估计描述一维数据集偏斜正态分布的参数? 问题答案: 根据Wikipedia的描述, 如果你想找到一个数据集的使用规模,位置和形状参数,例如使用,并且, 应该给你类似的东西,

  • 问题内容: 我试图识别/创建一个函数(在Java中),该函数给我一个非均匀的分布式数字序列。如果我有一个函数说它将给我一个从到的随机数。 该函数最适合任何给定的函数,下面仅是我想要的示例。 但是,如果我们说函数将返回来自分布式的s nonuni。 我想例如说 约占所有案件的20%。 大约是所有情况的50%。 约占所有案件的20%。 大约是所有情况的10。 总之somting,给我一个数字,如正态分