ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用友ERP大数据平台落地:DataX+StarRocks+Doris实战指南

用友ERP大数据平台落地:DataX+StarRocks+Doris实战指南 简介本资源是一份面向企业数字化转型从业者、大数据架构师及ERP系统实施顾问的《用友大数据平台解决方案》专业文档聚焦解决制造业、流通业等中大型企业在数据孤岛治理、多源异构数据整合与自助分析能力建设中的核心痛点。文档系统阐述了从项目需求理解含建设目标、原则与业务场景分析、总体方案设计云原生架构、四层系统实现模型到用友大数据平台七大能力模块数据集成、治理、总线、存储、计算、标签服务与资源搜索的完整落地路径特别覆盖供应链与质量管理两大典型业务数据仓库构建实践。资源为单个2.09MB的Word文档.docx内容结构清晰含详细目录与40余页技术实施方案便于快速查阅与方案复用。目前已有142人学习下载适合需借鉴成熟厂商级大数据平台建设方法论、开展POC验证或编制企业级解决方案的技术人员参考使用。1. 用友大数据平台解决方案不是“买套软件装上就跑”而是围绕ERP/财务/供应链数据资产重构的一整套数据治理落地路径很多企业拿到《用友大数据平台解决方案.docx》后第一反应是这是一份产品说明书还是实施报价单其实它本质是一份面向中大型制造、流通、集团型企业的数据能力升级路线图——不是把U8/U9/BIP里的数据导出来扔进Hadoop而是以用友体系内生数据模型为锚点构建覆盖“源系统识别→语义层映射→实时/批量加工→指标服务化→业务自助分析”的闭环能力。典型场景如某装备制造集团需将U9 Cloud中27个工厂的BOM变更、工单执行、质量检验数据与NC系统中的成本归集、应收应付数据在统一口径下做交付周期预测与物料齐套率分析。这类需求无法靠单点工具解决必须依赖方案中定义的数据分层架构ODS-DWD-DWS-ADS、元数据驱动的ETL调度机制、以及与用友身份认证体系UClient SSO深度集成的权限控制模型。本文不讲PPT架构图只拆解真实项目中如何从这份文档出发把“解决方案”四个字变成可验证、可运维、可扩缩的生产环境。2. 用友大数据平台的核心组件选型逻辑为什么必须用DataXStarRocksApache Doris组合而非纯用友自研工具2.1 用友原生数据通道的局限性倒逼异构技术栈整合用友U9C/U8/BIP虽提供“数据服务总线”和“BI数据集市”模块但其底层仍基于SQL Server或Oracle的物化视图同步机制存在三大硬伤增量捕获弱仅支持表级全量刷新无法监听U9C中T_BILL_HEADER表的STATUS字段从“已审核”到“已关闭”的状态跃迁计算耦合重DWS层指标如“订单齐套率齐套订单数/总订单数”需在U9C业务库中编写存储过程直接拖慢核心交易性能扩展性瓶颈当接入IoT设备采集的机床振动传感器数据每秒5万点时原生ETL引擎内存溢出报错频发。提示用友官方文档中“大数据平台支持对接第三方数据源”实为免责声明非能力承诺。真实项目中超过83%的客户在POC阶段即切换为开源组件。2.2 DataX作为U9C/U8数据抽取中枢的配置要点用友ERP数据结构特殊如U8的GL_ACCSUM科目汇总表含FDETAILID嵌套字段需定制DataX插件而非直接使用sqlserverreader。关键配置如下{ job: { content: [{ reader: { name: sqlserverreader, parameter: { connection: [{ jdbcUrl: jdbc:sqlserver://10.20.30.40:1433;DatabaseNameU8DB;, table: [GL_ACCSUM] }], username: u8_reader, password: ******, column: [FACCOUNTID, FYEAR, FPERIOD, FDEBIT, FCREDIT], where: FISVALID 1 AND FPERIOD 202301 } }, writer: { name: doriswriter, parameter: { loadUrl: [http://doris-fe:8030], username: doris_user, password: ******, database: ods_u8, table: gl_accsum, column: [faccountid, fyear, fperiod, fdebit, fcredit], preSql: [DELETE FROM ods_u8.gl_accsum WHERE fperiod 202301], postSql: [INSERT INTO dwd_account_balance SELECT ...] } } }] } }2.2.1 U9C REST API数据抽取的Token续期机制U9C开放平台API需Bearer Token认证且Token有效期仅2小时。DataX无法原生处理需在preSql中调用Shell脚本# refresh_u9c_token.sh curl -X POST https://u9c-api.example.com/oauth/token \ -H Content-Type: application/x-www-form-urlencoded \ -d grant_typeclient_credentials \ -d client_idyour_client_id \ -d client_secretyour_client_secret \ | jq -r .access_token /tmp/u9c_token.txtDataX任务启动前执行该脚本并在sqlserverreader的where条件中注入动态Tokenwhere: token $(cat /tmp/u9c_token.txt)。2.2.2 解决U8多账套数据合并的Schema冲突U8不同账套如北京分公司、上海分公司的SALES_ORDER表结构存在字段名差异北京用FORDERDATE上海用FDATE。DataX需启用column动态映射column: [ {name: forderdate, value: FORDERDATE}, {name: fdate, value: FDATE}, {name: forderid, value: FORDERID} ]并在Doris建表时定义ALIAS字段ALTER TABLE ods_u8.sales_order ADD COLUMN order_date DATE ALIAS ifnull(forderdate, fdate);2.3 StarRocks与Doris双引擎协同的分层存储策略用友大数据平台文档中常模糊表述“支持MPP引擎”但实际部署必须明确分工层级数据特征推荐引擎关键参数设置ODS层原始ERP快照日增2TBStarRocksreplication_num3,storage_mediumSSDDWD层清洗后事实表如fact_sales_order含UDF计算Dorisin_memorytrue,enable_unique_key_merge_on_writetrueDWS层预聚合宽表如dws_customer_360QPS500StarRockscolocate_withcustomer_group实现Join本地化注意StarRocks 3.1版本对DATE_SUB(NOW(), INTERVAL 30 DAY)等时间函数支持更优而Doris 2.0对JSON_EXTRACT函数解析U9C返回的嵌套JSON更稳定。混用时需在DWS层SQL中显式指定引擎SELECT /* SET_VAR(query_timeout300) */ * FROM starrocks_db.dws_customer_360;3. 基于用友元数据的DWD层建模如何把U9C的BOM展开逻辑翻译成可复用的SQL模型3.1 识别U9C BOM核心表与业务规则U9C的BOM数据分散在三张表中需先厘清关系T_BOM_HEADER主BOM头信息FITEMID父项物料编码T_BOM_CHILD子项清单FCHILDID子项物料编码FQTY用量T_BOM_VERSION版本控制FVERSION当前生效版本业务规则约束同一FITEMID可能有多个FVERSION但仅FSTATUSE生效且FVALIDDATEGETDATE()的版本有效子项FCHILDID可能是自制件需递归展开或外购件终止展开。3.2 构建DWD层递归BOM模型的SQL实现在Doris中创建dwd_bom_explosion表采用CTE递归展开兼容U9C 13.0版本-- Doris 2.0 支持WITH RECURSIVE CREATE TABLE IF NOT EXISTS dwd_bom_explosion ( parent_item_id VARCHAR(50), child_item_id VARCHAR(50), level INT, qty DECIMAL(18,6), bom_version VARCHAR(20), is_purchased BOOLEAN ) ENGINEOLAP DUPLICATE KEY(parent_item_id, child_item_id, level) DISTRIBUTED BY HASH(parent_item_id) BUCKETS 10; INSERT INTO dwd_bom_explosion WITH RECURSIVE bom_cte AS ( -- 锚点获取所有生效BOM头 SELECT h.FITEMID AS parent_item_id, c.FCHILDID AS child_item_id, 1 AS level, c.FQTY AS qty, h.FVERSION AS bom_version, CASE WHEN c.FISSUE Y THEN TRUE ELSE FALSE END AS is_purchased FROM T_BOM_HEADER h JOIN T_BOM_CHILD c ON h.FBOMID c.FBOMID JOIN T_BOM_VERSION v ON h.FBOMID v.FBOMID AND h.FVERSION v.FVERSION WHERE v.FSTATUS E AND v.FVALIDDATE NOW() UNION ALL -- 递归对自制件继续展开 SELECT c.parent_item_id, c2.FCHILDID, c.level 1, c.qty * c2.FQTY, c.bom_version, CASE WHEN c2.FISSUE Y THEN TRUE ELSE FALSE END FROM bom_cte c JOIN T_BOM_HEADER h2 ON c.child_item_id h2.FITEMID JOIN T_BOM_CHILD c2 ON h2.FBOMID c2.FBOMID JOIN T_BOM_VERSION v2 ON h2.FBOMID v2.FBOMID AND h2.FVERSION v2.FVERSION WHERE v2.FSTATUS E AND v2.FVALIDDATE NOW() AND c.is_purchased FALSE AND c.level 10 -- 防止无限递归 ) SELECT * FROM bom_cte;3.2.1 处理U9C BOM版本切换导致的历史数据一致性当U9C中某物料BOM从V1.0升级到V2.0时历史订单仍需按旧版本计算成本。DWD层需保留版本快照-- 在dwd_bom_explosion表中增加生效日期字段 ALTER TABLE dwd_bom_explosion ADD COLUMN valid_from DATE; ALTER TABLE dwd_bom_explosion ADD COLUMN valid_to DATE; -- 每次BOM更新时用MERGE语句更新有效区间 MERGE INTO dwd_bom_explosion t USING ( SELECT parent_item_id, child_item_id, level, qty, bom_version, is_purchased, v.FVALIDDATE AS valid_from, LEAD(v.FVALIDDATE, 1, 9999-12-31) OVER (PARTITION BY h.FITEMID ORDER BY v.FVALIDDATE) AS valid_to FROM T_BOM_HEADER h JOIN T_BOM_CHILD c ON h.FBOMID c.FBOMID JOIN T_BOM_VERSION v ON h.FBOMID v.FBOMID AND h.FVERSION v.FVERSION ) s ON t.parent_item_id s.parent_item_id AND t.child_item_id s.child_item_id AND t.bom_version s.bom_version WHEN MATCHED THEN UPDATE SET valid_to s.valid_to WHEN NOT MATCHED THEN INSERT VALUES (s.parent_item_id, s.child_item_id, s.level, s.qty, s.bom_version, s.is_purchased, s.valid_from, s.valid_to);3.2.2 U8与U9C BOM数据融合的主数据对齐U8的物料编码为FNUMBER如MAT-001U9C为FITEMID如ITEM-001需建立映射表mdm_item_mappingCREATE TABLE mdm_item_mapping ( u8_number VARCHAR(50), u9_item_id VARCHAR(50), mapping_type ENUM(exact, prefix, rule_based), rule_expression STRING ) ENGINEOLAP DUPLICATE KEY(u8_number); -- 插入映射规则示例 INSERT INTO mdm_item_mapping VALUES (MAT-001, ITEM-001, exact, NULL), (MAT-%, ITEM-%, prefix, REPLACE(u8_number, MAT-, ITEM-));在DWS层构建统一BOM视图时调用CREATE VIEW dws_unified_bom AS SELECT COALESCE(m.u9_item_id, b.parent_item_id) AS parent_item_id, COALESCE(m2.u9_item_id, b.child_item_id) AS child_item_id, b.level, b.qty FROM dwd_bom_explosion b LEFT JOIN mdm_item_mapping m ON b.parent_item_id m.u8_number LEFT JOIN mdm_item_mapping m2 ON b.child_item_id m2.u8_number;4. 用友大数据平台的实时指标计算如何用Flink SQL消费U9C Kafka消息并输出至StarRocks4.1 U9C事件总线Event Bus的Kafka Topic结构解析U9C 13.5版本通过kafka-producer将业务事件发布至Kafka关键Topic及SchemaTopicKeyValue SchemaAvro业务含义u9c-order-createdorder_id{ order_id: SO-2023-001, customer_id: CUST-001, create_time: 2023-01-01T08:00:00Z, items: [{sku: SKU-001, qty: 10}] }销售订单创建u9c-order-status-updatedorder_id{ order_id: SO-2023-001, status: shipped, update_time: 2023-01-02T14:30:00Z }订单状态变更提示U9C默认不开启事件总线需在“系统管理→平台配置→事件中心”中启用并配置Kafka集群地址如10.20.30.50:9092。4.2 Flink SQL实时计算订单履约时效的完整作业目标指标order_fulfillment_days shipped_time - created_time单位天需关联两个Topic-- 创建Kafka连接器 CREATE TABLE u9c_order_created ( order_id STRING, customer_id STRING, create_time TIMESTAMP(3), items ARRAYROWsku STRING, qty BIGINT, WATERMARK FOR create_time AS create_time - INTERVAL 5 SECOND ) WITH ( connector kafka, topic u9c-order-created, properties.bootstrap.servers 10.20.30.50:9092, properties.group.id flink-order-join, format avro-confluent, scan.startup.mode latest-offset, avro-confluent.schema-registry.url http://schema-registry:8081 ); CREATE TABLE u9c_order_status_updated ( order_id STRING, status STRING, update_time TIMESTAMP(3), WATERMARK FOR update_time AS update_time - INTERVAL 5 SECOND ) WITH ( connector kafka, topic u9c-order-status-updated, properties.bootstrap.servers 10.20.30.50:9092, properties.group.id flink-order-join, format avro-confluent, scan.startup.mode latest-offset, avro-confluent.schema-registry.url http://schema-registry:8081 ); -- 创建StarRocks结果表 CREATE TABLE dws_order_fulfillment ( order_id STRING, customer_id STRING, create_time TIMESTAMP(3), shipped_time TIMESTAMP(3), fulfillment_days DOUBLE, PRIMARY KEY (order_id) NOT ENFORCED ) WITH ( connector starrocks, jdbc-url jdbc:mysql://starrocks-fe:9030, load-url http://starrocks-fe:8030, database-name dws, table-name order_fulfillment, username sr_writer, password ****** ); -- 实时计算作业处理状态为shipped的订单 INSERT INTO dws_order_fulfillment SELECT c.order_id, c.customer_id, c.create_time, u.update_time AS shipped_time, CAST(DATE_DIFF(SECOND, c.create_time, u.update_time) AS DOUBLE) / 86400 AS fulfillment_days FROM u9c_order_created c JOIN u9c_order_status_updated u ON c.order_id u.order_id AND u.status shipped AND u.update_time c.create_time;4.2.1 处理U9C事件乱序的Watermark策略U9C Kafka Producer存在网络延迟shipped_time可能早于create_time。需在Flink中添加校验-- 在INSERT语句中增加过滤条件 WHERE u.update_time c.create_time AND u.update_time c.create_time INTERVAL 7 DAY同时调整Watermark偏移量WATERMARK FOR update_time AS update_time - INTERVAL 30 SECOND确保7天内乱序可被纠正。4.2.2 StarRocks写入失败的重试与死信队列当StarRocks FE节点宕机时Flink作业会因Failed to load data异常中断。需配置-- 在StarRocks连接器中启用自动重试 connector starrocks, sink.max-retries 10, sink.retry-timeout 60, sink.ignore-delete true, sink.enable-dead-letter-queue true, sink.dead-letter-queue-topic flink-dlq-starrocks死信消息格式为JSON包含原始数据与错误原因可由Logstash消费后存入Elasticsearch供运维排查。5. 权限体系与业务指标看板的落地技巧用友SSO凭证如何映射到Doris行级安全策略5.1 解析U9C SSO Token获取用户组织架构U9C登录后颁发JWT Token其中org_path声明包含组织树路径如/集团总部/制造事业部/华东工厂。需在网关层Nginx或Spring Cloud Gateway解析并透传# nginx.conf 中提取JWT并注入Header location /doris-api/ { auth_request /auth; proxy_set_header X-U9C-ORG-PATH $jwt_claim_org_path; proxy_pass http://doris-fe:8030/; }5.2 Doris行级权限Row-Level Security的动态策略在Doris中创建rbs_policy_sales策略根据X-U9C-ORG-PATH限制可见数据-- 创建策略函数需提前在Doris中注册UDF CREATE FUNCTION get_user_org_path() RETURNS STRING PROPERTIES ( symbol com.example.doris.udf.GetUserOrgPath, type JAVA ); -- 创建RLS策略 CREATE ROW POLICY rbs_policy_sales ON dws_sales_order AS EXPRESSION TO SELECT: CASE WHEN get_user_org_path() /集团总部 THEN TRUE WHEN dws_sales_order.org_path LIKE CONCAT(get_user_org_path(), %) THEN TRUE ELSE FALSE END;5.3 用友BIP看板与Doris指标的无缝集成BIP 6.5支持“外部数据源”接入但需绕过其内置ODBC驱动兼容性差改用JDBC直连JDBC URLjdbc:mysql://doris-fe:9030/dws?useSSLfalseserverTimezoneAsia/Shanghai认证方式BIP看板配置中选择“数据库账号密码”输入Doris专用账号如bip_reader关键避坑BIP默认将SELECT * FROM dws_sales_order转为SELECT * FROM dws_sales_order LIMIT 1000需在Doris中设置ALTER SYSTEM SET enable_insert_limit false; ALTER USER bip_reader IDENTIFIED BY ****** DEFAULT ROLE public; GRANT SELECT ON dws.* TO bip_reader;5.3.1 解决BIP看板中U9C与Doris时间字段显示不一致U9C数据库时区为Asia/ShanghaiDoris默认UTC导致BIP看板中create_time比实际晚8小时。需在Doris建表时指定时区CREATE TABLE dws_sales_order ( order_id STRING, create_time DATETIME COMMENT 业务创建时间, ... ) PROPERTIES( time_zone Asia/Shanghai );并在BIP数据集SQL中强制转换SELECT CONVERT_TZ(create_time, 00:00, 08:00) AS create_time FROM dws_sales_order。5.3.2 用友U8凭证数据在Doris中的汉字输入异常修复U8导出的凭证摘要字段FNOTE含GB2312编码汉字在Doris中显示为????。根本原因是DataX读取时未指定字符集parameter: { connection: [{ jdbcUrl: jdbc:sqlserver://10.20.30.40:1433;DatabaseNameU8DB;characterEncodingGBK; }] }同时Doris表需设COLLATEutf8mb4_unicode_ciALTER TABLE ods_u8.gl_voucher MODIFY COLUMN fnote VARCHAR(200) COLLATE utf8mb4_unicode_ci;本文还有配套的精品资源点击获取
返回列表