【发布时间】:2021-06-10 12:27:50
【问题描述】:
我想从 Mysql 的模式中导入所有具有并行性的表。架构中很少有表有主键,也很少有没有。如果我们设置 no of mappers(--m>1) 没有主键的表会失败。
我们如何以并行方式导入所有表?
【问题讨论】:
我想从 Mysql 的模式中导入所有具有并行性的表。架构中很少有表有主键,也很少有没有。如果我们设置 no of mappers(--m>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。请注意:这只是一个示例,实际分布可能会有所不同。
【讨论】:
如果你有整数列,而不是 PK,均匀分布,你可以将它用作拆分,跳过我在这里写的所有内容并阅读:Sqoop import : composite primary key and textual primary key
如果你有一些列组合可以确定性地定义行的顺序(复合 PK 候选),你可以使用 row_number,见https://stackoverflow.com/a/67910296/2700344
可以使用不确定的 row_number 吗? sqoop 将计算查询以确定最小值和最大值以获取范围,然后将在具有过滤器的不同映射器中执行相同的查询以获取范围,如果 row_number 不是确定性的 - 那么同一行可能出现在不同的范围中,所以,答案是否,应该是确定性的。
如果您没有这样的复合键,那么您可能可以使用 Oracle 中的 rowid 等其他方式用于相同目的(仅当表在您的导入作业范围内是静态的,因为 ROWID 可以更改为例如,如果删除并重新插入某些行,则重新加载表)。如果是 MySQL,那么很遗憾,您没有这样的专栏。唯一的解决方案是将自动增量序列代理主键添加到您的表并填充它。
【讨论】: