Doris相关问题处理和异常处理

文章讨论了Doris数据库中遇到的常见问题,如decimal字段异常处理、连接超时、内存限制、表结构修改(包括表名、字段类型和表注释)、SQL查询条件、超时设置、表字段增删以及分区和分桶的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、decimal 字段异常

 修改为

2、连接超时

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet successfully received from the server was 1,068 milliseconds ago. The last packet sent successfully to the server was 1,068 milliseconds ago.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
	at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
	at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:520)
	at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:700)
	at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:639)
	at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:987)
	at com.mysql.cj.NativeSession.execSQL(NativeSession.java:666)
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:930)
	... 18 common frames omitted
Caused by: java.net.SocketException: Socket closed
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at com.mysql.cj.protocol.ReadAheadInputStream.fill(ReadAheadInputStream.java:107)
	at com.mysql.cj.protocol.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:150)
	at com.mysql.cj.protocol.ReadAheadInputStream.read(ReadAheadInputStream.java:180)
	at java.io.FilterInputStream.read(FilterInputStream.java:133)
	at com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:64)
	at com.mysql.cj.protocol.a.SimplePacketReader.readHeaderLocal(SimplePacketReader.java:81)
	at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:63)
	at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:45)
	at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:52)
	at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:41)
	at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:54)
	at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:44)
	at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:514)
	... 23 common frames omitted

3、doris修改表名

alter table dws_monthly_future_forecast rename dws_monthly_future_forecast_back;

4、内存超限制

SHOW VARIABLES LIKE "%mem_limit%";

MySQL [dorisonline]> SHOW VARIABLES LIKE "%mem_limit%";
+------------------------------------------+------------+
| Variable_name                            | Value      |
+------------------------------------------+------------+
| broadcast_hashtable_mem_limit_percentage | 0.2        |
| exec_mem_limit                           | 2147483648 |
+------------------------------------------+------------+
2 rows in set (0.00 sec)
SET GLOBAL exec_mem_limit = 8589934592;

SET GLOBAL exec_mem_limit = 4294967296;

245 内存已不足
新增了247节点,重新建表  执行成功

5、修改表字段类型

  • 修改列类型
  • alter table example_tbl modify column k3 varchar(50) key null comment 'to 50'
  • alter table ads_actual_forecast_sales_ratio modify column `future_1_month_sale` decimalv3(25, 12) NULL COMMENT '预测未来一月销售金额';
    alter table ads_actual_forecast_sales_ratio modify column `total_money_month` decimalv3(25, 12) NULL COMMENT '实际销售金额';
    alter table ads_actual_forecast_sales_ratio modify column `actual_forecast_sales_ratio` decimalv3(25, 12) NULL COMMENT '预测和实际销售金额占比';

alter table ads_actual_forecast_sales_ratio modify column `future_1_month_sale` decimalv3(25, 12) NULL COMMENT '预测未来一月销售金额';

  alter table dws_new_customers modify column `in_to_first_datediff_time` int(20) comment '录入到首单时间差';

6、doris where 中的条件判断

     IF(判断语句,v1,v2)

select dt,
ym,
(year(dt) - year(cast(concat(ym, '-01') as date))) * 12 + month(dt) -
month(cast(concat(ym, '-01') as date)) month_diff,
total_money_month
from ads_sale_money_contract_analyse_month
where dt = '2023-08-31' and IF('2023-08-31' = LAST_DAY('2023-08-31'), ym <= '2023-08', ym < '2023-08')

7、修改表名

ALTER TABLE table1 RENAME table2;

ALTER TABLE ads_sale_money_contract_analyse_month RENAME ads_sale_money_contract_analyse_month_back;

8、timeout when waiting for send fragments RPC. Wait(sec): 5, host: xxx(ip)

批量插入数据时遇到的超时错误,默认超时时间为300s,可以登录到mysql客户端用命令自定义修改query_timeout参数,我这里改成了3000s就不报错了。

SHOW VARIABLES LIKE “%query_timeout%”;
SET query_timeout = 3000;

Caused by: java.sql.SQLException: timeout when waiting for send fragments RPC. Wait(sec): 5, host: 192.168.1.246

        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)

        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)

        at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)

        at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1098)

        at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1046)

        at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1371)

        at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1031)

        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)

        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)

        at org.apache.dolphinscheduler.plugin.task.sql.SqlTask.executeUpdate(SqlTask.java:312)

        at org.apache.dolphinscheduler.plugin.task.sql.SqlTask.executeFuncAndSql(SqlTask.java:210)

        at org.apache.dolphinscheduler.plugin.task.sql.SqlTask.handle(SqlTask.java:161)

        ... 9 common frames omitted

10、增加字段

ALTER TABLE dwd_contractlist_area  ADD COLUMN menuarea_origin_gate2 int(11) NULL COMMENT '级别' AFTER hl_gettime;
ALTER TABLE dwd_contractlist_area  ADD COLUMN menuarea_origin_menuname  text NULL COMMENT 'menuarea表 区域名称' AFTER menuarea_origin_gate2;
ALTER TABLE dwd_contractlist_area  ADD COLUMN menuarea_big_area int(11) NULL COMMENT  '大区id' AFTER menuarea_origin_menuname;
ALTER TABLE dwd_contractlist_area  ADD COLUMN menuarea_big_area_menuname text NULL COMMENT '大区名称' AFTER menuarea_big_area;

 

11、Doris修改表的评论

alter table dws_potential_customer_amount_base modify comment '当前12个月内的客户名称及月份差分析表';

12、删除分区

PARTITION p0 VALUES [('0000-01-01'), ('2023-07-28')) 

alter table dws_cost_money_year drop partition p0;
alter table dws_rmf_customer_value_analysis drop partition p0;

ALTER TABLE dws_cost_money_year SET ("dynamic_partition.enable" = "false")

alter table dws_cost_money_year drop partition P20230731;

alter table dws_rmf_customer_value_analysis drop partition P20230731;

alter table ads_cost_money_month drop partition p0;

alter table ads_rmf_customer_value_analysis drop partition p0;

alter table ads_cost_money_year drop partition p0;

alter table ads_sale_money_company_analyse_month drop partition p0;

13、分区、分桶

doris 也有分区和分桶,但和hive不同

Table是有很多分区Partition的

Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行(不能直接操作Tablet)。

一个 Partition包含多个数据分片Tablet组成,Tablet 包含若干数据行

所以本质上Tablet 是数据移动、复制等操作的最小物理存储单元,一定要设置分桶,可以不设置分区

<think>好的,用户需要关于使用DorisFlink进行实时订单处理的设计方案。首先,我需要回顾一下DorisFlink的特点,以及它们在实时数据处理中的常见应用。 Doris是一个MPP架构的分析型数据库,适合实时分析高并发查询。Flink则是流处理框架,擅长处理实时数据流。结合两者,可以实现高效的实时数据处理分析。用户提到的实时订单处理,可能需要实时写入、处理分析订单数据,比如统计实时销售额、检测异常订单等。 接下来,得考虑系统架构设计。通常,数据源可能是订单系统,通过消息队列如Kafka传输,Flink消费数据进行处理,然后写入DorisDoris提供实时查询服务。需要确保数据的一致性,比如使用Flink的CheckpointDoris的两阶段提交,如引用[1]提到的Exactly Once语义。这部分需要详细说明如何配置FlinkDoris的连接器,确保端到端的一致性。 然后,数据模型设计。Doris支持聚合模型,适合部分列更新,如引用[2]所述,可以用Aggregate Key模型,使用replace_if_not_null来处理订单状态的更新。比如订单表的主键是订单ID,其他字段如金额、状态可以实时更新。需要举例说明建表语句,并解释字段选择的原因。 性能优化方面,Doris的物化视图可以加速查询,如引用[2]提到的智能物化视图。可能需要根据常用查询创建物化视图,比如按小时汇总销售额。另外,分区分桶策略也很重要,按时间分区可以提高查询效率,分桶则均匀分布数据。同时,Flink处理时的状态管理窗口操作需要优化,比如使用事件时间窗口,处理乱序事件。 高可用容错方面,Flink的Checkpoint机制Doris的多副本机制是关键。需要说明如何配置Flink的Checkpoint间隔,以及Doris的副本数设置。此外,监控告警机制也需要提及,比如监控Flink作业的延迟Doris的查询延迟。 最后,用户可能需要知道具体实现步骤,比如如何配置Flink CDC读取MySQL的订单数据,经过处理写入Doris。这里需要参考引用[3]中的Flink CDC结合Doris Connector的方法,给出示例代码,说明数据流转过程。 可能还需要考虑扩展性,比如随着订单量增加,如何横向扩展Flink任务Doris集群。以及数据保留策略,历史数据归档等。 现在需要将这些思考整理成结构化的设计方案,包括架构设计、数据模型、一致性保证、性能优化、高可用措施示例代码。同时,根据用户要求生成相关问题,比如如何保证Exactly Once,如何处理数据倾斜,如何优化查询性能等。</think>### Doris + Flink 实时订单处理设计方案 #### 一、架构设计 1. **数据流转链路** **订单系统** → **Kafka**(消息队列)→ **Flink**(流处理)→ **Doris**(存储与分析)→ **BI/API**(查询服务) - **Kafka** 作为缓冲层,解耦生产与消费速率差异 - **Flink** 实现实时清洗、聚合、风控规则计算(如异常订单检测) - **Doris** 提供低延迟查询能力,支持实时看板与 OLAP 分析 2. **关键组件配置** - Flink 启用 **Checkpoint 机制**(间隔 1 分钟),Doris Sink 配置两阶段提交(参考引用[1]) - Doris 表采用 **3 副本**部署,通过 FE/BE 分离架构保证高可用 ```sql -- Doris 建表示例(含副本数配置) CREATE TABLE orders ( order_id BIGINT, user_id INT, amount DECIMAL(10,2), status VARCHAR(20), event_time DATETIME ) ENGINE=OLAP DUPLICATE KEY(order_id) PARTITION BY RANGE(event_time)() DISTRIBUTED BY HASH(order_id) BUCKETS 10 PROPERTIES ("replication_num" = "3"); ``` #### 二、数据一致性保障 1. **Exactly-Once 语义实现** 采用 **Flink CDC + Doris 两阶段提交**(如引用[1]所述): - **Precommit 阶段**:Flink Checkpoint 触发 Doris 事务预提交,数据写入 BE 但不可见 - **Commit 阶段**:Checkpoint 完成时提交事务,BE 发布数据 - 故障恢复时从最近 Checkpoint 重放,避免数据丢失或重复 2. **部分列更新方案** 使用 Doris **Aggregate Key 模型**实现状态字段更新(如订单状态变更): ```sql CREATE TABLE order_status ( order_id BIGINT, status VARCHAR(20) REPLACE_IF_NOT_NULL, update_time DATETIME REPLACE ) ENGINE=OLAP AGGREGATE KEY(order_id) DISTRIBUTED BY HASH(order_id) BUCKETS 10; ``` #### 三、性能优化策略 1. **Flink 处理优化** - 使用 **Event Time 窗口**处理乱序数据,配置 `Watermark` 策略 - 对 `user_id` 等维度字段开启 **LocalGlobal 聚合**,缓解数据倾斜 ```java // Flink 处理逻辑示例 ordersStream .assignTimestampsAndWatermarks(<WatermarkStrategy>) .keyBy(r -> r.user_id) .window(TumblingEventTimeWindows.of(Time.minutes(5))) .aggregate(new OrderStatisticsAggregator()); ``` 2. **Doris 查询加速** - 按小时创建 **Rollup 物化视图**加速时间维度聚合查询 - 对高频查询字段(如 `status`)建立 **Bloom Filter 索引** ```sql -- 按小时销售额汇总物化视图 ALTER TABLE orders ADD ROLLUP hourly_sales ( date_trunc('hour', event_time), sum(amount) ); ``` #### 四、高可用部署 | 组件 | 策略 | |------------|--------------------------------------------------------------------| | **Flink** | 部署 Session 模式集群,配置 ZooKeeper 高可用,TaskManager 故障自动重启 | | **Doris** | FE 部署 Observer 节点实现元数据高可用,BE 节点跨机架分布 | | **Kafka** | 分区数≥3,复制因子≥2,使用机架感知策略 | #### 五、典型场景实现 **实时欺诈检测流程**: 1. Flink 读取 Kafka 订单流 2. 通过 **CEP 模式匹配**短时间内同一用户的多笔高价订单 3. 将风险订单实时写入 Doris 风控表 4. 前端系统查询 Doris 展示实时风险订单看板 ```python # Flink CEP 伪代码示例 Pattern<Order> riskPattern = Pattern.<Order>begin("start") .where(order -> order.amount > 10000) .next("second").within(Time.seconds(10)) .where(order -> order.user_id == previous.user_id); CEP.pattern(ordersStream, riskPattern) .select(new RiskOrderAlertFunction()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值