1. 人力家数据架构演进之路:从数仓到湖流的技术实践
三年前接手人力家数据平台时,我们还在用传统数仓处理每天200GB的考勤数据。当业务量突然增长5倍后,凌晨的ETL任务开始频繁超时,业务部门拿着三天前的数据做决策的场景让我意识到:是时候重新思考数据架构了。
经过18个月的持续迭代,我们最终基于阿里云OpenLake构建了支持实时数据湖、离线数仓统一管理的湖流架构。这套系统现在每天处理20TB+的HR相关数据,包含结构化考勤记录、非结构化简历PDF、实时视频面试流等多元数据类型,数据新鲜度从T+1提升到分钟级。更重要的是,整体计算成本反而降低了37%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型背后的业务驱动力
2.1 传统数仓的瓶颈突显
2019年的人力家数仓是典型的Kimball星型模型,主要痛点集中在:
- 扩展性陷阱:MySQL分库分表方案在分表键选择不当时,查询性能呈指数级下降
- 实时性缺陷:T+1的批处理模式导致招聘进度看板永远滞后一天
- 类型局限:无法处理视频面试的流数据和新收购公司的JSON格式简历
当时最典型的案例是:某次紧急人才盘点需要合并3个子公司的数据,我们花了72小时才完成异构数据转换入库,完全错过了黄金招聘期。
2.2 湖仓一体化的转折点
2021年测试阿里云DataWorks时,我们发现其Delta格式的元数据管理能力可以完美解决我们的多版本数据回溯需求。具体技术验证包括:
- 使用OSS替代HDFS存储原始数据,成本下降60%
- 通过MaxCompute+Spark实现批流统一计算引擎
- 利用DataWorks的数据地图功能,治理效率提升40%
这个阶段最大的收获是理解了"数据湖不是垃圾桶"的真谛——我们建立了严格的数据分区规范(按ds/hr两级分区)和元数据标准(Apache Atlas),这是后续架构演进的基础。
3. OpenLake架构的核心设计
3.1 分层架构详解
我们的生产环境最终采用五层模型:
code复制原始层(OSS)
↓ [Flink SQL实时摄入+Kafka]
明细层(Delta Lake)
↓ [DataWorks调度]
集市层(MaxCompute)
↓ [实时视图]
服务层(Hologres+AnalyticDB)
↓ [API网关]
应用层(BI+业务系统)
关键设计决策:
- 存储分离:原始数据永远保留在OSS,计算层无状态
- 统一元数据:通过DataWorks的元数据中心管理所有数据资产
- 动态资源:使用EMR Serverless处理波峰波谷明显的招聘季数据
3.2 实时能力突破
在面试质量分析场景中,我们实现了:
python复制# Flink SQL实时处理视频面试流
CREATE TABLE video_stream (
interview_id STRING,
emotion_score DOUBLE,
speech_rate INT
) WITH (
'connector' = 'kafka',
'topic' = 'video_interview',
'properties.bootstrap.servers' = 'kafka-host:9092'
);
-- 实时计算面试压力指数
INSERT INTO hologres_rt_table
SELECT
interview_id,
(emotion_score * 0.7 + speech_rate * 0.3) AS stress_index,
HOP_ROWTIME(ts, INTERVAL '5' SECOND, INTERVAL '1' MINUTE) AS window_time
FROM video_stream
GROUP BY HOP(ts, INTERVAL '5' SECOND, INTERVAL '1' MINUTE), interview_id;
这套实时流水线将面试官决策响应时间从小时级缩短到90秒内。
4. 踩坑实录与性能优化
4.1 小文件合并难题
初期每天产生20万+小文件导致查询性能骤降,最终解决方案:
- 在Delta Lake启用自动合并(
spark.delta.merge.repartitionBeforeWrite=true) - 按小时调度优化任务(EMR Spark调优参数见下表)
| 参数 | 原值 | 优化值 | 效果 |
|---|---|---|---|
| spark.sql.shuffle.partitions | 200 | 50 | 减少小文件 |
| spark.executor.memory | 4g | 8g | 提升合并速度 |
| delta.targetFileSize | 默认128MB | 256MB | 平衡IO效率 |
4.2 元数据爆炸问题
当表数量超过5000时,DataWorks数据地图出现加载延迟。我们通过三级治理解决:
- 冷热分离:6个月未访问的表自动归档到低成本OSS
- 生命周期:设置临时表的TTL(测试表默认7天)
- 标签体系:用业务域+数据Owner打标,查询效率提升60%
5. 架构演进的关键收获
-
成本视角:湖存储确实便宜,但计算资源规划更重要。我们通过EMR自动伸缩策略,在非招聘季节省了45%的集群成本
-
组织适配:数据团队必须重组为领域小组(招聘域、薪酬域等),这是发挥湖仓价值的前提
-
工具链沉淀:我们开源了内部开发的Schema变更比对工具,解决了Delta Lake的DDL版本冲突问题
当前正在探索Iceberg多引擎兼容特性,为未来的多云部署做准备。不过我的切身经验是:架构演进永远要跟着业务节奏走,技术先进性要为业务实效让路。
