当少数表没有主键时,sqoop import-all 具有并行性

Posted

技术标签:

【中文标题】当少数表没有主键时,sqoop import-all 具有并行性【英文标题】:sqoop import-all with parallelism when few tables are not having primary key 【发布时间】:2021-06-10 12:27:50 【问题描述】:

我想从 mysql 的模式中导入所有具有并行性的表。架构中很少有表有主键,也很少有没有。如果我们设置 no of mappers(--m>1) 没有主键的表会失败。

我们如何以并行方式导入所有表?

【问题讨论】:

【参考方案1】:

我完全同意@leftjoin关于PK的回答。 还有另一种实现并行性的方法,您可以将其用于 RDBMS。 您可以使用--split-by <<column>> -m no_of_mappers。 这告诉 sqoop 在将数据导入 hdfs 时使用哪一列来创建拆分。这不必是唯一的,可以是数据在某种程度上均匀分布的任何列,例如 org_id 或 department_id (INT)。 Sqoop 将触发 MAX(col) 和 MIN(COL),然后根据这些值拆分数据。然后拆分每个映射器的源数据以导入。您可以理解,如果表大小很大,计算最大值和最小值可能需要几分钟。 例如,对于一个 1000 行的表,--split-by dept_id -m 4。 假设我们有 6 个部门,sqoop 会将数据分成 4 个部分 - 部门 1、部门 2 和 3、部门 4、部门 5 和 6。请注意:这只是一个示例,实际分布可能会有所不同。

【讨论】:

+ 是的,同意你的回答。如果您有均匀分布的列并且不需要生成 row_number 因为它是 int,那么您的建议就可以了。如果不均匀分布会发生什么是映射器之间的偏差并且并行性将不起作用,详细信息在这里:***.com/a/37389134/2700344 您分享的链接中的答案很棒,谢谢。是的,找到一个数据均匀分布的 INT 列可能具有挑战性。有时 INT PK 列也可能有间隙。由于某些进程问题,序列可能像 10,11,12,256, 257,258。【参考方案2】:

如果你有整数列,而不是 PK,均匀分布,你可以将它用作拆分,跳过我在这里写的所有内容并阅读:Sqoop import : composite primary key and textual primary key

如果你有一些列组合可以确定性地定义行的顺序(复合 PK 候选),你可以使用 row_number,见https://***.com/a/67910296/2700344

可以使用不确定的 row_number 吗? sqoop 将计算查询以确定最小值和最大值以获取范围,然后将在具有过滤器的不同映射器中执行相同的查询以获取范围,如果 row_number 不是确定性的 - 那么同一行可能出现在不同的范围中,所以,答案是否,应该是确定性的。

如果您没有这样的复合键,那么您可能可以使用 Oracle 中的 rowid 等其他方式用于相同目的(仅当表在您的导入作业范围内是静态的,因为 ROWID 可以更改为例如,如果删除并重新插入某些行,则重新加载表)。如果是 MySQL,那么很遗憾,您没有这样的专栏。唯一的解决方案是将自动增量序列代理主键添加到您的表并填充它。

【讨论】:

以上是关于当少数表没有主键时,sqoop import-all 具有并行性的主要内容,如果未能解决你的问题,请参考以下文章

在 RDBMS 中没有主键的 Sqoop 导入

数据库使用规范

当我不需要主键时不使用主键可以吗

sqoop从hive导入数据到mysql时出现主键冲突

持久层框架--hibernate

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增