字节跳动推荐系统ETL全景:从数据抽取到特征工程的工业化实践

字节跳动推荐系统ETL全景:从数据抽取到特征工程的工业化实践

【免费下载链接】monolith ByteDance's Recommendation System 【免费下载链接】monolith 项目地址: https://gitcode.com/GitHub_Trending/monolith4/monolith

引言:推荐系统的数据基石

在推荐系统的迭代生命周期中,数据处理管道(ETL) 作为模型训练与服务的前置环节,直接决定了特征质量与系统性能。字节跳动(ByteDance)的推荐系统每天处理PB级用户行为数据,其ETL流程通过流批一体化架构实现了数据从原始日志到模型特征的高效转化。本文将深度剖析该系统的数据抽取转换环节,揭秘如何通过模块化设计应对高并发、低延迟与复杂特征工程的挑战。

一、数据抽取:多源异构数据的统一接入

1.1 数据源类型与接入策略

字节推荐系统的数据源涵盖实时流数据离线批数据,具体接入策略如下表所示:

数据源类型技术选型典型场景数据量级延迟要求
Kafka流数据KafkaDataset用户行为实时反馈百万QPS毫秒级
离线文件存储FilePBDataset历史行为日志PB级/天小时级
Parquet列式存储ParquetDataset用户画像特征百亿行记录分钟级
TFRecord格式TFRecordDatasetWrapper模型输出样本千万级样本/天分钟级

代码示例:Kafka实时数据抽取

# 字节推荐系统中Kafka数据源初始化
dataset = KafkaDataset(
  topics=["user_click_stream", "video_play_log"],
  group_id="recsys_training_group",
  servers="kafka-01:9092,kafka-02:9092",
  kafka_other_metadata="security.protocol=sasl_ssl,sasl.mechanism=SCRAM-SHA-256",
  poll_batch_size=1024,
  message_poll_timeout=30000
)

1.2 数据格式解析框架

系统采用Protocol Buffer(PB) 作为统一数据交换格式,定义了三种核心数据结构:

// 核心数据结构定义(simplified)
message Instance {
  repeated int64 fidv1_features = 1;  // FIDv1特征(slot-based)
  map<string, int64> fidv2_features = 2;  // FIDv2特征(name-based)
  map<string, float> dense_features = 3;  // 稠密特征
  LineId line_id = 4;  // 包含用户ID、物品ID等元信息
  repeated int32 actions = 5;  // 用户行为序列
}

数据解析流程

  1. 通过parse_instances函数解析二进制PB流
  2. 支持FIDv1(slot索引)与FIDv2(名称索引)双模式特征提取
  3. 自动处理稀疏特征的RaggedTensor转换

代码示例:实例解析函数

# 从Kafka流中解析Instance数据
features = parse_instances(
  tensor=kafka_variant_tensor,
  fidv1_features=[1001, 1002, 1003],  # 指定需要抽取的slot
  dense_features=["watch_time", "click_prob"],
  dense_feature_shapes=[1, 1],
  extra_features=["user_id", "item_id"]
)

二、数据转换:特征工程的流水线作业

2.1 转换操作的模块化设计

系统将数据转换操作抽象为可组合的Transform算子,核心算子如下:

2.1.1 过滤类算子
  • FilterByFid:基于特征ID过滤样本
  • FilterByAction:根据用户行为过滤(如点击、停留)
  • FilterByLabel:移除无效标签样本

代码示例:多条件组合过滤

# 构建过滤算子组合
transform = Compose([
  FilterByFid(has_fids=[1001, 1002], filter_fids=[-999]),  # 必须包含特征1001/1002,排除-999
  FilterByAction(has_actions=[1, 2]),  # 保留点击或收藏行为
  FilterByLabel(thresholds=[-100.0, 0.0])  # 多任务标签过滤
])
2.1.2 特征构造算子
  • AddLabel:根据行为生成训练标签(支持多任务)
  • FeatureCombine:特征交叉(如用户ID+物品ID组合)
  • SwitchSlot:特征slot转换(用于特征共享)

mermaid流程图:标签生成逻辑 mermaid

2.2 高性能转换引擎

为应对大规模数据处理需求,系统实现了混合执行引擎

  • CPU路径:基于TensorFlow OpKernel实现多线程并行
  • GPU路径:通过RaggedTensor与CUDA核函数加速稀疏特征处理

关键优化技术

  1. 特征预取prefetch_queue实现数据IO与计算重叠
  2. 算子融合:如parse_instancesfilter_by_fids合并执行
  3. 内存池管理cached_mem_pool减少频繁内存分配开销

代码示例:GPU加速特征转换

# 启用GPU加速的特征转换流水线
dataset = dataset.map(
  lambda variant: add_label(
    variant,
    config="1,2:3:1.0;4::0.5",  # 多任务标签配置
    negative_value=0.0,
    new_sample_rate=0.8
  ),
  num_parallel_calls=tf.data.AUTOTUNE
).apply(
  tf.data.experimental.optimization.map_and_batch_fusion()
)

三、质量监控与容错机制

3.1 数据校验与清洗

系统内置多级校验机制保障数据质量:

  1. 格式校验:通过PB解析异常捕获损坏数据
  2. 特征校验:检查特征维度与类型一致性
  3. 业务规则校验:如req_time_min过滤过期数据

代码示例:数据质量监控钩子

# 注册数据校验钩子
tf.add_to_collection(
  "DATA_QUALITY_HOOKS",
  lambda features: tf.debugging.assert_all_finite(features["watch_time"], "Invalid watch_time")
)

3.2 容错与降级策略

  • 数据倾斜处理:通过dynamic_sharding_dataset动态调整文件分片
  • 节点故障恢复:Kafka消费者组自动重平衡
  • 流量削峰message_poll_timeout控制消费速率

mermaid时序图:Kafka消费者重平衡 mermaid

四、工程实践与最佳实践

4.1 配置化ETL流水线

通过ProtoBuf配置文件定义ETL流程,实现"代码与配置分离":

// transform_config.proto示例
message TransformConfig {
  repeated BasicConfig configs = 1;
  
  message BasicConfig {
    oneof transform {
      FilterByFid filter_by_fid = 2;
      AddLabel add_label = 3;
      // 其他算子配置...
    }
  }
}

4.2 性能调优参数

参数名称推荐值作用
cycle_length8-16interleaving并行度
block_length32每个文件块读取行数
prefetch_buffer_sizetf.data.AUTOTUNE预取缓冲区大小
num_parallel_callsCPU核心数×2并行处理线程数

五、总结与展望

字节跳动推荐系统的ETL流程通过模块化设计混合执行引擎全链路监控,构建了支撑日均千亿级数据处理的基础设施。未来演进方向包括:

  1. 自适应调度:基于数据热度动态调整资源分配
  2. 特征自动生成:结合大语言模型实现特征工程自动化
  3. 流批一体存储:统一Lakehouse架构下的ETL流程

通过本文阐述的ETL架构与实践经验,开发者可快速构建高性能推荐系统数据管道,为模型训练提供高质量特征输入。

附录:核心代码目录结构

monolith/native_training/data/
├── transforms/          # 转换算子定义
│   ├── transforms.py    # FilterByFid/AddLabel等核心类
│   └── transform_config.proto  # 配置协议
├── parsers.py           # 数据解析函数
├── datasets.py          # 数据源接入类
├── feature_utils.py     # 特征处理工具函数
└── kernels/             # C++/CUDA高性能内核
    ├── parse_sparse_feature.cc
    └── transform_dataset_kernel.cc

扩展阅读

  • 下一篇:《推荐系统特征存储设计:从Redis到分布式哈希表》
  • 工具推荐:Monolith Feature Studio(内部特征工程平台)

【免费下载链接】monolith ByteDance's Recommendation System 【免费下载链接】monolith 项目地址: https://gitcode.com/GitHub_Trending/monolith4/monolith

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值