
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度如果你是一名 Python 开发者正在处理海量数据分析、实时报表或构建数据中台那么你很可能正在为数据库的选择而纠结。传统的 MySQL 在千万级数据量下查询缓慢而 Hadoop/Spark 生态又过于笨重开发和运维成本高昂。有没有一个既能像 MySQL 一样简单易用又能提供海量数据分析能力的数据库Apache Doris 的出现就是为了解决这个痛点。Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库。它最大的吸引力在于对开发者极其友好完全兼容 MySQL 协议这意味着你可以用熟悉的mysql-client或 Python 的mysql-connector直接连接和操作同时它在海量数据下的聚合查询性能远超传统关系型数据库。无论是做用户行为分析、实时数仓还是构建 BI 报表系统Doris 都能显著降低你的技术复杂度。然而很多 Python 开发者在初次接触 Doris 时往往会陷入两个误区一是把它当作另一个 MySQL 来用没有发挥其列式存储和向量化执行引擎的优势二是在部署和集成时被 FE、BE、Broker 等组件搞晕卡在环境配置的第一步。这篇文章的目的就是帮你避开这些坑。本文将从一个 Python 开发者的视角手把手带你完成 Apache Doris 从零部署到实战应用的全过程。我们不仅会详细讲解单机与集群部署的每一步操作还会深入演示如何用 Python 连接 Doris、执行高效查询、并通过 Superset 实现数据可视化。更重要的是我会分享在实际项目中如何设计表结构、优化查询性能以及那些官方文档里不会明说但直接影响稳定性的生产环境最佳实践。读完本文你将能独立搭建一个可用的 Doris 分析环境并掌握将其融入现有 Python 数据栈的核心方法。1. 为什么 Python 开发者需要关注 Apache Doris在深入技术细节之前我们首先要回答一个根本问题在众多数据库中选择 Doris对 Python 开发者而言真正的价值是什么它解决的不仅仅是“数据存得下”的问题更是“数据查得快”和“开发搞得定”的问题。想象一个典型的场景你的 Python 应用通过 Flink/Kafka 实时接收用户点击流数据需要每分钟产出渠道分析报表。如果使用 MySQL随着数据量增长GROUP BY查询会越来越慢最终拖垮整个应用。如果引入 Spark你需要维护一整套 Hadoop 生态学习成本陡增。而 Doris 的定位恰恰介于两者之间——它提供了接近 MySQL 的使用体验却拥有媲美专业数仓的查询性能。其核心优势对 Python 技术栈尤其友好协议兼容零学习成本直接使用pip install mysql-connector-python或pymysql即可连接SQL 语法高度兼容 MySQL。你不需要为了用 Doris 而重写业务逻辑。极速查询应对复杂分析Doris 采用列式存储、向量化执行引擎和预聚合技术如物化视图。对于多维度、大数据量的聚合查询这正是数据分析的典型场景其速度可以是 MySQL 的数十倍甚至上百倍。简化架构降低运维负担Doris 本身是一个紧耦合的系统FEFrontend负责元数据和查询协调BEBackend负责数据存储和计算。部署和运维比 Hadoop/Spark 这种松散组合的系统要简单得多特别适合中小团队。生态完善无缝对接Doris 支持从 Kafka、Flink、Spark、DataX 等多种数据源高效导入数据。同时它能与 Superset、Metabase、Tableau 等主流 BI 工具无缝集成方便你快速搭建数据可视化平台。因此如果你的项目符合以下特征那么 Doris 是一个非常值得投入学习的技术选项数据量在亿级以上且查询以分析型OLAP为主。团队以 Python/Java 开发者为主缺乏专职的大数据运维人员。需要提供低延迟的实时数据查询服务。希望用一套系统同时满足实时数据接入和离线分析需求。接下来我们将从最基础的部署开始。2. 核心概念解析FE、BE 与数据模型在动手部署之前理解 Doris 的几个核心概念至关重要这能帮助你在后续配置和排错时心中有数。Frontend (FE) 与 Backend (BE)这是 Doris 架构的两个核心组件通常以多节点集群方式工作。FE前端节点。负责管理元数据库、表、分区信息、接收客户端连接、解析和规划查询、协调查询执行。你可以把它理解为集群的“大脑”和“调度中心”。一个集群有多个 FE 节点其中一个为 Leader其余为 Follower通过选举实现高可用。BE后端节点。负责数据存储、查询执行。数据表实际以分片Tablet的形式分布在各个 BE 节点上。BE 节点是真正的“劳动力”负责繁重的计算和 I/O 任务。对于开发测试我们可以将 FE 和 BE 部署在同一台机器上。但在生产环境必须将它们分离并部署多个实例以保证高可用和水平扩展。数据模型Doris 的表设计模型直接决定了查询性能这是与 MySQL 最大的不同点。主要有三种模型Duplicate Key 模型明细模型。指定排序列但数据完全保留不进行聚合。适用于需要存储原始明细数据的场景如日志。Aggregate Key 模型聚合模型。指定维度列和指标列并定义聚合函数如 SUM、MAX。相同维度列的数据会自动聚合极大地节省存储空间并提升查询速度。这是 Doris 最常用、最能体现其优势的模型。Unique Key 模型唯一模型。指定主键列对于相同主键的数据进行覆盖更新。适用于有更新需求的数据。理解这些模型是写出高效 Doris SQL 的前提。例如对于一张销售记录表如果你经常需要查询每个产品的总销售额那么使用 Aggregate 模型将product_id设为维度列sales设为指标列并指定聚合函数为SUMDoris 会在数据导入时自动聚合查询时直接返回结果速度极快。3. 环境准备单机部署规划我们首先从最简单的单机部署开始这是学习和测试的最佳方式。请确保你的环境满足以下要求操作系统CentOS 7、Ubuntu 16.04 或 macOS。本文以CentOS 7.9为例。JavaDoris 的 FE 依赖 Java 运行环境。需要JDK 8 或 JDK 11推荐 JDK 11。请确保已安装并配置好JAVA_HOME。硬件建议至少 4 核 CPU8 GB 内存50 GB 磁盘空间。网络确保机器可以访问互联网以下载安装包并且防火墙开放所需端口后续会说明。使用以下命令检查基础环境# 检查系统版本 cat /etc/redhat-release # 检查 Java 版本 java -version # 检查内存和磁盘 free -h df -h如果未安装 Java可以通过以下方式安装 OpenJDK 11# 对于 CentOS/RHEL sudo yum install -y java-11-openjdk-devel # 对于 Ubuntu/Debian sudo apt update sudo apt install -y openjdk-11-jdk # 验证安装 java -version # 应输出类似openjdk version 11.0.xx4. 实战第一步下载与安装 Apache Doris我们将从 Apache Doris 官网下载最新的稳定版二进制包进行安装。这里以2.0.4版本为例。步骤 1下载 Doris 安装包访问 Apache Doris 下载页面 选择适合的版本。你也可以直接使用 wget 命令下载。# 创建安装目录 mkdir -p /opt/doris cd /opt/doris # 下载 Doris 2.0.4 版本请根据官网最新链接调整 wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0.4-bin-x64.tar.gz # 解压安装包 tar -zxvf apache-doris-2.0.4-bin-x64.tar.gz # 进入解压后的目录这里会包含 fe 和 be 两个子目录 cd apache-doris-2.0.4/ ls -la # 你应该能看到 fe/ 和 be/ 目录步骤 2部署 Frontend (FE)FE 的配置相对简单我们首先启动它。# 进入 FE 目录 cd fe # 修改 FE 配置文件 conf/fe.conf # 主要关注以下几个参数其他保持默认 vim conf/fe.conf在fe.conf中找到并修改以下配置项如果不存在则添加# 设置元数据目录确保该目录有写权限 meta_dir ${DORIS_HOME}/doris-meta # 设置 FE 的 IP 地址如果是单机部署使用本机 IP 或 127.0.0.1 priority_networks 192.168.1.0/24 # 请替换为你的实际网段或使用具体IP如 127.0.0.1/32 # 设置查询端口和 RPC 端口通常保持默认即可 query_port 9030 rpc_port 9020 # 单机部署时可以关闭元数据高可用检查仅用于测试 # enable_meta_check false保存退出后启动 FE# 启动 FE ./bin/start_fe.sh --daemon # 查看启动日志确认是否成功 tail -f log/fe.log # 等待片刻在日志中看到 “thrift server started” 和 “FE start successfully” 字样即表示启动成功。步骤 3部署 Backend (BE)FE 启动成功后我们需要启动 BE 并将其添加到 FE 的管理中。# 返回 Doris 主目录进入 BE 目录 cd ../be # 修改 BE 配置文件 conf/be.conf vim conf/be.conf在be.conf中修改以下关键配置# 设置 BE 的存储目录确保有足够空间 storage_root_path ${DORIS_HOME}/storage # 设置 BE 的 IP 地址同样需要指定 priority_networks 192.168.1.0/24 # 请替换为你的实际网段 # 设置 BE 的端口保持默认 be_port 9060 webserver_port 8040 brpc_port 8060保存退出后启动 BE# 启动 BE ./bin/start_be.sh --daemon # 查看 BE 启动日志 tail -f log/be.log # 看到 “BE start successfully” 或 “heartbeat success” 等字样表示启动成功。步骤 4将 BE 节点添加到集群BE 启动后它还是一个独立的进程需要被 FE 管理。我们使用 MySQL 客户端连接到 FE执行 SQL 命令来添加 BE。# 使用 MySQL 客户端连接 Doris FE端口 9030 # 初始用户名为 root密码为空 mysql -h 127.0.0.1 -P 9030 -uroot # 连接成功后执行以下 SQL 添加 BE 节点 # 注意这里的 IP 和端口9060需要替换为你的 BE 实际地址 ALTER SYSTEM ADD BACKEND 你的BE_IP:9060; # 例如ALTER SYSTEM ADD BACKEND 192.168.1.100:9060;添加成功后可以查看 BE 状态SHOW BACKENDS\G在返回结果中查看Alive列是否为true。如果为true恭喜你一个单机版的 Doris 集群已经部署完成5. 基础操作使用 Python 连接与操作 Doris现在我们的 Doris 服务已经运行起来了。作为 Python 开发者最关心的莫过于如何用 Python 与之交互。得益于其 MySQL 协议兼容性这一步异常简单。步骤 1安装 Python 客户端驱动你可以选择通用的mysql-connector-python或pymysql。这里以mysql-connector-python为例。pip install mysql-connector-python步骤 2编写 Python 连接与操作脚本创建一个名为doris_demo.py的文件写入以下代码# doris_demo.py import mysql.connector from mysql.connector import Error def create_connection(): 创建到 Doris 数据库的连接 connection None try: connection mysql.connector.connect( host127.0.0.1, # 你的 FE 节点 IP port9030, # FE 的 query_port userroot, # 默认用户名 password, # 初始密码为空 databasetest_db # 连接后使用的默认数据库可以先不指定 ) print(成功连接到 Doris) except Error as e: print(f连接错误: {e}) return connection def execute_query(connection, query): 执行查询并打印结果 cursor connection.cursor() try: cursor.execute(query) result cursor.fetchall() return result except Error as e: print(f查询错误: {e}) return None finally: cursor.close() def main(): # 1. 建立连接 conn create_connection() if conn is None: return try: # 2. 创建数据库 print(\n1. 创建数据库...) create_db_query CREATE DATABASE IF NOT EXISTS test_db execute_query(conn, create_db_query) conn.database test_db # 切换当前数据库 # 3. 创建表使用 Aggregate 模型 print(\n2. 创建销售聚合表...) create_table_query CREATE TABLE IF NOT EXISTS sales_agg ( dt DATE NOT NULL COMMENT 销售日期, product_id INT NOT NULL COMMENT 产品ID, city VARCHAR(50) COMMENT 城市, total_sales_amount BIGINT SUM COMMENT 销售总额, total_quantity BIGINT SUM COMMENT 销售总数量 ) ENGINEOLAP AGGREGATE KEY(dt, product_id, city) DISTRIBUTED BY HASH(product_id) BUCKETS 10 PROPERTIES ( replication_num 1 ); execute_query(conn, create_table_query) # 4. 插入测试数据使用 INSERT INTO ... VALUES适用于小批量测试 print(\n3. 插入测试数据...) insert_data_query INSERT INTO sales_agg (dt, product_id, city, total_sales_amount, total_quantity) VALUES (2024-01-01, 1001, 北京, 5000, 100), (2024-01-01, 1002, 上海, 8000, 200), (2024-01-02, 1001, 北京, 3000, 60), (2024-01-02, 1001, 上海, 7000, 140), (2024-01-02, 1003, 广州, 12000, 300); execute_query(conn, insert_data_query) conn.commit() # 提交事务 print(数据插入成功。) # 5. 执行聚合查询 print(\n4. 查询各产品总销售额...) agg_query SELECT product_id, SUM(total_sales_amount) as total_revenue, SUM(total_quantity) as total_qty FROM sales_agg GROUP BY product_id ORDER BY total_revenue DESC; results execute_query(conn, agg_query) if results: print(f{产品ID:10} {总销售额:15} {总数量:10}) print(- * 40) for row in results: print(f{row[0]:10} {row[1]:15} {row[2]:10}) # 6. 执行带过滤的查询 print(\n5. 查询北京地区的销售情况...) filter_query SELECT dt, product_id, total_sales_amount FROM sales_agg WHERE city 北京 ORDER BY dt; results execute_query(conn, filter_query) if results: print(f{日期:12} {产品ID:10} {销售额:10}) print(- * 35) for row in results: print(f{row[0]:12} {row[1]:10} {row[2]:10}) except Error as e: print(f操作过程中发生错误: {e}) finally: if conn.is_connected(): conn.close() print(\n数据库连接已关闭。) if __name__ __main__: main()步骤 3运行脚本并查看结果在终端运行该 Python 脚本python doris_demo.py如果一切顺利你将看到类似以下的输出成功连接到 Doris 1. 创建数据库... 2. 创建销售聚合表... 3. 插入测试数据... 数据插入成功。 4. 查询各产品总销售额... 产品ID 总销售额 总数量 ---------------------------------------- 1003 12000 300 1002 8000 200 1001 15000 300 5. 查询北京地区的销售情况... 日期 产品ID 销售额 ----------------------------------- 2024-01-01 1001 5000 2024-01-02 1001 3000这个简单的例子演示了使用 Python 完成从建库、建表、插入数据到执行复杂聚合查询的全流程。你会发现除了建表语句需要遵循 Doris 的特定语法如AGGREGATE KEY,DISTRIBUTED BY HASH其他的 CRUD 操作与操作 MySQL 几乎无异。6. 进阶集成在 Apache Superset 中可视化 Doris 数据对于数据分析场景将数据可视化是刚需。Apache Superset 是一个强大的开源 BI 工具它原生支持连接 Doris。我们将基于网络搜索材料中的指引完成 Superset 与 Doris 的集成。前置条件已安装并运行 Apache Superset版本 3.1。可参考官方文档安装。已安装 Doris 的 Python 客户端pydoris。这是 Superset 连接 Doris 所必需的驱动。# 在 Superset 所在环境安装 pydoris pip install pydoris步骤 1在 Superset 中添加 Doris 数据库连接登录 Superset Web 界面。点击右上角Settings-Database Connections。点击 Add Database。在连接弹窗中选择Apache Doris作为数据库类型如果列表中没有请检查pydoris是否安装成功并重启 Superset。按照以下格式填写SQLAlchemy URIdoris://用户名:密码FE主机地址:FE查询端口/catalog.数据库名参数说明用户名/密码你的 Doris 用户凭证如 root/空。FE主机地址运行 FE 的机器 IP如127.0.0.1。FE查询端口默认为9030。catalogDoris 的 Catalog 名称。对于内部表使用internal。数据库名你要连接的数据库如test_db。示例 URIdoris://root:127.0.0.1:9030/internal.test_db点击Test Connection测试连接成功后点击Connect。步骤 2创建 Dataset 和 Chart连接成功后即可基于 Doris 表创建可视化图表。点击左侧导航栏Datasets- Add Dataset。选择刚添加的 Doris 数据库连接选择 Schema即数据库如test_db和 Table如sales_agg。点击Create Dataset and Create Chart。在 Chart 创建页面你可以将dt字段拖到 X 轴并设置时间粒度。在Metrics区域点击Add item创建一个名为Revenue的指标其 SQL 表达式为SUM(total_sales_amount)。将product_id或city拖到Dimensions或Series区域进行分组。选择图表类型如 Line Chart, Bar Chart。点击Update Chart预览确认无误后点击Save保存看板。通过 Superset你可以轻松地基于 Doris 中的数据创建丰富的仪表盘实现数据的实时可视化监控。7. 生产环境部署核心要点与性能优化单机部署适合学习和测试但生产环境需要考虑高可用、可扩展性和性能。以下是关键的进阶实践。1. 集群化部署FE 高可用至少部署 3 个 FE 节点1 Leader 2 Follower。通过ALTER SYSTEM ADD FOLLOWER “fe_host:edit_log_port”;命令添加。BE 水平扩展根据数据量和查询压力部署多个 BE 节点。通过ALTER SYSTEM ADD BACKEND “be_host:be_port”;添加。数据会自动均衡分布。分离部署FE、BE 不要部署在同一物理机避免资源竞争。2. 表设计与查询优化选择合适的数据模型80% 的场景使用Aggregate 模型都能获得巨大性能提升。仔细选择维度列和聚合函数。合理分区分桶分区Partition按时间如天、月分区可以有效裁剪数据加速查询。例如PARTITION BY RANGE(dt) (...)。分桶Bucket使用DISTRIBUTED BY HASH(key) BUCKETS n。分桶键应选择高频查询的维度列桶数量建议为 BE 节点数的倍数通常 10-100 个。利用物化视图对于非常复杂且固定的聚合查询可以创建物化视图Materialized View。Doris 会自动维护物化视图查询时如果匹配则会直接命中速度极快。-- 为例表 sales_agg 创建一个按城市和产品预聚合的物化视图 CREATE MATERIALIZED VIEW mv_city_product AS SELECT city, product_id, SUM(total_sales_amount), SUM(total_quantity) FROM sales_agg GROUP BY city, product_id;**避免 SELECT ***只查询需要的列。Doris 是列式存储只读取涉及的列可以大幅减少 I/O。3. 数据导入最佳实践对于生产环境不建议使用单条INSERT。推荐以下方式Stream Load通过 HTTP 协议推送数据适用于高频小批量数据。Broker Load通过 Broker 进程访问 HDFS 等外部存储导入数据适用于大数据量批量导入。Routine Load持续消费 Kafka 等消息队列中的数据实现实时数据接入。8. 常见问题与故障排查指南在部署和使用过程中你可能会遇到以下问题。这里提供快速的排查思路。问题现象可能原因排查方式解决方案FE/BE 启动失败1. 端口被占用。2. Java 环境问题。3. 元数据或存储目录权限不足。1. 查看log/fe.log或log/be.log尾部错误信息。2. 使用netstat -tlnp | grep 端口号检查端口。3. 检查JAVA_HOME环境变量。1. 杀死占用进程或修改配置文件中的端口。2. 安装正确版本的 JDK 并设置JAVA_HOME。3. 使用chmod修改目录权限。Python 连接 Doris 超时或拒绝1. 网络不通或防火墙拦截。2. FE 地址或端口错误。3. 用户名/密码错误。1. 使用telnet FE_IP 9030测试网络连通性。2. 确认连接字符串正确。3. 通过 MySQL 客户端直接连接验证。1. 配置防火墙规则开放 9030/9020/9060 等端口。2. 核对连接参数。3. 在 Doris 中创建专用用户并授权。Superset 中找不到 Apache Doris 数据源pydoris驱动未正确安装或未被 Superset 检测到。1. 在 Superset 运行环境执行pip list | grep pydoris。2. 检查 Superset 日志。1. 在 Superset 的 Python 环境中执行pip install pydoris。2.重启 Superset 服务。查询速度慢1. 未命中分区/分桶。2. 表模型选择不当。3. 缺乏物化视图。4. BE 节点负载过高。1. 使用EXPLAIN语句分析查询计划。2. 检查SHOW BACKENDS\G的节点负载。3. 分析慢查询日志。1. 优化 WHERE 条件使其能命中分区键。2. 考虑使用 Aggregate 模型或创建物化视图。3. 增加 BE 节点或升级硬件。数据导入失败1. 数据格式错误。2. 列类型不匹配。3. 集群状态异常。1. 查看导入作业状态SHOW LOAD WHERE LABEL ‘xxx’;\G。2. 查看 BE 日志中的具体错误。1. 严格按照表结构准备数据。2. 使用curl -I检查 Stream Load 的 HTTP 返回码和错误信息。BE 节点状态为 Dead1. BE 进程挂掉。2. 网络心跳中断。3. 磁盘空间不足。1. 登录 BE 机器检查进程ps -ef | grep doris_be。2. 检查 BE 日志log/be.WARNING。3. 检查磁盘df -h。1. 重启 BE 进程./bin/start_be.sh --daemon。2. 修复网络问题。3. 清理磁盘或增加存储路径。9. 总结从入门到生产的关键路径回顾全文我们从 Python 开发者的痛点出发完成了 Apache Doris 从零部署到集成应用的完整旅程。关键在于理解 Doris 不是一个简单的 MySQL 替代品而是一个为分析型负载而生的强大引擎。核心收获部署层面理解了 FE大脑和 BE劳动力的架构分工掌握了单机部署和基础集群配置的方法。开发层面掌握了使用 Python 标准 MySQL 驱动连接 Doris 进行数据操作关键在于建表时根据查询模式选择正确的数据模型Aggregate/Duplicate/Unique。生态集成学会了如何通过安装pydoris驱动将 Doris 无缝接入 Apache Superset实现数据的可视化分析。性能进阶了解了通过合理设计分区、分桶以及利用物化视图来优化查询性能的核心思想。排错能力建立了基本的故障排查思路能够根据日志和状态命令定位常见问题。给你的后续建议深入理论阅读官方文档中关于数据模型、索引和查询优化器的章节这是写出高效 Doris SQL 的基石。实战数据管道尝试使用Routine Load从 Kafka 实时导入数据或使用Broker Load从 HDFS/S3 批量导入数据构建一个完整的数据流。监控与运维搭建对 Doris 集群的监控关注 FE/BE 的 CPU、内存、磁盘 I/O 以及查询延迟等关键指标。参与社区遇到复杂问题时可以在 Apache Doris 的 GitHub Discussions 或 Slack 频道寻求帮助社区非常活跃。将 Doris 引入你的技术栈不是增加一个数据库那么简单而是为你处理海量数据分析任务提供了一种更优雅、更高效的解决方案。它降低了大数据技术的门槛让 Python 开发者也能轻松驾驭企业级的数据分析需求。建议你将本文作为手边工具在遇到具体问题时回来查阅相关章节。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度