itinycheng / flink-connector-clickhouse

Flink SQL connector for ClickHouse. Support ClickHouseCatalog and read/write primary data, maps, arrays to clickhouse.
Apache License 2.0
347 stars 149 forks source link

Sink时,如果同一个主键的RowData包含INSERT和DELETE的RowKind操作,是否会导致数据异常? #88

Open Felix0525 opened 11 months ago

Felix0525 commented 11 months ago

依照代码逻辑: 路径:ClickHouseUpsertExecutor.java 中的executeBatch方法

@Override
public void executeBatch() throws SQLException {
    for (ClickHouseStatementWrapper clickHouseStatement :
            Arrays.asList(insertStatement, updateStatement, deleteStatement)) {
        if (clickHouseStatement != null) {
            attemptExecuteBatch(clickHouseStatement, maxRetries);
        }
    }
}

如上代码片段:如果存在以下这样的数据流(恰好在一次flush里),会不会导致1001最终被删除。

操作 主键KEY -删除 1001 +新增 1001

原因:执行statement的顺序是按照Insert、update、最后delete的。

期望得到解答,谢谢

itinycheng commented 11 months ago

@Felix0525

会有,同一个batch中存在乱序的可能,执行顺序会变成insert -> delete;

itinycheng commented 11 months ago

如果数据量小可以直接batch size设为1(强制数据有序),来规避; 或,修改代码每次遇到delete语句就强制flush一次; 我生产delete使用较少,就没怎么修改过这块;

Felix0525 commented 11 months ago

感谢回答,我还有个想法,就是计算下同个key,在同一批里去重,但是可能需要一些空间额外存储下

itinycheng commented 11 months ago

感谢回答,我还有个想法,就是计算下同个key,在同一批里去重,但是可能需要一些空间额外存储下

嗯嗯,这是个很好的方法;

ysq5202121 commented 5 months ago

@Felix0525 如果采用自增ID应该没这个问题,主键设置成ID,先删后增也是没有问题的