实时数仓项目开发过程中发现的几个问题和优化点(数据接入)

1、属性值被截断的问题

在数据实时接入阶段,使用NIFI ExecuteScript组件生成增、改、删SQL语句,将SQL语句放到了attribute中(详见视频教程icon-default.png?t=N3I4http://mp.weixin.qq.com/s?__biz=MzIyNzkwNDE4Nw==&mid=2247486672&idx=1&sn=41793a61dc5f7ca6b6f9a34b4fa0ac02&chksm=e85b5304df2cda1247e0e6dfdddab7c68ff7b29e2f35b9d3eacb61baf13ec18d27367f78dfe9&scene=21#wechat_redirect)。

在NiFi中,session.putAttribute方法没有对属性值的长度进行限制。 

在使用putAttribute方法时,可以将任何字符串值分配给属性,该字符串可以是任何长度。只要有足够的内存可用来创建和维护该属性的值,就可以将任何长度的字符串值分配给该属性。 

然而,如果同一个流文件上设置重复的属性名,则会被视为同一属性,后面的属性值会覆盖先前的属性值。因此,在设置属性时应格外注意,以避免不必要的数据丢失。

这里会有一个不方便的地方,就是如果使用View Data Provenance菜单查看历史记录时,会发现由于attribute内容过多,显示不完整。出现这个情况,是因为属性nifi.provenance.repository.max.attribute.length的限制:

nifi.provenance.repository.max.attribute.length属性是Apache NiFi工具中的一个属性,用于指定属性值(即Attributes)的最大长度。

在NiFi中,Provenance Repository是一种跟踪数据流的机制,可用于了解从组件到组件的数据处理行为。Provenance事件会记录数据流中每个数据包的信息,包括数据包类型、大小、来源和目标等。该属性指定了Provenance事件中Attribute的最大长度。如果属性的实际长度超过此值,将无法存储Provenance事件。

默认情况下,该属性的值为 65536 字节(64 KB),这意味着属性的最大长度为 64 KB。可以通过编辑nifi.properties文件来更改该值。 

例如,如果将属性设置为100000,则Provenance事件中的属性值不能超过100000字节。如果Provenance事件中的任何属性值超过此限制,则会被截断。

2、将SQL语句输出到FlowFile内容中

这一思路在视频中提了一下,没有详解,有朋友询问如何实现,这里给出方法。

首先,增、改、删三种SQL要输出到三个FlowFile中,因为如果输出到一个FlowFile,三个SQL以分号分割,在下一步执行时,会报错,这是JDBC机制决定的。

其次,输出的顺序应该是增、改、删的顺序,下一步的队列优先级应该设置为FIFO。

下面是实现代码:

 var sql_array = all_sql.split(";"); for(var i=0;i<sql_array.length;i++) {    if(sql_array[i].length>0)    {      var outputFlowFile = session.create();      outputFlowFile = session.write(outputFlowFile,          new OutputStreamCallback(function(outputStream) {              outputStream.write(sql_array[i].getBytes(StandardCharsets.UTF_8))      }));      session.transfer(outputFlowFile, REL_SUCCESS);   }}session.remove(flowFile);

3、JSON.parse方法long精度丢失的问题

如果处理的数据中有长整型,要注意此问题。尤其是主键值为长整型,由于精度丢失,会导致记录被覆盖。笔者遇到此类问题,使用Java语言做了处理,经测试没再发现此类问题。


感谢大家的持续关注!我会持续以文字和视频的形式分享实时数仓项目建设过程中,遇到的各种坑和一些经验。

实时数据仓库项目的构建是一个复杂而系统的过程,涉及从数据采集、处理、存储到分析与应用的完整链条。其核心目标在于实现数据的实时流动高效处理,以支持业务的快速决策与响应。 ### 一、实时数仓项目开发流程 实时数据仓库的开发通常包括以下几个关键阶段: 1. **需求分析**:明确业务目标,识别需要监控的关键指标(KPI),并定义数据源及数据更新频率等要求。 2. **架构设计**:选择适合的实时处理框架,如Flink、Spark Streaming、Kafka Streams等,并规划数据流管道。 3. **数据采集与传输**:通过日志收集工具(如Flume、Logstash)或消息队列(如Kafka)获取实时数据流[^4]。 4. **数据清洗与转换**:在流式处理引擎中进行ETL操作,包括数据格式标准化、异常值处理、维度建模等步骤。 5. **数据存储**:将处理后的数据写入支持实时查询的存储系统,如ClickHouse、Doris、HBase或Elasticsearch。 6. **数据分析与可视化**:使用BI工具(如Superset、Tableau、Power BI)对实时数据进行展示与交互式分析。 7. **任务调度与监控**:部署任务调度平台(如Airflow、XXL-JOB)管理作业流,并建立监控报警机制保障系统稳定性[^4]。 ### 二、架构设计要 典型的实时数仓架构可以分为以下几层: - **ODS(Operational Data Store)层**:原始数据接入层,负责接收来自业务数据库、日志文件或其他系统的原始数据流。 - **DWD(Data Warehouse Detail)层**:数据清洗与轻度聚合层,去除脏数据、统一字段命名规则,并完成初步的维度建模。 - **DWS(Data Warehouse Summary)层**:高度聚合层,按主题域构建宽表,便于上层应用快速访问。 - **ADS(Application Data Store)层**:面向具体业务场景的数据服务层,提供给报表、看板或接口调用使用[^3]。 在架构设计中应注重高可用性、水平扩展能力以及低延迟的特性,同时确保数据一致性与准确性。 ### 三、实战案例解析 以特步集团有限公司为例,在其零售BI体系建设中首次引入了Apache Doris作为实时数仓的核心组件。该项目面临多个挑战,包括多源异构数据整合、高并发查询压力、数据延迟控制等问题。解决方案包括: - 使用Kafka作为数据总线,对接各类数据源; - 借助Flink进行流式ETL处理,实现实时计算; - 利用Doris的MPP架构支撑海量数据下的高性能查询; - 构建分层数据模型,提升数据治理能力与查询效率。 最终该体系实现了分钟级的数据同步与秒级查询响应,为销售预测、库存优化等关键业务提供了强有力的数据支撑[^2]。 --- ### 四、关键技术选型建议 | 组件类型 | 推荐技术 | |----------|-----------| | 数据采集 | Kafka, Flume, Debezium | | 流处理引擎 | Apache Flink, Spark Streaming | | 存储引擎 | Apache Doris, ClickHouse, HBase | | 查询引擎 | Presto, Impala, Hive LLAP | | 调度平台 | Airflow, DolphinScheduler | | 可视化工具 | Superset, Grafana, Tableau | ```sql -- 示例:Doris 中创建一张聚合表用于存储实时订单汇总信息 CREATE TABLE real_time_order_summary ( dt DATE NOT NULL, product_id BIGINT NOT NULL, order_count BIGINT SUM DEFAULT '0', total_amount DECIMAL(18,2) SUM DEFAULT '0.00' ) ENGINE=OLAP AGGREGATE KEY(dt, product_id) DISTRIBUTED BY HASH(product_id) BUCKETS 10; ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登峰大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值