Open uiosun opened 3 weeks ago
我之前没用过 clickhouse
注意到表引擎是 ReplacingMergeTree,开发者一般是怎么使用这个数据呢?
执行 Final 有效:
SELECT *
FROM `default`.stock_basic
FINAL
或者每次跑完数据,将 basic 的数据去重一次?
ReplacingMergeTree对数据的合并是后台合并,会存在一定程度的延迟。 目前大概有三种解决方案,实际上都不是很优雅,在数据量大的时候会对性能有显著影响
后期可以考虑的优化方向:
我是家用机装的 ClickHouse,每天开关机
不知道是不是合并被打断了,index daily 的部分数据在库里三天都没有自动合并
执行 OPTIMIZE TABLE index_daily FINAL;
有效
我是家用机装的 ClickHouse,每天开关机
不知道是不是合并被打断了,index daily 的部分数据在库里三天都没有自动合并
执行
OPTIMIZE TABLE index_daily FINAL;
有效
Clickhouse的合并机制确实可能会有些问题,我现在线上服务也会每天定时触发OPTIMIZE,参考脚本如下(需要修改一下,因为里面有自己封装的一些代码没放出来)
engine.client是clickhouse-connect的Client,如果用clickhouse-connect应该改动会小一些
def optimize_all():
if config.clickhouse:
config.clickhouse.connect_params.update({'send_receive_timeout': 60})
engine = ClickhouseEngine(config)
for database in ['tushare']:
for table in engine.client.query(
f'''
SELECT table_name
FROM information_schema.tables
WHERE information_schema.tables.table_schema = '{database}'
'''
).result_rows:
table_name = table[0]
# 我们主要OPTIMIZE解决的是ReplacingMergeTree合并延迟的问题,这里count()一下,如果和带FINAL的count()不一致,说明有合并延迟
try:
count = engine.client.query(f'SELECT count() FROM {database}.{table_name}').result_rows[0][0]
count_final = engine.client.query(f'SELECT count() FROM {database}.{table_name} FINAL').result_rows[0][
0
]
if count == count_final:
logging.info(f'Table {database}.{table_name} has no merge delay, skip optimize')
continue
except Exception as e:
logging.error(f'Error counting table {database}.{table_name}: {e}')
continue
logging.info(f'Optimizing table: {database}.{table_name}')
try:
engine.client.query(f'OPTIMIZE TABLE {database}.{table_name} FINAL')
except Exception as e:
logging.error(f'Error optimizing table {database}.{table_name}: {e}')
# 失败了重新初始化一个Client,防止出现锁的问题
engine = ClickhouseEngine(config)
目前也在考虑支持Apache Doris(SelectDB)以及StarRocks,这两个库支持Unique的模型,在这个场景下会更友好一些
哇哦,我研究研究哈哈,感觉很强!
按照 https://github.com/zhangbc97/tushare-integration/issues/9 的脚本顺序,昨日执行的基础数据拉取
今天用的时候,发现 basic 表,有多条数据重复(所有字段的值相同)
譬如:000003.SZ 000003 PT金田A(退),在该表有两条
但 000001.SZ、000002.SZ、000004.SZ 都正常,简单截取一下按 ts_code 排序,希望有帮助: