使用 mix 和 max 拆分数据背后的原因是什么?

What is the reason behind splitting data using mix and max?

我知道 Sqoop 是如何在映射器之间分配工作的,它基本上使用了这个逻辑:

SELECT MIN(id), MAX(id) FROM (Select * From myTable WHERE (1 = 1) ) t1

其中 id 是 --split by 中定义的值。我也知道我可以使用 --boundary-query 使用不同的逻辑来更改此逻辑。

我试图找出这个逻辑背后的原因,因为如果例如键列的值分布不均匀会发生什么,比方说如果我有 10 条记录并且我想 运行 这有 5 个映射器(好吧,这只是一个例子):

id_column: 1,200,201,202,203,204,205,206,207, 208, 209, 210, 211
splits: (211 - 1) / 5 = 42

mapper1 = from 1 to 42 ==> 1 record processed
mapper2 = from 42 to 84 ==> 0 records processed
mapper3 = from 84 to 126 ==> 0 records processed
mapper4 = from 126 to 168 ==> 0 records processed
mapper5 = from 168 to 211 ==> 12 records processed

也许我在例子中犯了错误,但我想提一下,我们在映射器之间会有不平衡的工作,有一些记录不会有什么大不了的,但是当我们谈论数百万时的记录,它肯定会影响性能。

话虽如此,我想知道两件事:

  1. 上述逻辑背后的思想是什么? (也许有些东西我没看到)

  2. 当我们的 id 列不像示例中那样均匀分布时,你们知道我如何构建一个解决方法。

上述逻辑背后的思想是什么?

想法是使用主键作为按列拆分(如果可用)。一般主键均匀分布。为了以通用的方式解决问题,我可以考虑将数据分成相等 parts.Also、min()max() 函数几乎每个 RDBMS 都可用。

假设我想出了一个新的 属性 可以解决您使用 2 个映射器的问题。

--mapper-range m1=1-10,m2=200-220

mapper1 = from 1 to 10 ==> 1 record processed

mapper2 = from 200 to 220 ==> 12 records processed

对于 sqoop 开发人员来说,使用我的 新魔法 属性.

覆盖映射器的范围查询并不难

但是当我们在这里谈论大数据时,假设您有 10 亿条记录。找到按列拆分的值模式非常昂贵,因为您需要为此处理整个数据。我猜没有人有兴趣以这个价格购买我的魔法属性。

如果您有更好的想法,请分享您的想法。