More Related Content Similar to The Construction and Practice of Apache Pegasus in Offline and Online Scenarios Integration (20) More from acelyc1112009 (11) The Construction and Practice of Apache Pegasus in Offline and Online Scenarios Integration6. 读写方式
接口 说明
读取
get 读取单条记录
multiGet 同一HashKey下读取多条记录
batchGet 跨HashKey读取多条记录
hashScan 同一HashKey下范围扫描
fullScan 全表扫描
写入
set 写入单条记录
multiSet 同一HashKey下原子写入多条记录
batchSet 跨HashKey写入多条记录
9. 读写痛点
• 读放大
– 读操作需要从新到旧(从上到下)一层一层查找,直到找到想要的数据。这
个过程可能需要不止一次 I/O。特别是 Range Query 的情况,影响很明显
• 空间放大
– 写入为顺序写(append-only)的,不是 in-place update ,过期数据不会马
上被清理掉
• 写放大
– RocksDB 通过后台的 compaction 来减少读放大(减少 SST 文件数量)和空
间放大(清理过期数据),但也因此带来了写放大(Write Amplification)的
问题。
• 吞吐
– 受限于RPC、2PC,单节点极限吞吐,写入10M/S,读取100M/S
11. BulkLoad模式
• 通过RocksDB调参,提升灌数据场景的QPS和吞吐
参数 值
disable_auto_compactions true
level0_file_num_compaction_trigger
level0_slowdown_writes_trigger
level0_stop_writes_trigger
∞
soft_pending_compaction_bytes_limit
hard_pending_compaction_bytes_limit
no limit
max_compaction_bytes ∞
write_buffer_size raise to 256M form 64M
max_write_buffer_number raise to 6 form 4
15. 在线 离线 MetaServer
Zookeeper
Primary 0
Secondary 1 Secondary 2
Primary 0
Secondary 1 Secondary 2
HDFS
SST file SST file SST file SST file
Upload
17. 离线 在线
通过RocksDB IngestSST接口加载数据文件
导入引擎
将数据文件从HDFS下载到ReplicaServer
数据下载
通过离线系统ETL生成RocksDB底层数据文件
数据生成
执行ManualCompaction,优化读取性能和空间占用
数据整理
19. 数据生成 Pegasus-Spark
Convert to SST file for Bulk load
node
node
node
node
node
node
Transform(Pegasus-Spark)
HDFS
(sst file)
Distinct
Repartition
Sort
original
data
original
data
22. 数据整理 - Compaction
• 数据导入后,必须进行全量数据Compaction
• BulkLoad与Compaction解耦,支持多次BulkLoad之后,
一次性Compaction
• 防止用户BulkLoad之后忘记Compaction,强制凌晨进行
一次Compaction
25. 一致性问题
• 导入
– 单个分片的Ingestion为原子操作,无法回滚
– 多个分片无法保证同一时刻进行Ingestion操作
– 全表的Ingestion非原子,无法回滚
– Ingestion瞬间集群阻写
Downloading Download Ingesting Ingested Success
Start Download Start Ingest Start CleanUp
26. 性能优化
• 校验
– 去除冗余数据校验
• RocksDB调参
– move_files参数
• DirectIO
– 下载阶段文件写入开启DirectIO
• 限速
– 数据上传下载限速
– 下载、Ingest操作并发度限制
28. 国际广告算法
• 业务背景
– 静态特征:年龄、性别、职业
– 行为数据:APP的安装、卸载、使用、登录等
– 在线喂给推荐引擎,预测打分,推荐App列表
– 每天离线计算过去30天的用户行为,全量灌库
– 3亿个HashKey,41个SortKey,100+特征,数据总量2.2TB
• 方案
– 离线计算结束,数据对接PegasusSpark,生成数据文件
– 每天低峰使用BulkLoad灌库,完成后进行Compaction
31. Zili数据迁移
• 背景
– feedsprofile表迁移到印度机房自建新集群,总数据量2.3T
– 原集群版本2.0-wirte-optim,数据格式为V1
– 为了支持HDFS,新集群必须使用V2
– 业务允许低峰停写迁移
• 流程
– 原集群从2.0-wirte-optim升级到2.2.2,支持备份到HDFS
– 原集群生成数据快照,上传到HDFS
– Spark离线计算
• 读取并解析数据 V1转换为V2 排序去重 数据分区 写入HDFS
– BulkLoad将HDFS的数据灌入新集群
Editor's Notes https://juejin.cn/post/7098585141953429512 WAL + Compaction,离散的随机写请求都转换成批量的顺序写请求,以此提高写性能 1. Compaction中实现过期数据删除 Move参数调整完成