0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

供应链场景使用ClickHouse最佳实践

京东云 ? 来源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-18 15:05 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

关于ClickHouse的基础概念这里就不做太多的赘述了,ClickHouse官网都有很详细说明。结合供应链数字化团队在使用ClickHouse时总结出的一些注意事项,尤其在命名方面要求研发严格遵守约定,对日常运维有很大的帮助,也希望对读者有启发。

目前供应链数字化ck集群用来存储实时数据,先通过下面这张图表了解下ClickHouse数据来源。

wKgZomaYvr6AfXDtAACYKYUhf1k339.png

图中标注1和2的位置是供应链数字化研发在开发业务功能时改动量比较多的部分,随着需求变多,DTS任务和数据库表也越来越多。 通过定义研发使用约定,使我们的DTS任务、表、表字段看起来很整洁。

有哪些好处呢?

1、根据ck表名快速找到对应的DTS任务及消费jdq topic / 当然通过jdq也可快速找到对应的ck表(对不了解业务的人帮助很大)。

2、通过ck表字段即可知道该字段来自哪个业务表哪个字段(字段数据不对,联系业务值班先排查业务库的字段是否正确)。

3、快速统计到团队 或 某个ck集群有多少DTS任务(运维时不会遗漏,一目了然)

一 建表约定

1.1 表命名约定

表命名要求: 1、本地表命名必须_local结尾 2、分布式表命名必须以_all结尾;

--创建本地表, 使用on cluster default 在每个节点上都创建一张本地表
CREATETABLE本地表名 on cluster 集群名称
(
...
    ts                   DateTime Default now() COMMENT '时间搓',
    version              UInt64 COMMENT '版本号'
) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/test_local', 
    '{replica}',version)
[PARTITIONBYexpr]-- 数据分区规则
[ORDERBYexpr]-- 排序键
[SAMPLEBYexpr]-- 采样键
[SETTINGS index_granularity = 8192, ...]-- 额外参数

参数解释说明:
PARTITION BY toYYYYMM(tmsCreateTime) 按照月份分
ReplicatedReplacingMergeTree(参数1,参数2,参数3)
ORDER BY (参数1,参数2, ....); 参数1,参数2,参数3....等组成业务主键 

----创建分布式表
CREATE TABLE IF NOT EXISTS 库名.分布式表名 on cluster default AS 本地表名 
ENGINE = Distributed (default,库名,本地表名,sipHash64(分片键));


建表示例脚本:

CREATE TABLE reports_prestore_outbound_fulltrace_local on cluster `default`
(
    `sm_so_no` String COMMENT '订单号',
    `sm_waybill_code` String COMMENT '青龙运单号',
    `sm_so_type` Int64 DEFAULT 0 COMMENT '订单类型',
    `st_so_status` Int64 DEFAULT 0 COMMENT '订单状态(1初始、2定位完成、3定位失败、5拣货中、6出库完成、7取消、8转病单、9站点已收货、10已妥投、11再投中、12已拒收)',
        ?
  	`st_delivery_time` DateTime COMMENT '妥投时间',
   	`st_redeliver_time` DateTime COMMENT '再投时间',
   	`st_reject_time` DateTime COMMENT '拒收时间',
   	`version` UInt64 COMMENT '更新版本号',
    `ts` DateTime DEFAULT now() COMMENT '时间戳'
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/waybill_data_center/reports_prestore_outbound_fulltrace_local',
 '{replica}', version)
PARTITION BY toYYYYMM(so_create_time)
ORDER BY (sm_so_no,sm_waybill_code)
TTL so_create_time + toIntervalMonth(1)
SETTINGS index_granularity = 8192;

CREATE     TABLE     IF     NOT     EXISTS   `reports_prestore_outbound_fulltrace_all`     on     cluster     default     AS     `reports_prestore_outbound_fulltrace_local`
ENGINE     =     Distributed     (default,waybill_data_center,reports_prestore_outbound_fulltrace_local,sipHash64(sm_so_no));	

1.2 分区键设置

视情况大表按天分区,小表按月分区。分区键尽量使用date和datetime字段,避免string类型的分区键

分区粒度根据业务特点决定,不宜过粗或过细。 建议使用toYYYYMMDD()按天分区,如果数据量很少,100w左右,建议使用toYYYYMM()按月分区,过多的分区会占用大量的资源,会因为文件系统中的文件数量过多和需要打开的文件描述符过多,导致 SELECT 查询效率不佳

1.3 分片键设置

分布式表分片键需要采用hash函数,应避免数据热点,集中写入某个分片;

分片键尽量使用表中区分粒度较细的字段,可以时多个字段的组合,如:id / order_no

1.4 排序键/主键设置

1、有序可以保证很高的压缩比及加速查询,写入数据建议提前排序再写入数据;

2、若未指定默认为排序建,主键不保证唯一性。主键过长会拖慢写入性能,并且会造成过多的内存占用(主键常驻内存)。

1.5 字段使用约定

1、字段类型能用数字型的字段尽量用数字型,避免使用string

2、表字段命名:${业务表缩写}_${业务表字段},如: 业务表ob_shipment_m 缩写:osm, ck表字段则以osm_开头。 注意:业务表的缩写需要使用字典方式管理

3、日期字段建议默认值为1970-01-01,时间字段默认值为1970-01-01 08:00:00,使用到的地方排除掉默认值即可

4、表中必须包含:ts(时间搓)、version(flink写入jdq的时间,单位:)字段。

version— 版本列。类型为 UInt*, Date 或 DateTime。可选参数。 在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下: 如果 version 列未指定,保留最后一条。 如果 version 列已指定,保留 version 值最大的版本

5、尽量不使用Nullable类型

可以非NUll的尽量非NUll并在代码中赋予默认值,数量字段默认值为0,状态字段默认值建议使用有符号int时为-127、无符号int时为0,字符串建议默认值为空字符串。

设置成Nullable对性能影响也没有多大,可能是因为我们数据量比较小。不过官方已经明确指出尽量不要使用Nullable类型,因为Nullable字段不能被索引,而且Nullable列除了有一个存储正常值的文件,还会有一个额外的文件来存储Null标记。

1.6 新增列操作方式

本地表的修改直接执行即可。如果要对分布式表进行修改,需分如下情况进行:

?如果没有数据写入,您可以先修改本地表,然后修改分布式表。

?如果数据正在写入,您需要区分不同的类型进行操作。

修改类型 操作步骤
增加Nullable的列 1.修改本地表。 2.修改分布式表。
修改列的数据类型(类型可以相互转换)
删除Nullable列 1.修改分布式表。 2.修改本地表。
增加非Nullable的列 1.停止数据的写入。 2.执行 SYSTEM FLUSH DISTRIBUTED dbName.distributedTableName 3.修改本地表。 4.修改分布式表。 5.重新进行数据的写入。
删除非Nullable的列
修改列的名称

添加表字段SQL示例参考:

ALTER TABLE reports_prestore_outbound_fulltrace_local on  cluster default ADD COLUMN  st_redeliver_time DateTime COMMENT '再投时间';
ALTER TABLE reports_prestore_outbound_fulltrace_all on  cluster default ADD COLUMN  st_redeliver_time DateTime COMMENT '再投时间';

1.7 DDL执行注意事项

1.mutation(delete,update)操作比较重,尽量避免执行此类操作;

2.清理过期数据,应使用TTL,或者drop partition;

3.分布式DDL,分片副本节点串行执行,出现阻塞会导致后面所有DDL无法正常执行,建议轮询各分片执行DDL,尤其是变更字段类型,不建议直接on cluster default进行变更;

4.optimize table table_name final手动触发合并慎用,尽量按分区操作。

二 数据写入约定

结合供应链的使用场景,这里在flink层加工完数据后没有直接将数据写入ClickHouse集群,而是发送到JDQ队列中。这样做的优势 1、加工和存储解藕 2、JDQ消息共享;

若数据需要做主备存储,我们只需要创建新的DTS任务订阅JDQ消息,将消息写入到备用的ClickHouse集群即可。

wKgaomaYvsGAIIpsAABVKGzuWNs309.png

2.1 DTS任务命名约定

任务名规则:sc_digital_${集群ID}_${分布式表名}

使用"sc_digital_"前缀加分布式模型名称,如:sc_digital_c4omjd8fl7_reports_prestore_outbound_fulltrace_all

2.2 DTS所属项目空间

创建DTS任务时,任务需要放在《数字化-DTS任务空间》下。

2.3 DTS写入批次设置

DTS任务批次写入默认值“40W/1分钟”。这里需要根据实际情况适当调下。

建议:每次插入50W行左右数据, 最多不可超过100W行. 总之CK不像MySQL要小事务. 
比如1000W行数据, MySQL建议一次插入1W左右, 使用小事务, 执行1000次. CK建议20次,每次50W. 
这是MergeTree引擎原理决定的, 频繁少量插入会导致data part过多, 合并不过来.

2.4 DTS消费JDQ的等级

默认消费JDQ的等级为L3。消费等级要根据业务实际使用场景做相应调整。以下等级划分标准(来源于JDQ等级调整说明):

wKgZomaYvsKAEKslAAMtKLSdLwQ438.png

三 数据查询约定

针对易出问题的flink-CK链路进行双流,物理隔离,遇到问题可将查询请求一键切换至备用CK集群。

wKgaomaYvsOAY--0AAEPnvUtYeU156.png

3.1 尽量prewhere替代where

值不变得字段必须使用prewhere特性提升查询性能

注意:prewhere目前只能用于MergeTree系列的表引擎

3.2 where条件,尽量包含分区键,和主键索引前缀字段

尽量遵循最左原则,如果跳过最左前缀字段,使用其他字段查询,也会走索引过滤一些数据,但是效果不好;

3.3 避免使用Select *

避免使用 SELECT * 操作,这是一个非常影响的操作。应当对列进行裁剪,只选择你需要的列,因为字段越少,消耗的 IO 资源就越少,从而性能就越高。

3.4 where、group by 顺序

where和group by中的列顺序,要和建表语句中order by的列顺序统一,并且放在最前面使得它们有连续不间断的公共前缀,否则会影响查询性能。

3.5 JOIN 性能不是很好,应避免使用

替代方案:业务设计使用大宽表,或使用in替代多变关联,或使用字典,但需注意内存占用;如必须使用join,右表选小表(hash join 右表会全部加载到内存);

3.6 使用final去重

使用final去重查询,尽量不要用argMax

3.7 二级索引

1、可变值字段不能添加二级索引。按此字段做条件查询会先走索引在合并数据,查出而外的中间态数据。

2、 增加二级索引只对后续新增数据生效。如需对历史数据也走索引,需要按分区刷新数据

创建二级索引示例

Alter table reports_prestore_outbound_fulltrace_local ON cluster default 
    ADD INDEX idx_belong_province_code belong_province_code TYPE set(0) GRANULARITY 5;
Alter table reports_prestore_outbound_fulltrace_local ON cluster default 
    ADD INDEX idx_st_delivery_time st_delivery_time TYPE minmax GRANULARITY 5;

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字化
    +关注

    关注

    8

    文章

    9660

    浏览量

    63930
  • 供应链
    +关注

    关注

    3

    文章

    1739

    浏览量

    40246
  • House
    +关注

    关注

    0

    文章

    5

    浏览量

    6811
  • click
    +关注

    关注

    0

    文章

    4

    浏览量

    2101
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    海辰储能加入供应链ESG管理倡议

    近日,由SCSI倡议联合发起方藏格矿业主办的“第二届上市公司可持续发展前沿实践研讨会暨供应链ESG管理倡议扩容仪式”在青海格尔木顺利举行,海辰储能正式加入"供应链ESG管理倡议"
    的头像 发表于 08-14 17:36 ?239次阅读

    施耐德电气的三重创新打造新质供应链范本

    全球权威研究机构Gartner在2025年6月正式发布了备受瞩目的“2025年全球供应链25强榜单”。该榜单凭借全面且严格的评估标准,评估维度涵盖企业财务绩效,环境、社会和治理(ESG)实践成果,已成为全球供应链领域的重要参考依
    的头像 发表于 08-13 16:54 ?324次阅读

    天合光能加入供应链ESG管理倡议

    7月31日,由SCSI倡议联合发起方藏格矿业主办的“第二届上市公司可持续发展前沿实践研讨会暨供应链ESG管理倡议扩容仪式”在青海格尔木顺利举行。天合光能作为全球领先的光储智慧能源整体解决方案提供商
    的头像 发表于 08-08 17:46 ?782次阅读

    京东零售在智能供应链领域的前沿探索与技术实践

    受邀出席并担任《AI+智慧物流与供应链分享会》联席主席,联合发表《AI科技助力供应链产业升级》主题演讲,深入介绍了京东零售在智能供应链领域的前沿探索与技术实践,并深入分析了AI驱动产业
    的头像 发表于 08-04 16:10 ?255次阅读
    京东零售在智能<b class='flag-5'>供应链</b>领域的前沿探索与技术<b class='flag-5'>实践</b>

    RFID标签在服装供应链管理中的应用

    二、RFID标签在服装供应链管理中的优势高效率:RFID可以快速批量读取服装信息,大幅缩短操作时间,提高供应链管理效率。准确性:RFID减少了人工操作的错误率,提高了服装供应链管理的准确性和可靠性
    的头像 发表于 07-14 17:02 ?245次阅读
    RFID标签在服装<b class='flag-5'>供应链</b>管理中的应用

    安富利:供应链强则企业强

    外围局势风云变幻的当下,供应链的安全与稳定受到前所未有的重视。对于注重持续创新的硬科技企业而言,情况更是如此。面对复杂多变的市场环境,硬科技企业能够破浪前行、韧性增长的“武功秘籍”之一,正是供应链
    发表于 03-25 18:09 ?252次阅读
    安富利:<b class='flag-5'>供应链</b>强则企业强

    AI大模型在工业领域的供应链管理方向的应用

    AI 大模型在工业领域的供应链管理中具有精准预测、个性化需求预测、动态实时调整和供应商管理风险评估与预警等功能,帮助企业提高供应链效率和应对市场变化。
    的头像 发表于 02-14 11:40 ?646次阅读
    AI大模型在工业领域的<b class='flag-5'>供应链</b>管理方向的应用

    兆芯最佳实践应用场景解决方案发布

    《兆芯最佳实践应用场景解决方案》现已正式发布,扫描下方二维码或点击阅读原文即可获取下载。
    的头像 发表于 01-13 14:45 ?653次阅读

    天合光能入选国家级数字化供应链案例

    近日,工业和信息化部公示“2024年实数融合典型案例名单”,天合光能以“基于产销协同一体化的供应链精细数字化管控”成功入选国家级数字化供应链案例,这是继国家绿色供应链、全国供应链创新与
    的头像 发表于 01-13 11:48 ?813次阅读

    利用Minitab应对供应链中断问题

    供应链中断是不可避免的,但积极的措施和数据驱动的战略可以减轻其影响。Minitab全面的数据分析和问题解决工具使组织能够分析、优化和调整其供应链,以应对不可预见的挑战,确保面对中断时的弹性和连续性。
    的头像 发表于 01-02 17:16 ?508次阅读

    保隆科技荣获东风日产最佳供应链合作伙伴

    近日,东风日产在广州举行2024年供应链合作伙伴大会,保隆科技张祖秋董事长应邀出席并在大会发言,保隆科技被授予“最佳供应链合作伙伴”,这是东风日产对保隆科技长期以来良好合作、提供优秀产品和优质服务的高度肯定。
    的头像 发表于 12-30 17:22 ?869次阅读

    奥托立夫荣膺东风日产“2024年度最佳供应链合作伙伴”

    近日,东风日产供应链合作伙伴大会在广州隆重召开,吸引了近700家业界精英共襄盛举,共谋未来发展新篇章。在此次大会中,奥托立夫凭借其长期以来的杰出表现,荣获了东风日产颁发的“2024年度最佳供应链合作伙伴”奖项,彰显了双方合作的深
    的头像 发表于 12-27 11:35 ?806次阅读

    菜鸟与麦当劳中国发布智慧供应链新成果

    近日,菜鸟与麦当劳中国携手发布了智慧供应链的新成果——“一箱一码”项目。这一项目标志着国内餐饮行业首次大规模落地应用“一箱一码”数字化实践,展现了双方在供应链数字化领域的深度合作与创新。 通过引入
    的头像 发表于 12-03 13:55 ?763次阅读

    智能制造装备行业的供应链特点分析

    智能制造装备行业供应链涉及多个环节,包括原材料采购、生产制造、物流配送和售后服务等,其特点包括复杂性与多样性、全球化与分散性、技术密集型和快速变化性。供应链面临的挑战包括数据孤岛、信息不对称、供应链中断风险和成本控制难度大等。
    的头像 发表于 11-28 10:15 ?949次阅读
    智能制造装备行业的<b class='flag-5'>供应链</b>特点分析

    活动回顾 艾体宝 开源软件供应链安全的最佳实践 线下研讨会圆满落幕!

    艾体宝与Mend举办研讨会,聚焦开源软件供应链安全,邀请行业专家分享合规管理、治理之路及最佳实践,圆桌讨论加深理解,助力企业更安全稳健发展。
    的头像 发表于 10-30 17:52 ?885次阅读
    活动回顾 艾体宝 开源软件<b class='flag-5'>供应链</b>安全的<b class='flag-5'>最佳</b><b class='flag-5'>实践</b> 线下研讨会圆满落幕!