使用mix和max分割数据的原因是什么?

时间:2016-07-14 16:27:07

标签: hadoop sqoop

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

  

SELECT MIN(id),MAX(id)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列不像示例中那样均匀分布时,你们知道如何构建变通方法。

1 个答案:

答案 0 :(得分:0)

提到的逻辑背后的想法是什么?

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

说我想出了一个新的属性,用2个映射器解决了你的问题。

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

mapper1 =从1到10 ==>已处理1条记录

     

mapper2 =从200到220 ==>已处理12条记录

sqoop开发人员使用我的新魔法属性覆盖其对映射器的范围查询并不困难。

但正如我们在这里谈论大数据一样,假设你有10亿条记录。找到按列拆分的值模式是非常昂贵的,因为您需要为此处理整个数据。我想没有人有兴趣以这个价格购买我的神奇财产。

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