因为公司数仓报表使用的数据表是T+1增量导入的,每天花在增量导入上的时间很长,影响了报表的输出,
所以领导想要使用TiDB来替换数仓中的表,开启实时同步,就可以省掉增量导入的时间。
这就涉及到历史数据导入TiDB的问题,目前tidb推荐使用TiDB-lightning来进行批量导入,由于它是直接写入TiKv,所以在导入期间需要停掉TiDB的服务,并且只能使用csv文件,权衡之后还是否掉了。
最后还是打算使用Sqoop的方式,直接从hive导入到TiDB,步骤是:
1、先用Sqoop将某天的全量导入到TiDB中,此过程有可能很长,视数据量而定。
2、把同步拉起直至第二天表增量导入到hive。
3、此时停下同步,把全量的主键用Sqoop数据导入到hive,然后与hive中的表做去重,去重后的数据再次导入到TiDB
4、在同步数据失效前重新拉起同步。
如果过程中有错误或者sqoop任务挂掉,或者第3步导入时长太长,只能提前拉起同步,则有可能导致导入时主键冲突问题。
此时可以使用Sqoop的增量模式,sqoop文档在
这里
通过 --update-key 来指定数据更新的主键
如果TiDb中的有一张表:
[info]
CREATE TABLE foo(
id INT NOT NULL PRIMARY KEY,
msg VARCHAR(32),
bar INT);
[/info]
Hive中有数据为
[info]
0,this is a test,42
1,some more data,100
...
[/info]
执行 sqoop-export --table foo --update-key id --export-dir /path/to/data --connect … 相当于:
[info]
UPDATE foo SET msg='this is a test', bar=42 WHERE id=0;
UPDATE foo SET msg='some more data', bar=100 WHERE id=1;
[/info]
通过这样就能够增量的从hive导入TiDB