Presto — turli data source’lar ustida distributed SQL querylarni parallel bajarishga mo‘ljallangan query engine. U data’ni o‘zida asosiy storage sifatida saqlamaydi, balki connectorlar orqali warehouse, data lake, relational database va boshqa tizimlardan o‘qiydi.
Presto interaktiv analytics va katta datasetlarni pastroq latency bilan query qilish maqsadida yaratilgan.
Coordinator
Coordinator client querylarini qabul qiladi.
U:
- SQL parse;
- semantic analysis;
- query plan;
- task scheduling;
- worker coordination;
- result qaytarish
vazifalarini bajaradi.
Coordinator katta resultni o‘zi qayta ishlashi yoki clientga uzatishi mumkin.
Worker
Worker query tasklarini bajaradi.
U:
- source’dan split o‘qiydi;
- filter;
- projection;
- join;
- aggregation;
- exchange
amallarini bajaradi.
Workerlar orasida data network orqali almashadi.
Connector
Connector Presto va tashqi data source orasidagi adapter.
U:
- schema va table metadata;
- split discovery;
- data read;
- predicate pushdown;
- type mapping;
- ayrim write amallari
ni ta’minlaydi.
Har connector bir xil SQL funksiyalarini qo‘llamasligi mumkin.
Catalog
Catalog connector konfiguratsiyasini ifodalaydi.
SQL obyekt nomi quyidagicha bo‘lishi mumkin:
catalog.schema.table
Masalan, bitta queryda data lake va relational database table’lari join qilinishi mumkin.
Federated query
Turli source’lar bitta SQL query ichida birlashtiriladi.
Masalan:
object storage’dagi eventlar
JOIN
relational database’dagi userlar
Bu data’ni oldindan bitta joyga ko‘chirmasdan tahlil qilishga yordam beradi.
Ammo cross-source join katta network va source load yaratishi mumkin.
Split
Connector table’ni parallel o‘qiladigan splitlarga ajratadi.
Split:
bo‘lishi mumkin.
Ko‘p split parallelismni oshiradi, juda ko‘p mayda split scheduling overhead yaratadi.
Stage va task
Query plan stage’larga bo‘linadi.
Stage ichida bir nechta task workerlarda ishlaydi.
Stage’lar exchange orqali bog‘lanadi.
Blocking aggregation yoki global sort keyingi stage boshlanishiga ta’sir qilishi mumkin.
Exchange
Workerlar orasidagi data almashuvi exchange deb ataladi.
Turlari:
- gather;
- repartition;
- replicate;
- local exchange.
Join va group by ko‘pincha key bo‘yicha repartition talab qiladi.
Network bandwidth query performance’ining muhim qismi.
Predicate pushdown
Filter connector va source’ga uzatiladi.
Masalan, object storage’da partition pruning yoki database’da WHERE bajariladi.
Bu Presto’ga keladigan data hajmini kamaytiradi.
Connector faqat qo‘llaydigan predicate’larni push qiladi.
Column pruning
Query ishlatmagan columnlar source’dan o‘qilmaydi.
Columnar file format bilan bu katta I/O tejamkorlik beradi.
SELECT * keraksiz columnlarni o‘qishi mumkin.
Join strategy
Distributed join turlari:
Partitioned join
Ikkala input join key bo‘yicha workerlar orasida taqsimlanadi.
Katta tablelar uchun.
Broadcast join
Kichik input barcha workerga yuboriladi.
Katta input local kichik nusxa bilan join qilinadi.
Kichik tomon noto‘g‘ri baholansa worker memory tugashi mumkin.
Cost-based optimizer
Optimizer statistics asosida:
- join order;
- join distribution;
- aggregation;
- exchange;
- pushdown
tanlaydi.
Statistics yo‘q yoki eskirgan bo‘lsa reja taxminiy bo‘ladi.
Memory
Presto query execution uchun distributed memory ishlatadi.
Memory kategoriyalari:
Katta hash join va aggregation memory talab qiladi.
Limit oshsa query rad etilishi yoki diskka spill qilinishi mumkin.
Spill
Memory yetmaganda ayrim operatorlar vaqtinchalik data’ni diskka yozadi.
Bu queryni tugatishga yordam beradi, ammo latency va disk I/O oshadi.
Spill storage hajmi va encryption boshqariladi.
Resource group
Querylar jamoa yoki workload bo‘yicha resource group’larga ajratiladi.
- concurrency;
- queue;
- memory;
- priority;
- timeout.
Dashboard querylari uzun ad-hoc querylar tomonidan to‘liq bloklanmasligi kerak.
Data type
Turli connectorlar o‘z type’larini Presto type’lariga map qiladi.
Decimal precision, timestamp timezone va nested type conversion muhim.
Bir source’dagi timestamp boshqa source bilan join qilinganda timezone farqi noto‘g‘ri natija berishi mumkin.
Result hajmi
Katta resultni clientga to‘liq qaytarish coordinator va networkni band qiladi.
Analytical query:
- aggregation;
- limit;
- target tablega yozish;
- export storage
orqali natijani boshqaradi.
Millionlab rowni browserga yuborish foydali emas.
Failure
Worker yo‘qolsa ayrim querylar fail bo‘lishi mumkin.
Retry imkoniyati engine arxitekturasi va query turiga bog‘liq.
Source transient xatosi ham queryni to‘xtatishi mumkin.
Client idempotent queryni qayta yuborishi ehtimoli bor.
Presto va storage
Presto storage lifecycle, backup va ingestionni o‘zi to‘liq boshqarmaydi.
- fayl layout;
- partition;
- compaction;
- statistics;
- access
uchun javob beradi.
Query engine va storage alohida scale qilinishi mumkin.
Query monitoring
Har query uchun:
kuzatiladi.
Ko‘p scanned data, ammo kichik output partition yoki column pruning ishlamayotganini ko‘rsatishi mumkin.
Source bosimi
Federated query tashqi relational database’dan katta table scan qilsa uning production workloadiga zarar yetkazishi mumkin.
Connector concurrency, predicate pushdown va read replica orqali bosim cheklanadi.
Analytical data’ni alohida storage’ga ko‘chirish zarur bo‘lishi mumkin.
Prepared statement
Takroriy query parameterlar bilan tayyorlanishi mumkin. Bu string concatenationni kamaytiradi, ammo physical plan parameter taqsimotiga har doim optimal bo‘lmasligi mumkin.
Bog‘liq tushunchalar
Distributed SQL, Coordinator, Worker, Connector, Catalog, Federated query, Predicate pushdown, Column pruning, Broadcast join, Query engine