# StarRocks/Doris 深度实践

张开发
2026/6/7 22:44:26 15 分钟阅读
# StarRocks/Doris 深度实践
StarRocks/Doris 深度实践极速全场景 OLAP 引擎一、为什么选择 StarRocks/Doris1.1 OLAP 引擎选型对比引擎优势劣势适用场景ClickHouse单表查询极快Join 能力弱、运维复杂日志分析、单表聚合Presto/Trino联邦查询强无索引、延迟高即席查询、跨源查询Elasticsearch全文搜索强聚合性能弱搜索、日志检索StarRocks/DorisJoin 能力强、运维简单生态相对新多维分析、实时数仓1.2 StarRocks vs Doris关系StarRocks fork 自 Doris两者同源但已分化特性DorisStarRocksJoin 优化Hash JoinCBO 向量化 Join物化视图单表聚合多表 Join 物化联邦查询支持支持更强写入性能较高更高向量化社区活跃度高更高企业采用百度、小米美团、字节、网易选型建议新项目优先 StarRocks性能更优、社区更活跃已有 Doris 集群可继续用兼容性好本文以 StarRocks 为主Doris 差异会标注1.3 核心优势StarRocks MySQL 协议 MPP 架构 向量化引擎 核心优势: 1. 极速查询 - 向量化执行比 Doris 快 3-10 倍 2. 灵活更新 - 支持 Upsert、部分更新 3. 实时写入 - 微批次提交秒级可见 4. 联邦查询 - 一张 SQL 查遍 Hive/Iceberg/MySQL/ES 5. 运维简单 - 无外部依赖FEBE 即可运行量化对比某电商实测查询类型DorisStarRocksClickHouse单表聚合1.2s0.4s0.3s多表 Join5.8s1.2s8.5s点查50ms30ms20ms并发查询100 QPS300 QPS150 QPS二、架构原理2.1 整体架构┌─────────────────────────────────────────────────────────────────┐ │ 客户端层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ MySQL │ │ JDBC │ │ Spark │ │ Flink │ │ │ │ Client │ │ Driver │ │ Connector│ │ Connector│ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘ ↓ (MySQL 协议) ┌─────────────────────────────────────────────────────────────────┐ │ Frontend (FE) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 解析器 │ │ 优化器 │ │ 调度器 │ │ │ │ (Parser) │ │ (CBO) │ │ (Planner)│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ 元数据管理 (MetaService) │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ↓ (RPC) ┌─────────────────────────────────────────────────────────────────┐ │ Backend (BE) │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ 查询执行引擎 (Execution Engine) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ 向量化 │ │ 管道执行 │ │ 并行计算 │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 存储引擎 │ │ 索引管理 │ │ 缓存管理 │ │ │ │ (Column) │ │ (Bitmap 等) │ │ (Page) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────────┘2.2 数据模型三种数据模型1. Aggregate 模型聚合模型 - 主键相同的行自动聚合 - 适用预聚合场景UV、PV、Sum 示例: CREATE TABLE ads_uv_daily ( date DATE, user_id BIGINT, pv SUM, uv BITMAP_UNION ) AGGREGATE KEY(date, user_id); 2. Unique 模型主键模型 - 主键唯一支持 Upsert - 适用需要更新删除的场景 示例: CREATE TABLE dwd_order_detail ( order_id BIGINT, user_id BIGINT, amount DECIMAL(18,2), status INT ) UNIQUE KEY(order_id); 3. Duplicate 模型明细模型 - 保留所有明细数据 - 适用日志、流水等无需去重场景 示例: CREATE TABLE ods_click_log ( event_time DATETIME, user_id BIGINT, page_url STRING ) DUPLICATE KEY(event_time, user_id);2.3 分区与分桶分区Partition- 按范围分区RANGE - 通常按时间天/月 - 便于数据生命周期管理 示例: PARTITION BY RANGE(event_time) ( PARTITION p20260401 VALUES LESS THAN (2026-04-02), PARTITION p20260402 VALUES LESS THAN (2026-04-03), PARTITION p20260403 VALUES LESS THAN (2026-04-04) )分桶Bucket- 按 Hash 分桶 - 决定并行度 - 影响查询性能 分桶数计算: - 单表数据量 / 1GB 分桶数 - 或BE 节点数 * CPU 核数 * (1-3) 示例: DISTRIBUTED BY HASH(order_id) BUCKETS 32三、实战操作3.1 部署配置FE 配置fe.conf# FE 节点配置priority_networks192.168.1.0/24 edit_log_port9010http_port8030query_port9030rpc_port9020BE 配置be.conf# BE 节点配置priority_networks192.168.1.0/24 be_port9060brpc_port8040webserver_port8040heartbeat_service_port9050# 存储路径storage_root_path/data/starrocks/storage# 内存配置mem_limit80%# 查询配置disable_storage_page_cachefalse部署命令# 启动 FE./fe/bin/start_fe.sh--daemon# 添加 FE 节点MySQL 客户端mysql-h127.0.0.1-P9030-uroot ALTER SYSTEM ADD FOLLOWERfe-2:9010;ALTER SYSTEM ADD FOLLOWERfe-3:9010;# 启动 BE./be/bin/start_be.sh--daemon# 添加 BE 节点ALTER SYSTEM ADD BACKENDbe-1:9050;ALTER SYSTEM ADD BACKENDbe-2:9050;ALTER SYSTEM ADD BACKENDbe-3:9050;3.2 表设计实时数仓表设计-- ODS 层明细数据CREATETABLEIFNOTEXISTSods_order_info(order_idBIGINTCOMMENT订单 ID,user_idBIGINTCOMMENT用户 ID,amountDECIMAL(18,2)COMMENT订单金额,statusTINYINTCOMMENT订单状态,create_timeDATETIMECOMMENT创建时间,update_timeDATETIMECOMMENT更新时间)DUPLICATEKEY(order_id,create_time)PARTITIONBYRANGE(create_time)(PARTITIONp20260401VALUESLESS THAN(2026-04-02),PARTITIONp20260402VALUESLESS THAN(2026-04-03),PARTITIONp20260403VALUESLESS THAN(2026-04-04))DISTRIBUTEDBYHASH(order_id)BUCKETS32PROPERTIES(replication_num3,storage_formatDEFAULT,light_schema_changetrue);-- DWD 层明细事实表CREATETABLEIFNOTEXISTSdwd_order_detail(order_idBIGINTCOMMENT订单 ID,user_idBIGINTCOMMENT用户 ID,amountDECIMAL(18,2)COMMENT订单金额,pay_amountDECIMAL(18,2)COMMENT实付金额,category_idBIGINTCOMMENT品类 ID,brand_idBIGINTCOMMENT品牌 ID,create_timeDATETIMECOMMENT创建时间)UNIQUEKEY(order_id)PARTITIONBYRANGE(create_time)(PARTITIONp20260401VALUESLESS THAN(2026-04-02),PARTITIONp20260402VALUESLESS THAN(2026-04-03))DISTRIBUTEDBYHASH(order_id)BUCKETS32PROPERTIES(replication_num3,enable_mow_light_deletetrue);-- DWS 层轻度聚合CREATETABLEIFNOTEXISTSdws_order_daily(dtDATECOMMENT日期,category_idBIGINTCOMMENT品类 ID,order_countBIGINTSUMCOMMENT订单数,gmvDECIMAL(20,2)SUMCOMMENT交易额,buyer_countBIGINTBITMAP_UNIONCOMMENT购买人数)AGGREGATEKEY(dt,category_id)DISTRIBUTEDBYHASH(category_id)BUCKETS16PROPERTIES(replication_num3);-- ADS 层应用数据CREATETABLEIFNOTEXISTSads_category_ranking(dtDATECOMMENT日期,category_name STRINGCOMMENT品类名称,gmvDECIMAL(20,2)COMMENT交易额,gmv_rankBIGINTCOMMENT排名,mom_growthDECIMAL(10,4)COMMENT环比增长)DUPLICATEKEY(dt)DISTRIBUTEDBYHASH(dt)BUCKETS10PROPERTIES(replication_num3);3.3 数据导入Stream Load实时导入# 导入 JSON 数据curl--location-trusted-uuser:password\-Torder_data.json\-Hlabel:label_20260409_001\-Hcolumn_separator: ,\-Hcolumns: order_id,user_id,amount,status,create_time\http://be-1:8040/api/ods_order_info/_stream_load# 导入 CSV 数据curl--location-trusted-uuser:password\-Torder_data.csv\-Hlabel:label_20260409_002\-Hcolumn_separator: ,\-Hformat: csv\http://be-1:8040/api/ods_order_info/_stream_loadRoutine LoadKafka 实时导入-- 创建 Kafka 导入任务CREATEROUTINELOADods_order_info_loadONods_order_infoCOLUMNSTERMINATEDBY,COLUMNS(order_id,user_id,amount,status,create_time)WHEREstatus!-1PROPERTIES(desired_concurrent_number3,max_batch_interval10,max_batch_rows100000)FROMKAFKA(kafka_broker1kafka-1:9092,kafka_broker2kafka-2:9092,kafka_broker3kafka-3:9092,kafka_topicods.order.events,kafka_partitions0,1,2,3,property.client.idstarrocks_ods_order,property.group.idstarrocks_ods_order_group,property.auto.offset.resetearliest);-- 查看导入状态SHOWLOADFROMods_order_info_load;-- 暂停/恢复导入STOPROUTINELOADFORods_order_info_load;RESUMEROUTINELOADFORods_order_info_load;Insert IntoETL 写入-- ODS → DWDINSERTINTOdwd_order_detailSELECTorder_id,user_id,amount,amount-discountASpay_amount,category_id,brand_id,create_timeFROMods_order_infoWHEREdt2026-04-08;-- DWD → DWS聚合INSERTINTOdws_order_dailySELECTDATE(create_time)ASdt,category_id,COUNT(*)ASorder_count,SUM(amount)ASgmv,BITMAP_UNION(BITMAP_BUILD(user_id))ASbuyer_countFROMdwd_order_detailWHEREDATE(create_time)2026-04-08GROUPBYDATE(create_time),category_id;Broker LoadHDFS/S3 导入-- 从 HDFS 导入LOADLABEL ods_order_info_load_20260409(DATAINFILE(hdfs://namenode:8020/data/ods/order_info/*.parquet)INTOTABLEods_order_info FORMATASPARQUET)WITHBROKER hdfs_broker(usernamehdfs_user,passwordhdfs_password)PROPERTIES(timeout3600,max_filter_ratio0.01);3.4 物化视图同步物化视图-- 创建物化视图自动刷新CREATEMATERIALIZEDVIEWmv_category_dailyASSELECTDATE(create_time)ASdt,category_id,COUNT(*)ASorder_count,SUM(amount)ASgmv,COUNT(DISTINCTuser_id)ASbuyer_countFROMdwd_order_detailGROUPBYDATE(create_time),category_id;-- 查询自动路由到物化视图-- 无需修改 SQL优化器自动选择SELECTDATE(create_time)ASdt,category_id,COUNT(*)ASorder_count,SUM(amount)ASgmvFROMdwd_order_detailWHEREDATE(create_time)2026-04-01GROUPBYDATE(create_time),category_id;异步物化视图-- 创建异步物化视图CREATEMATERIALIZEDVIEWmv_order_summary REFRESH ASYNCSTART(2026-04-09 00:00:00)EVERY(INTERVAL1HOUR)PROPERTIES(replication_num3)ASSELECTDATE_TRUNC(hour,create_time)AShour,status,COUNT(*)ASorder_count,SUM(amount)ASgmvFROMdwd_order_detailGROUPBYDATE_TRUNC(hour,create_time),status;-- 手动刷新REFRESH MATERIALIZEDVIEWmv_order_summary;-- 查看刷新状态SHOWALTERTABLEMATERIALIZEDVIEWmv_order_summary;3.5 联邦查询创建 External Catalog-- Hive CatalogCREATEEXTERNAL CATALOG hive_catalog PROPERTIES(typehive,hive.metastore.uristhrift://hive-metastore:9083);-- Iceberg CatalogCREATEEXTERNAL CATALOG iceberg_catalog PROPERTIES(typeiceberg,iceberg.catalog.typehive,hive.metastore.uristhrift://hive-metastore:9083);-- MySQL CatalogCREATEEXTERNAL CATALOG mysql_catalog PROPERTIES(typejdbc,jdbc.userroot,jdbc.passwordpassword,jdbc.urljdbc:mysql://mysql:3306/test,jdbc.driver.urljdbc:mysql://mysql:3306,jdbc.driver.classcom.mysql.cj.jdbc.Driver);跨源查询-- 查询 Hive 表SELECT*FROMhive_catalog.dw.order_detailLIMIT100;-- 查询 Iceberg 表SELECT*FROMiceberg_catalog.prod.order_factLIMIT100;-- 跨源 JoinStarRocks Hive MySQLSELECTs.order_id,s.amount,u.user_name,p.product_nameFROMdwd_order_detail sJOINhive_catalog.dim.user_dim uONs.user_idu.user_idJOINmysql_catalog.product pONs.product_idp.idWHEREs.dt2026-04-08;四、性能优化4.1 索引优化前缀索引-- 自动创建Duplicate/Unique 模型的前 N 列-- 无需手动创建默认前 36 字节ZoneMap 索引-- 自动创建每列都有-- 记录每列的 Min/Max/Null Count-- 用于谓词下推Bitmap 索引-- 手动创建高基数字段CREATEINDEXidx_user_idONdwd_order_detailUSINGBITMAP(user_id);-- 适用于-- - 等值查询-- - IN 查询-- - 去重计数倒排索引-- 手动创建文本字段CREATEINDEXidx_product_nameONdwd_order_detailUSINGINVERTED(product_name);-- 适用于-- - 模糊查询-- - 全文检索4.2 SQL 优化执行计划分析-- 查看执行计划EXPLAINSELECT*FROMdwd_order_detailWHEREorder_id123456;-- 查看详细执行计划含成本EXPLAINVERBOSESELECT*FROMdwd_order_detailWHEREorder_id123456;-- 查看 Profile查询后SHOWPROFILE;常见优化技巧-- 1. 避免 SELECT *SELECTorder_id,user_id,amountFROMdwd_order_detail;-- 推荐SELECT*FROMdwd_order_detail;-- 不推荐-- 2. 利用分区裁剪SELECT*FROMdwd_order_detailWHEREcreate_time2026-04-08;-- 会裁剪分区-- 3. 利用分桶裁剪SELECT*FROMdwd_order_detailWHEREorder_id123456;-- 只查一个分桶-- 4. 避免函数操作导致索引失效WHEREDATE(create_time)2026-04-08;-- 索引失效WHEREcreate_time2026-04-08ANDcreate_time2026-04-09;-- 索引生效-- 5. 大表 Join 小表小表广播SELECT/* BROADCAST(u) */*FROMdwd_order_detail oJOINdim_user uONo.user_idu.user_id;4.3 参数调优查询参数-- 设置并发度SETSESSIONparallel_fragment_exec_instance_num4;-- 设置内存限制SETSESSIONexec_mem_limit4G;-- 设置超时时间SETSESSIONquery_timeout300;-- 启用 CBOSETSESSIONenable_cbotrue;-- 启用向量化SETSESSIONenable_vectorized_enginetrue;BE 参数调优# be.conf# 内存限制mem_limit80%# 查询并发度be_threads_per_query_per_fragment4# 存储页缓存disable_storage_page_cachefalsestorage_page_cache_limit20GB# 写入并发write_thread_pool_size48五、生产环境落地案例5.1 案例背景公司某电商平台规模日订单 300 万 日增数据 800GB团队数据团队 45 人建设前痛点ClickHouse Join 能力弱多维分析困难Presto 查询延迟高平均 5-10 秒运维复杂多套系统无法支持实时更新5.2 建设方案阶段一实时数仓2 个月- StarRocks 集群部署3 FE 6 BE - Kafka → StarRocks 实时导入 - 核心表迁移20 张表阶段二多维分析2 个月- 物化视图建设 - 联邦查询整合 Hive/Iceberg - 报表迁移阶段三优化治理持续- 性能调优 - 资源隔离 - 监控告警5.3 建设效果指标建设前建设后提升查询延迟5-10s0.5-2s80% ↓并发能力50 QPS300 QPS6 倍 ↑运维成本3 套系统1 套系统67% ↓数据可见性分钟级秒级90% ↓六、总结核心要点StarRocks 是全场景 OLAP- 单表、Join、聚合都强数据模型选择关键- Aggregate/Unique/Duplicate 按需选择分区分桶影响性能- 合理设计决定查询效率物化视图是利器- 自动加速查询联邦查询整合数据- 一张 SQL 查遍所有数据源最佳实践表设计:-按时间分区天/小时-分桶数 BE 节点数 * CPU * (1-3)-高基数字段放前面数据导入:-实时Routine LoadKafka-批量Stream Load / Broker Load-ETL:INSERT INTO查询优化:-避免 SELECT *-利用分区/分桶裁剪-物化视图加速运维管理:-监控 BE 内存使用-定期 Compaction-日志定期清理附录A. 版本兼容性StarRocks 版本MySQL 协议Flink ConnectorSpark Connector2.x5.71.13-1.153.1-3.23.x8.01.15-1.173.2-3.4B. 推荐阅读StarRocks 官方文档https://docs.starrocks.io/Doris 官方文档https://doris.apache.org/GitHubhttps://github.com/StarRocks/starrocks下一篇《流批一体架构落地》上一篇《Iceberg 数据湖实战》系列目录新技术实战系列

更多文章