LinkedIn开源Pinot:一款实时分布式OLAP存储系统
本周技术动态
在大数据技术圈,本周发生了两件重要事件:一是LinkedIn开源了其实时分布式OLAP存储系统Pinot;二是Spark正式发布了1.4版本[1]。
Pinot简介
Pinot是LinkedIn为解决大规模数据集上的实时分析需求而开发的分布式OLAP系统。该系统已在LinkedIn内部使用超过两年,并支持超过25个分析产品和30个内部应用。关于名字的由来,团队负责人Kishore解释说,黑皮诺葡萄酒虽难以照料但潜力巨大,正如数据处理一样复杂且充满价值[2]。
Pinot核心能力
- 列式存储数据库,支持RunLength Encoding和Fixed Bit Length Encoding压缩。
- 可插拔索引技术,包括SortedIndex、Bitmap Index和Inverted Index。
- 根据查询和Segment元数据优化执行计划。
- 支持从Kafka实时数据流及Hadoop批量数据的导入。
- 提供类SQL查询语言,支持选择、聚合、过滤、分组、排序等功能。
- 支持多值字段和水平扩展与容错。
关键概念
Table: 数据的逻辑抽象,定义行和列结构。
Segment: 数据的真实物理存储单元。
架构组成
- PinotController: 管理集群节点,负责表和Segment的生命周期操作以及分配策略。
- PinotServer: 保存一个或多个物理Segment,消费Kafka分区子集数据并执行查询请求。
- PinotBroker: 路由客户端查询请求到对应服务节点,合并结果后返回给客户端。
架构图示
对比Druid
Pinot与Druid架构类似,二者均支持实时与历史数据处理,包含实时节点(RealTime Nodes)和历史节点(Historical Nodes)。同时,两者都采用时间分区机制,并支持流式和批量数据加载[3]。
数据流解析
对于历史数据,Pinot通过MR任务将HDFS文件转换为索引化的Segment并推送至集群的历史节点;对于实时数据,则直接从Kafka消费生成内存Segment并定期刷新至磁盘[4]。
查询路由机制
Pinot Broker自动拆分用户查询并发送至实时或历史节点,最终合并结果返回。例如,时间条件查询会分别路由至历史和实时节点执行后再合并结果[5]。
集群管理
Pinot利用Helix进行集群管理,分为参与者(Pinot Server)、观察者(Pinot Broker)和控制者(Pinot Controller)三种角色[6]。
编译与安装
Pinot基于Java开发,支持JDK 1.7及以上版本。可通过以下步骤快速部署:
git clone https://github.com/linkedin/pinot.git
cd pinot
mvn install package -DskipTests
cd pinot-distribution/target/pinot-0.016-pkg
bin/quick-start-offline.sh
访问 http://{yourhost}:9000/query/index.html
即可进入交互式查询页面。
总结
LinkedIn Pinot代表了当前大数据实时分析的发展趋势。它通过划分实时和历史数据、结合列式存储与索引技术,满足了低延迟的OLAP需求。尽管目前不支持Join操作,但在未来的设计中可以考虑更先进的技术实现方式。