ClickHouse在京东能源管理平台的应用实践 (clickhouse数据库)

ClickHouse在京东能源管理平台的应用实践 (clickhouse数据库)

ClickHouse 是一款面向大数据场景下的 OLAP 数据库,相比于传统的基于 Hadoop 生态圈的 OLAP 大数据分析系统,ClickHouse 具有极致的查询性能、轻量级的架构设计及维护简单等优势。目前社区活跃度高,业界应用实践日趋广泛。

一、业务介绍

京东能源管理平台是京东科技 IoT 产品部面向政企客户推出的一款利用物联网、大数据和 AI 技术实现用能企事业单位对能源大数据进行采集、监测、分析和告警的能耗分析产品,旨在帮助客户实现节能减排,降低单位产品能耗。

能源指标包括用电量、用水量和用天然气量,维度有时间维度(年、月、周、日、时)、厂家、车间、生产线类型、生产线、设备。针对这些指标和维度,提供了实时的数据多维分析与诊断服务。

二、技术选型

对于数据指标的多维度分析场景,上世纪业界就提出了 BI(商业智能)的概念。相较于 OLTP(联机事务)系统,业界把此类面向 BI 的系统统称为 OLAP(联机分析)系统。伴随着计算机软件技术的发展、从单机工具的少量数据分析(如 Excel),到中等规模数据通过分析型关系数据库构建(如微软的 SSAS)的 OLAP,再到今日的大数据时代,海量数据的实时 OLAP 分析引擎,技术上的推陈出新,工具系统上百花齐放百家争鸣,各有优势,但大体上可以将它们从架构模式上划分为两大类:

从上表可知,目前业界还没有一个 OLAP 引擎能够同时兼顾性能和灵活性的要求,京东能源管理平台在做技术选型的时候,综合考虑了模型的灵活性、部署的难易程度、开发成本、可维护性以及是否适合云端部署等因素,最终决定使用基于 MPP 架构的 ClickHouse 作为我们的 OLAP 引擎。

三、ClickHouse 的应用

1、系统架构

京东能源管理平台主要是对各种表计(水表、电表、天然气表等)设备上报的计数进行多维度分析统计、AI 诊断和出具能耗报表等。表计的原始数据通常都是累计值,如电量度数就是一个从电表安装以来,所有耗电量的一个累计。因此,我们在数据接入前会引入一个差分器对数据进行预处理,使得进入 ClickHouse 的指标数据变成可直接累加的指标,方便利用 SQL 对接 ClickHouse 实现多维的查询服务。架构图如下:

说明:

2、ClickHouse 应用

通过上面的架构图可以看出,能源平台采用 ClickHouse 作为 OLAP 引擎提供多维查询服务。下面重点从数据的接入、存储以及通用化接口设计方面谈一谈

ClickHouse 的应用:

ClickHouse 基于 kafka 引擎表的数据接入可以看做是一个典型的 ETL 过程,数据的抽取(Extract)是通过建立一张 kafka 引擎表,产生消费端订阅 kafka topic 实现;数据的转换(Transform)通过物化视图实现;数据最终加载(Load)进 MergeTree 表,实现实际数据存储。

创建 Kafka 表示例:

 1CREATETABLEstatistics_kafkaONCLUSTER'{cluster}'( 2timestampUInt64, 3levelString, 4messageString 5)ENGINE=KafkaSETTINGSkafka_broker_list='kafka.jd.com:9092', 6kafka_topic_list='statistics', 7kafka_group_name='gp-st', 8kafka_format='JSONEachRow', 9kafka_skip_broken_messages=1,10kafka_num_consumers=3;
复制代码

创建物化视图示例:

1CREATEMATERIALIZEDVIEWstatistics_viewONCLUSTER'{cluster}'TOstatistics_replicaAS2SELECTtimestamp,5FROMstatistics_kafka;
复制代码

创建 MergeTree 引擎表示例:

1CREATETABLEstatistics_replicaONCLUSTER'{cluster}'{2timestampUInt64,3dtString,4deviceIdString,5levelString,6messageString7}ENGINE=ReplicatedMergeTree('/clickhouse/tables/{shard}/statistics_replica','{replica}')8PARTITIONBYdt9ORDERBY(dt,deviceId,level);
复制代码

a. ClickHouse 表类型

本地表:实际数据存储的表,如上示例表 statistics_replica。

分布式表:一个逻辑上的表, 可以理解为数据库中的视图, 一般查询都查询分布式表. 分布式表引擎会将我们的查询请求路由本地表进行查询, 然后进行汇总最终返回给用户。创建分布式表示例:

1CREATETABLEstatisticsONCLUSTER'{cluster}'ASstatistics_replica 2ENGINE=Distributed(ck_cluster_1,test,events_local,rand());

b. Replication 和 Sharding

Replication 是 ClickHouse 提供的副本机制,对于 Replicated MergeTree 系列复制表,可以设置每个表有多份完全一样的数据存放在不同的计算节点上,每一份数据都是完整的,并且称为一个副本。

Shard:将表中的数据按照一定的规则拆分为多个部分,每个部分的数据均存储在不同的计算节点上,每个计算节点上的数据称为一个分片。

ClickHouse 基于 Replicated MergeTree 引擎与 Zookeeper 实现了复制表机制,在创建表时,可以决定表是否高可用。上一节的 statistics_replica 表,其中/clickhouse/tables/{shard}/statistics_replica 表示 Zookeeper 中对应副本表的 node。当数据写入 ReplicatedMergeTree 表时,过程如下:

3、OLAP 通用接口设计

ClickHouse 提供标准的 SQL 查询引擎,通过 JDBC 引用程序可以实现多 ClickHouse 的基本操作。OLAP 的常规操作如上卷、下钻和切片会涉及到多种维度自由组合、多种指标交叉剖析的过程,如果服务端采用 Mybatis 或 JPA 等常规 ORM 操作,工程师很容易根据不同的查询场景要求设计出对应的接口,亦或是根据大量的分支操作设计出复杂的判定性接口,鉴于此,作者从 mdx 思想获得启示,设计一套对 OLAP 优化的通用多维服务查询接口。

首先,一个典型的分析类 SQL 语句如下:

 1SELECTday_str, 2factory_name, 3workshop_name, 4prodline_name, 5device_id, 6SUM(w_total)AStotal 7FROMstatistics 8WHEREday_strBETWEEN'2020-10-01'AND'2020-12-31' 9GROUPBYday_str,factory_name,workshop_name,prodline_name,device_id10ORDERBYday_strASC;
复制代码

如上语句,我们翻译成业务语言为『分别查询 2020 年 4 季度全厂所有设备的耗电量』,从这里我们可以清楚的知道这里的维度是指『设备名称』,指标为『耗电量』,基于此,可以进一步归类,维度通常出现在 SQL 语句的 SELECT、WHERE、GROUP BY 和 ORDER BY 后面,指标则通常出现在 SELECT 后面,也就是可以总结如下模式:

1SELECT{维度},{指标}2FROMtable_name3WHERE{维度}='xxx'4GROUPBY{维度}5ORDERBY{维度};
复制代码

因此,我们可以设计如下通用接口方法:

1//通用方法2List<Map<String,Object>>queryStatisticsResult(Queryquery);4//Query类5publicclassQuery{6 privatestaticfinallongserialVersionUID=4904019884726531900L;8 *维度10privateList<String>dimensions;12*指标14privateList<Measure>measures;16*过滤条件18privateList<Filter>where;21//Measure类22publicclassMeasureimplementsSerializable{24privatestaticfinallongserialVersionUID=-8556179136317748835L;26*指标名称28@NonNull29privateStringname;31*列名33@NonNull34privateStringfield;36*聚合类型38@NonNull39privateAggregationEnumexpression;42//聚合枚举43publicenumAggregationEnum{44SUM,AVG,COUNT,MIN,MAX,COUNT_DISTINCT,PERCENTILE;
复制代码

四、总结

本文重点介绍了京东综合能源管理平台多维数据分析引擎的架构和设计,从数据接入、存储和多维分析服务设计的角度,阐述了 ClickHouse 的一种典型应用场景。希望通过本文让读者在应对大数据实时 OLAP 领域,提供一种思路和方法。当然,限于篇幅和本人水平有限,没有进一步展开阐述更多的可能性方案,随着我们对于业务的深入,系统的迭代升级,适宜于将来更优方案势必会步步推出,也请期待。

文章转载自:京东数科技术说(ID:JDDTechTalk)

原文链接:ClickHouse在京东能源管理平台的应用实践

声明:本文来自用户分享和网络收集,仅供学习与参考,测试请备份。