Pinot架构介绍

  1. High Level Architecture


  2. 目的:对给定数据集提供分析服务2. 输入数据:Hadoop & Kafka3. 索引技术:为了提供快速的查询,Pinot 采用列式存储以及各种索引技术(bitmap,inverted index)
  3. Data Flow
    2.1 Hadoop (Historical)


  4. 输入数据:AVRO, CSV, JSON等;2. 处理流程:在HDFS上的文件通过MR任务将数据变成有索引的Segment,然后推送到Pinot的集群的历史节点,去提供Query的能力;3. 数据失效:有索引的Segment可以配置保留日期,在预先配置的失效日期之后被自动的删除;
    2.2 Realtime


  5. 输入数据:Kafka stream2. 处理流程:实时数据节点通过消费 Kafka 的数据,在内存中生成带有索引的 Segment,并周期性的 flush 到磁盘,然后提供查询的功能;3. 数据失效:实时节点的数据的保留日期会相对比较短,比如保留3天的数据,实时节点的数据在时效前会存储到历史节点中;
    2.3 Query routing
    这条查询语句:select count() from table where time > T
    转化为下面两跳查询语句:1. historical node: select count(
    ) from table where time > T and time < T12. realtime node: select count(*) from table where time > T1
    note:
  6. 用户的所有的查询会发送到 Pinot Broker;2. 用户并不需要关心查询是被发往实时还是历史节点;3. Pinot Broker 会根据 Query 的情况自动的将请求切分然后按照需要发送给实时节点和历史节点;4. 最后能够将结果进行自动的合并;
  7. Pinot Components Architecture



    note:

  8. 整个系统利用 Apache Helix 作为集群的管理;2. 利用 Zookeeper 存储集群的状态,同时保存 Helix 和 Pinot 的配置;3. Pinot 利用 NFS 来将在 HDFS 上用 MR 产生的 Segment 推到 PinotServer。
    3.1 Historical Node



    3.1.1 Data Preparation

  9. 带有索引的 Segment 在 Hadoop 中被创建2. Pinot 团队提供了生成 Segment 的 Library3. 数据格式可以是AVRO, CSV, JSON
    3.1.2 Segment creation on Hadoop
  10. HDFS 中的数据被分成256/512MB 的分片2. 每一个 mapper 将一个分片生成一个新的带有索引的 Segment
    3.1.3 Segment move from HDFS to NFS
  11. 从 HDFS 读取数据,通过 httppost 送到 Pinot Controller 节点2. PinotController 会将 Segment 存储在 mount 在Pinot Controller 节点上的 NFS 中3. 然后 Pinot Controller 会将 Segment 分配给一个 Pinot Server 4. 分配的相关信息则是由 Helix 来维护和管理
    3.1.4 Segment move from NFS to Historical Node
  12. Helix会监控 Pinot Server 的存活状态2. 当一个 Server 启动时,Helix 会通知 Pinot Server 分配给该 Server 的Segment3. Pinot Server 从Controller Server 下载 Segment 并且装入到本地的磁盘中
    3.1.5 Segment Loading
  13. 解压缩的 Segment 中包含元数据以及每列的正排和倒排索引2. 然后根据装载模式(memory, mmap),装载到内存或是被mmap到服务器3. 装载完成之后,Helix 会通知 Broker 节点该 Segment 可以在该服务器被使用,Broker 会在查询时将查询路由到该服务器
    3.1.6 Segment Expiry
  14. Pinot 控制服务有一个后台清理线程去根据元数据删除过期的 Segment2. 删除 Segment 会清理掉 Controller 服务中 NFS 上的数据,以及 Helix 服务上的元数据信息3. Helix 会通知 Pinot Server 对 Segment 进行在线离线切换,将 Segment 变为离线状态,然后变为删除状态,从本地磁盘删掉数据
    note:
  15. hadoop jar pinot-hadoop-0.016.jar SegmentCreation job.properties2. hadoop jar pinot-hadoop-0.016.jar SegmentTarPush job.properties
  16. Segment 装载过程是由 Helix 触发的离线在线切换
    3.2 Real time Node



    3.2.1 Kafka consumption

  17. Pinot 创建一个 resource,Pinot 会分配一组实例从Kafka topic 消费数据2. 如果 Pinot Server 挂掉,这个消费会被从新分布到其他的节点
    3.2.2 Segment creation
  18. 当 Pinot Server 消费了预先配置好数量的事件后,会在内存中将数据转变为离线 Segment2. 当 Segment 创建成功后,Pinot 提交 offset 到 Kafka,如果失败,Pinot 会从上次的 checkpoint 重新生成 Segment
    3.2.3 Segment Expiry
  19. 只能配置到天,失效之后 Segment 从实时节点分发到历史节点
    note:
    实时节点生成的 Segment 的格式和历史节点生成 Segment 格式相同,从而方便 segment 从实时节点到历史节点的重新分发。
    3.3 Pinot Cluster Management



    3.3.1 概述

  20. 所有的管理命令都需要通过 Pinot Controller,比如这些命令:allocating Pinot Server and Brokers, Creating New Table, Uploading New Segments2. 所有的 Pinot admin cmd 都需要在内部通过 Helix Admin Api 翻译成 Helix cmd,然后 Helix cmd 修改 Zookeeper 中的元数据3. Helix Controller 作为系统的大脑,将元数据的变化转义成一个 action set,并在对应的 participant 上执行相应的 action4. Helix Controller 还负责监控 Pinot Server,当 Pinot Server 启动或是挂掉的时候,Helix Controller 发现并修改对应的 external view,Pinot Broker 观察到观察这些变化,并随之动态更改 table 的路由
    3.3.2 术语对应
  21. Pinot Segment:对应 Helix Partition,每一个 Segment 都有多分拷贝2. Pinot Table:由多个 Segment 组成,隶属于同一个 Table 的 Segment 具有同一个 Schema3. Pinot Server:对应 Helix Participant,主要用于保存 Segment4. Pinot Broker:对应 Helix Spectator,用于观察 Segment 和 Pinot Server 的状态的变化。为了支持多租户,Pinot Broker 也作为 Helix Participant
    3.3.3 Zookeeper
    主要用于存储集群的状态,同时也用于存储 Helix 和 Pinot 的一些配置
    3.3.4 Broker Node
    主要负责将客户端请求的 query 路由到 Pinot Server 实例上,收集 Pinot Server 的返回结果,最后合并成最终结果,返回给客户端。功能有:
  22. service discovery:感知 Server、Table、Segment、Time range,计算 query 的执行路由
  23. Scatter gather:将 query 分发到对应的 Server,将每个 Server 返回的结果合并成,返回给客户端
    Pinot Broker 实现了多种选择 Pinot Server 的策略:Segment 均匀分布策略、贪心算法策略(最大/小 Pinot Server 参与)、随机选择 segment 的 Server。如果 Pinot Server 执行失败或超时,Pinot Broker 只能返回部分结果,未来通过支持其他的方式,比如 re-try 或者将相同的执行计划发给多个 segment 副本
  24. Pinot Index Segment



    4.1 行式存储和列式存储的区别
    4.1.1 行式存储特点

  25. OLTP
  26. 一整行数据被保存在一起
  27. INSERT/UPDATE容易
    4.1.2 列式存储特点
  28. OLAP2. 查询时只有涉及到的列会被读取3. 任何列都能作为索引:fixed length index、sparse index等4. 易于压缩5. 配合 bitmap 可以提高查询执行性能
    4.2 Anatomy of Index Segment
    4.2.1 Segment Entities
  29. Segment Metadata :主要定义 Segment 的元数据信息,包括:
    segment.namesegment.table.namesegment.dimension.column.namessegment.metric.column.namessegment.time.column.namesegment.time.intervalsegment.start.time/segment.end.timesegment.time.unit......
  30. Column Metadata,包括:
    column..cardinalitycolumn..totalDocscolumn..dataType: INT/FLOAT/STRING column..lengthOfEachEntrycolumn..columnType: Dimension/Metric/Timecolumn..isSortedcolumn..hasDictionarycolumn..isSingleValues......
  31. Creation Metadata (creation.meta),包括:
    Dictionary (.dict):列的编码字典Forward Index (.sv.sorted.fwd): Single Value Sorted Forward Index,前缀压缩索引
  32. Query Processing




    5.1 Query Execution Phases
    5.1.1 Query Parsing
    采用 Antlr 做语法解析器将 PQL 转化成 query parse tree
    5.1.2 Logical Plan Phase
    通过查询元数据信息,将 query parse tree 转化成 Logical Plan Tree
    5.1.3 Physical Plan Phase
    根据 Segment 的信息进一步优化、具体执行计划
    5.1.4 Executor Service
    在相应的 Segment 上执行 physical operator tree
    5.2 PQL
    PQL 是 SQL 的一个子集,不支持 join,不支持子查询

ref: https://github.com/linkedin/pinot/wiki/Architecture

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容