共计 2181 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
ClickHouse 作为一款高性能的列式数据库,在实时分析领域表现出色,但其在机器学习场景下存在明显短板:

- 缺乏原生算法支持:仅提供 stochasticLinearRegression 等少数基础算法,无法覆盖复杂场景
- 模型部署困难:不支持直接加载主流框架(如 TensorFlow/PyTorch)训练的模型
- 特征工程割裂:数据预处理通常在外部完成,导致线上线下不一致
- 资源隔离不足:模型推理可能影响查询性能
技术选型对比
方案 1:内置函数
- 适用场景:线性回归等简单模型、低延迟要求
- 优势:零部署成本、完全 SQL 化
- 局限:算法种类有限,无法自定义损失函数
方案 2:HTTP 接口集成
- 适用场景:需要复杂模型且能接受 50-100ms 延迟
- 优势:可复用现有 Python/ R 模型
- 局限:需维护服务可用性,序列化开销大
方案 3:ONNX 运行时
- 适用场景:生产级部署,要求毫秒级延迟
- 优势:本地执行无网络开销,支持大多数框架导出
- 局限:需要手动处理特征工程对齐
核心实现
内置函数示例
-- 训练线性回归模型
CREATE TABLE model_params AS
SELECT stochasticLinearRegression(
0.01, -- 学习率
0.1, -- L2 正则化
1000 -- 迭代次数
)(toFloat64(dep_delay), -- 目标变量
arrayMap(x -> toFloat64(x),
[distance, air_time] -- 特征向量
)
)
FROM flights
WHERE date < '2023-01-01';
-- 推理预测
SELECT
flight_id,
evalMLMethod(
model_params.1, -- 模型权重
[distance, air_time]
) AS pred_delay
FROM flights
WHERE date >= '2023-01-01';
HTTP 接口集成
# Flask 模型服务示例
from flask import Flask, request
import pickle
app = Flask(__name__)
model = pickle.load(open('model.pkl','rb'))
@app.route('/predict', methods=['POST'])
def predict():
try:
data = request.json['features']
return {'prediction': float(model.predict([data]))}
except Exception as e:
return {'error': str(e)}, 500
# ClickHouse 调用方式
CREATE TABLE external_models (
name String,
url String,
format String
) ENGINE = URL('http://model-service:5000/predict', 'JSON');
SELECT
url,
JSONExtractFloat(
postJSON(
external_models.url,
concat('{"features":', toJSONString(feature_array), '}')
),
'prediction'
) AS prediction
FROM (
SELECT
url,
[distance, air_time] AS feature_array
FROM flights
CROSS JOIN external_models
WHERE name = 'delay_predictor'
);
ONNX 部署步骤
-
导出 ONNX 模型(Python 示例)
import torch import torch.onnx dummy_input = torch.randn(1, 2) # 匹配特征维度 torch.onnx.export(model, dummy_input, "model.onnx") -
配置 ClickHouse
<!-- config.xml --> <onnx_models> <model> <name>flight_delay</name> <path>/models/flight_delay.onnx</path> <format>ONNX</format> </model> </onnx_models> -
SQL 推理调用
SELECT flight_id, onnxEvaluate('flight_delay', [distance, air_time]) AS pred FROM flights;
性能基准
| 方案 | 平均延迟 | QPS | CPU 占用 | 内存增量 |
|---|---|---|---|---|
| 内置函数 | 2ms | 15000 | 15% | 50MB |
| HTTP 接口 | 85ms | 800 | 30% | 200MB |
| ONNX 运行时 | 5ms | 5000 | 25% | 150MB |
测试环境:16vCPU/32GB 内存,单次推理特征维度 10
避坑指南
- 特征一致性:
- 使用相同 SQL 代码生成训练 / 推理特征
-
在 HTTP 接口中实现特征校验逻辑
-
模型版本控制:
- 通过表名后缀区分模型版本
-
ONNX 模型使用 checksum 验证
-
资源隔离:
- 为模型推理设置单独的进程池
-
使用
SET max_threads=4限制并发 -
监控指标:
- 记录
PredictedClickHouseMetrics中的推理错误 - 监控 HTTP 接口的 5xx 错误率
开放思考
当业务需要分钟级更新的实时特征时:
– 如何设计可靠的在线特征管道?
– 是否应该牺牲一定准确性换取更低延迟?
– 模型热更新策略如何兼顾稳定性和敏捷性?
正文完
发表至: 未分类
近一天内
