ბიბლიოთეკა
00/07 · ~34 წთ
GUIDEDECK · სანდო მონაცემების გადასატანად

ETL & ELT
პაიპლაინები — მონაცემები
იქიდან, სადაც ცხოვრობს, იქამდე, სადაც გამოიყენება.

34-წუთიანი სამუშაო სესია მონაცემთა პაიპლაინებზე: ამოღება, გარდაქმნა და ტვირთვა; რატომ შეცვალა ELT-მ თამაშის წესები; პარტია vs სტრიმინგი; და ის იდემპოტენტურობა, ორკესტრირება და ხარისხის შემოწმებები, რომლებიც პაიპლაინს ისეთს ხდის, რომ მშვიდად დაიძინოთ.

~34 წთმონაცემთა გუნდიინსტრუმენტისგან დამოუკიდებელი
გადაახვიეთ
01 · პაიპლაინების საჭიროება 4 წთ

თქვენი მონაცემები მიმოფანტულია.
შეკითხვებს კი ისინი ერთად სჭირდება.

შეკვეთები აპლიკაციის ბაზაშია, კლიენტები — CRM-ში, ჩამოჭრები — გადახდების პროცესორში, სარეკლამო ხარჯი — ათეულ SaaS დაშბორდში. ყოველი სასარგებლო შეკითხვა — "რა იყო გასული კვირის მარჟა რეგიონების მიხედვით?" — მოითხოვს, რომ ეს ყველაფერი შეერთდეს, გაიწმინდოს და სანდო იყოს. პაიპლაინი სწორედ ისაა, რაც ამას განზრახ აკეთებს და არა ხელით.

მონაცემთა პაიპლაინი — გამეორებადი, ავტომატიზებული ნაკადი, რომელიც მონაცემებს წყარო-სისტემებიდან დანიშნულების ადგილამდე (როგორც წესი, მონაცემთა საწყობამდე) გადააქვს და გზადაგზა ისე გარდაქმნის, რომ შეკითხვისთვის მზად იყოს. საქმე ერთჯერად კოპირებაში არაა — არამედ იმაში, რომ ხვალაც გაეშვება, განრიგით, დაკვირვებადად და ხელახლა გაშვებადად.
N

წყარო-სისტემა, თითოეული თავისი სქემით, ფორმატითა და უცნაურობებით.

1

ადგილი, სადაც ანალიტიკოსები და დაშბორდები ნამდვილად აგზავნიან შეკითხვებს — საწყობი.

24/7

ახალი სტრიქონები მუდმივად მოდის; გუშინდელი ექსპორტი უკვე მოძველებულია.

∞

სქემები იცვლება, API-ები ახლდება. დააპროექტეთ მტვრევადობაზე და არა იდეალურ სტოპკადრზე.

ხელით აწყობილის ხაფანგი

  • ერთჯერად სკრიპტს, რომელსაც ვიღაცის ლეპტოპიდან უშვებენ, ისტორია არ აქვს — ხელახლა გაუშვებთ და გასული კვირა გაქრა.
  • ის პირდაპირ პროდაქშენს ურტყამს და ბაზისთვის რეალურ მომხმარებლებს ეჯიბრება.
  • როცა სვეტს სახელს გადაარქმევენ, ის ჩუმად ვარდება და პრეზენტაციაში ციფრები შეუმჩნევლად არასწორი ხდება.

ბევრი არეული წყარო ერთ პაიპლაინში იყრის თავს და ერთ საწყობში ეშვება, რომელსაც მთელი კომპანია ენდობა.

ხელით — მყიფე და უხილავი
// Monday morning: finance needs last week's revenue
const rows = await prod.query("SELECT * FROM orders") // on the live DB
sendEmail("finance@co", toCSV(rows))
// no history · no schema check · breaks on a rename · run by a human
პაიპლაინი — ერთხელ აღწერილი, თავად მუშაობს
extract("orders", { from: "replica" })   // not prod
  .transform(cleanRevenue)               // typed + tested
  .load("warehouse.revenue")             // versioned, full history
// scheduled · monitored · re-runnable · alerts on failure
02 · სამი ეტაპი 6 წთ

სამი სამუშაო, თანმიმდევრობით:
ამოღება, გარდაქმნა, ტვირთვა.

ყოველი პაიპლაინი — ინსტრუმენტი რაც უნდა იყოს — სწორედ ამ სამ რამეს აკეთებს. სიტყვები რომ ერთხელ დაალაგოთ, დანარჩენი საუბარი მხოლოდ იმაზეა, სად და როდის უშვებთ მათ.

ETL — Extract, Transform, Load — მონაცემების გადატანის სამ ეტაპს ასახელებს: ამოიღეთ წყაროდან (extract), გადააკეთეთ და გაწმინდეთ (transform), შემდეგ ჩაწერეთ დანიშნულების ადგილას (load). სწორედ ამ სიტყვების რიგზეა კამათი მე-3 ნაწილში.
E
ამოღება
წაკითხვა წყაროდან
T
გარდაქმნა
გაწმენდა, ფორმის მიცემა, გამდიდრება
L
ტვირთვა
ჩაწერა დანიშნულების ადგილას
ეტაპი 1 · ამოღება

წაიკითხეთ ფრთხილად

ამოიღეთ ჩანაწერები მონაცემთა ბაზებიდან, API-ებიდან, ფაილებიდან ან მოვლენების ნაკადებიდან. ორი რთული ადგილია: არ გადატვირთოთ წყარო და აიღოთ მხოლოდ ის, რაც ახალია — აწარმოეთ watermark (ბოლო id ან დროის ნიშნული), რომ დელტა წაიკითხოთ და არა მთელი ცხრილი.

// incremental: only rows since last run extract({ table: "orders", since: lastRun.watermark // e.g. updated_at })
ეტაპი 2 · გარდაქმნა

გახადეთ სწორი & გამოსადეგი

მიუთითეთ ტიპები, გაასწორეთ კოდირებები, წაშალეთ დუბლიკატები, მიაერთეთ საცნობარო მონაცემები, გამოიყენეთ ბიზნესწესები. სწორედ აქ გადადის მონაცემი ნედლიდან სანდომდე — და აქვე ცხოვრობს ბაგების უმეტესობა, ამიტომ ეს ნაწილი ტიპიზებული და დატესტილი უნდა იყოს.

clean(o) { amount: Money.parse(o.amount), placedAt: Date.parse(o.created), region: regionOf(o.country) // enrich }
ეტაპი 3 · ტვირთვა

ჩაწერეთ იქ, სადაც შეკითხვები მიდის

დასვით შედეგი საწყობში. ბრმა ჩასმის ნაცვლად ამჯობინეთ upsert, წერეთ პარტიებად და გახადეთ ჩაწერა იდემპოტენტური, რომ ხელახალმა მცდელობამ ორჯერ ვერ დათვალოს (მე-5 ნაწილი).

load({ into: "warehouse.orders", key: "order_id", // upsert key mode: "merge" })

გარდაქმნა ისაა, სადაც ყველაფერი ფუჭდება

ჩუმი, დანაკარგიანი
// transform tangled into the read, no types
rows.forEach(r => {
  r.amount = r.amount + ""       // stringify money → lose precision
  r.date   = r.created.slice(0,10) // assumes a format that'll change
})
// bad rows pass through silently and poison the warehouse
ცხადი, ტიპიზებული, ხმამაღალი
function clean(o: RawOrder): Order {
  return {
    amount:   Money.parse(o.amount),     // typed money
    placedAt: Date.parse(o.created_at), // throws if invalid
    region:   regionOf(o.country),      // validated lookup
  }
}

ჰგავს  საწყობის მიმღებ დოკს: ამოღება არის ჩამოსული სატვირთო, გარდაქმნა — საქონლის შემოწმება და მონიშვნა, ტვირთვა კი — სწორ თაროზე დალაგება.

03 · შეცვლილი თანმიმდევრობა 6 წთ

გადაიტანეთ T L-ის შემდეგ
და ეკონომიკა თავდაყირა დგება.

ETL და ELT ერთსა და იმავე სამ ეტაპს იყენებს — უბრალოდ ვერ თანხმდებიან იმაზე, როდის უნდა გარდაქმნა. ეს ერთი გადანაცვლება თანამედროვე data engineering-ის ყველაზე დიდი ცვლილებაა და მთლიანად იმით არის განპირობებული, რაც საწყობს დღეს შეუძლია.

ELT — Extract, Load, Transform — ჯერ ნედლ მონაცემებს ტვირთავს საწყობში, შემდეგ კი მათ საწყობის შიგნით, SQL-ით გარდაქმნის. ETL გარდაქმნას ტვირთვამდე, ცალკე მანქანაზე აკეთებს. იგივე ასოებია, გადანაცვლებული — მაგრამ შედეგები დიდია.
წყარო
გარდაქმნა
ცალკე სერვერი
საწყობი
მხოლოდ სუფთა
წყარო
საწყობი
ნედლი (დაშვება)
მოდელი (SQL)
ETL — გარდაქმნა ტვირთვამდე
ELT — ტვირთე ნედლი, გარდაქმენი ადგილზე
გარდაქმნა = SQL საწყობში, მასშტაბით

ETL ცალკე მანქანაზე გარდაქმნის და მხოლოდ მზა ფორმას ტვირთავს. ELT ნედლ მონაცემებს დებს, შემდეგ კი გარდაქმნას საწყობს ატარებინებს SQL-ით.

რატომ იგო ELT

საწყობი გაიაფდა და გაიზარდა

  • ეს საწყობები სვეტოვანი / OLAP საცავებია — ღრუბლოვანი (Snowflake, BigQuery, Redshift) ან თვითჰოსტირებული (ClickHouse) — რომლებიც საცავს გამოთვლისგან აცალკევებენ, ამიტომ ნედლი მონაცემების შენახვა თითქმის უფასოა და მილიარდობით სტრიქონის სკანირება სწრაფი რჩება.
  • მათი შეკითხვების ძრავები უფრო სწრაფად გარდაქმნიან, ვიდრე ხელით აწყობილი ETL-მანქანა ოდესმე შეძლებდა, და მოთხოვნისამებრ მასშტაბირდებიან.
  • ნედლი ასლის შენახვა ნიშნავს, რომ მოთხოვნების შეცვლისას ხელახლა გარდაქმნა შეგიძლიათ — ხელახალი ამოღების გარეშე.
  • გარდაქმნები ვერსიების კონტროლში მდებარე უბრალო SQL ხდება (dbt-ის მოდელი), ამიტომ მათ ანალიტიკოსებიც ფლობენ და არა მხოლოდ ინჟინრები.
როდის იგებს ETL კვლავ

ტვირთვამდე გარდაქმნა თავის ფასს ამართლებს

  • შესაბამისობა — PII უნდა შენიღბოთ ან წაშალოთ მანამ, სანამ ის საწყობში მოხვდება.
  • ძლიერი შემცირება — 1 TB ლოგის შეჯამებამდე აგრეგირება, რომ მთელი ნაკადი არასოდეს შეინახოთ.
  • ლეგატური სამიზნეები — on-prem საწყობი, რომელსაც გარდაქმნების გასაშვები თავისუფალი გამოთვლითი რესურსი არ აქვს.
  • სტრიმინგი — მოვლენების გარდაქმნა ფრენაში, სანამ ისინი რომელიმე საცავს მიაღწევენ (მე-4 ნაწილი).

თანამედროვე ნაგულისხმევი არჩევანი ELT-ია: ამოიღეთ, ჩატვირთეთ ნედლად, შემდეგ საწყობში გარდაქმენით ვერსიების კონტროლში მყოფი SQL-ით. ETL-ს მაშინ მიმართეთ, როცა პრივატულობა, მოცულობა ან სამიზნე გარდაქმნას უფრო ადრე აიძულებს.

04 · როდის მოძრაობს 5 წთ

დაამუშავეთ ნაწილებად,
ან თითო მოვლენა ცალ-ცალკე.

ETL vs ELT იმაზე იყო, სად გარდაქმნით. ეს ცალკე შეკითხვაა: რამდენად ხშირად მოძრაობს მონაცემი. ელოდებით და დიდ გროვას განრიგით გადაიტანთ (ვთქვათ, ყოველ ღამე), თუ ყოველ ახალ ჩანაწერს იმავე წამში ამუშავებთ? კომპანიების უმეტესობას ბოლოს ორივე სჭირდება — სხვადასხვა შეკითხვა სხვადასხვა დაგვიანებას ითმენს.

პარტია ჩანაწერების შემოსაზღვრულ ნაკრებს ამუშავებს განრიგით (ყოველ საათს, ყოველ ღამეს). სტრიმინგი მოვლენების შემოუსაზღვრავ ნაკადს ამუშავებს უწყვეტად, თითოეულის მოხდენიდან წამებში. მიკროპარტია შუაზე ჭრის განსხვავებას — პაწია პარტიები ყოველ რამდენიმე წამში.
BATCH — scheduled windows •••• •••• run 02:00 whole window collect all day… STREAMING — per event •••• act now handled within seconds

პარტია ელოდება და შემდეგ მთელ ფანჯარას ერთბაშად ამუშავებს. სტრიმინგი ყოველ მოვლენაზე მისვლისთანავე მოქმედებს.

აირჩიეთ შეკითხვის და არა ხმაურის მიხედვით

  • პარტია — დღიური შემოსავალი, თვიური churn, ML-ის სასწავლო ნაკრებები. უფრო მარტივი, უფრო იაფი, ადვილად ხელახლა დასამუშავებელი. შეყოვნება: წუთებიდან საათებამდე.
  • სტრიმინგი — თაღლითობის ბლოკირება, ცოცხალი დაშბორდები, "შემატყობინე ახლავე". მართვა უფრო რთულია. შეყოვნება: წამები.
  • მიკროპარტია — პრაგმატული შუალედი, რომელზეც "რეალურ დროში" მომუშავე სისტემების უმეტესობა სინამდვილეში დგას.
  • ნაგულისხმევად აირჩიეთ პარტია; სტრიმინგი მხოლოდ იქ დაამატეთ, სადაც ბიზნესი დამატებულ წამებში იხდის.

ყოველ გაშვებაზე მთელი სამყარო ხელახლა ნუ დამუშავდება

სრული ტვირთვა ყოველ ღამე
// re-read and rewrite the entire history, daily TRUNCATE warehouse.orders; INSERT INTO warehouse.orders SELECT * FROM source.orders; // 5 years of rows, every time // slow, expensive, hammers the source — and grows forever
ინკრემენტული watermark-ით
// only the rows that changed since last run MERGE INTO warehouse.orders AS t USING ( SELECT * FROM source.orders WHERE updated_at > :last_watermark // the delta ) s ON t.order_id = s.order_id WHEN MATCHED ... WHEN NOT MATCHED ... // upsert
05 · გამეორებას რომ გაუძლოს 6 წთ

პაიპლაინი აუცილებლად ჩავარდება შუა გზაზე.
მისი ხელახლა გაშვება უსაფრთხო უნდა იყოს.

ქსელი წყდება, ნოუდები კვდებიან, დეპლოი სამუშაოს 90%-ზე კლავს. საკითხი ისაა, არა გავიმეოროთ თუ არა — არამედ ის, გააფუჭებს თუ არა გამეორება თქვენს მონაცემებს. ამ თვისებას სახელი აქვს: იდემპოტენტურობა.

იდემპოტენტურობა — ერთი და იმავე ნაბიჯის ორჯერ გაშვება იმავე შედეგს იძლევა, რასაც ერთხელ გაშვება. იდემპოტენტური ტვირთვა შეიძლება გამეორდეს, თავიდან დაიგეგმოს ან ბექფილით გაიაროს ორმაგი დათვლის გარეშე. ეს პროდაქშენ-პაიპლაინის ყველაზე მნიშვნელოვანი თვისებაა.
ტვირთვა #1
შეკვეთა 42 · $30
შეკვეთა 42 · $30 · ორჯერ დათვლილი ✕
გამეორება
ტვირთვა #1
შეკვეთა 42 · $30
INSERT + გამეორება → დუბლები
MERGE id-ზე, გამეორება → იგივე
1 სტრიქონი ✓

გამეორებული INSERT 42-ე შეკვეთას ორჯერ თვლის. order_id-ზე გასაღებული MERGE ყოველთვის ერთსა და იმავე ერთ სტრიქონს დებს.

როგორ გავხადოთ ნაბიჯი იდემპოტენტური

  • მიაბით ჩაწერები გასაღებს. ბრმა INSERT-ის ნაცვლად upsert/MERGE ბიზნეს-გასაღებზე.
  • დაანაწილეთ დროით. "2026-06-27"-ის ხელახალმა გაშვებამ იმ დღის დანაყოფი უნდა შეცვალოს და არა შეავსოს.
  • ატარეთ გაშვების id. მონიშნეთ სტრიქონები, რომ ჩავარდნილი გაშვება გამეორებამდე სუფთად წაიშალოს.
  • დეტერმინისტული გარდაქმნები. გამოსავალში ჩაწნული now() ან შემთხვევითი id-ები არ უნდა იყოს.
დამატება — გამეორება ორმაგებს
async function load(batch: Row[]) {
  for (const row of batch)
    await db.insert("orders", row)  // blind append
}
// crash after row 800 of 1000 → retry re-inserts 1–800
upsert გასაღებით — გამეორება უქმია
async function load(batch: Row[]) {
  await db.upsert("orders", batch, {
    key: "order_id"            // same id ⇒ same row
  })
}
// retry from row 1 → rows 1–800 just overwrite themselves

ორი ოპერაცია, რომელსაც იდემპოტენტურობა ხსნის

გამეორება

დროებითი ჩავარდნისას ორკესტრატორი უბრალოდ ხელახლა უშვებს ამოცანას. რადგან ტვირთვა იდემპოტენტურია, ავტომატური გამეორება უსაფრთხოა — ღამის 3 საათზე ადამიანს არავინ იძახებს, რომ ჯერ "დუბლები დაასუფთაოს".

ბექფილი

ბექფილი პაიპლაინს წარსულ თარიღებზე უშვებს ხელახლა — ბაგის გასასწორებლად, ახალი სვეტის დასამატებლად ან ისტორიის ჩასატვირთად. იდემპოტენტური, დროით დანაწილებული ნაბიჯები საშუალებას გაძლევთ გასული მარტი თავიდან გაატაროთ ისე, რომ სხვა არაფერს შეეხოთ.

06 · ნამდვილი გაშვება 5 წთ

დაალაგეთ ნაბიჯები, შემდეგ
დაამტკიცეთ, რომ მონაცემი სწორია.

პაიპლაინი ბევრი ურთიერთდამოკიდებული ამოცანაა, რომელიც განრიგით ეშვება და რომელსაც გამეორება, მონიტორინგი და ნდობა სჭირდება. ამას ორი დისციპლინა აწესრიგებს: ორკესტრირება და მონაცემთა ხარისხი.

ორკესტრირება — ამოცანების დაგეგმვა და კოორდინირება დამოკიდებულებების DAG-ად (მიმართული აციკლური გრაფი), ისე რომ ყოველი ნაბიჯი მხოლოდ თავისი შემავალი მონაცემების მზადყოფნის შემდეგ გაეშვას, ჩავარდნისას გამეორდეს და მთელი გაშვება დაკვირვებადი იყოს. Airflow, Dagster და Prefect გავრცელებული ინსტრუმენტებია.

ყოველი ნოუდი ამოცანაა; წიბოები — დამოკიდებულებები. ხარისხის check ბლოკავს publish-ს — ცუდი მონაცემი მომხმარებლამდე არასოდეს აღწევს.

რას გაძლევთ ორკესტრატორი

  • დამოკიდებულებები — გარდაქმნა მხოლოდ მას შემდეგ ეშვება, რაც ორივე ამოღება წარმატებით დასრულდება.
  • დაგეგმვა & გამეორება — cron-ის მსგავსი ტრიგერები ავტომატური, შემოსაზღვრული გამეორებებით.
  • დაკვირვებადობა — გაშვებების ისტორია, ლოგები, ხანგრძლივობები და გაფრთხილებები, როცა ამოცანა ჩავარდება ან იგვიანებს.
  • ბექფილები — თარიღების დიაპაზონის ხელახალი გაშვება ერთი ბრძანებით (მე-5 ნაწილი).

მონაცემთა ხარისხი — დატესტეთ მონაცემი და არა მხოლოდ კოდი

კოდის ტესტები თქვენს გარდაქმნის ლოგიკას ამტკიცებს. ხარისხის შემოწმებები კი ამტკიცებს, რომ ყოველ გაშვებაზე მონაცემი საღია — და პაიპლაინს კარიბჭეს უყენებს, რომ ცუდი მონაცემი ხმამაღლა ჩავარდეს და არა ჩუმად გაჟონოს დაშბორდებში.

S
სქემა
ფორმა ისეთია, როგორსაც ველოდებით.
+

სვეტები არსებობს, ტიპები ემთხვევა, მოულოდნელი გადარქმევები არაა. თუ წყარომ ველი დაამატა ან წაშალა, გაშვება უნდა ჩავარდეს და არა ჩუმად შეავსოს რეპორტი null-ებით.

EXPECT columns(orders) = [order_id, amount, placed_at, region] EXPECT type(amount) = DECIMAL
F
სიახლე
მონაცემი საკმარისად ახალია.
+

უახლესი სტრიქონი SLA-ზე ახალგაზრდაა. მოძველებული მონაცემი ჩუმი ჩავარდნაა — დაშბორდი კვლავ იხატება, უბრალოდ ტყუის.

EXPECT max(placed_at) > now() - INTERVAL '2 hours'
V
მოცულობა
სტრიქონების რაოდენობა საღ დიაპაზონშია.
+

დღევანდელი პარტია ნორმის დასაშვებ ფარგლებშია. გაშვება, რომელიც 0 სტრიქონს ტვირთავს (ან 50×-ს), ჩვეულებრივ გაფუჭებულ წყაროს ნიშნავს და არა რეკორდულ გაყიდვების დღეს.

EXPECT row_count BETWEEN 0.5 × avg_7d AND 2 × avg_7d
U
უნიკალურობა და null
გასაღებები უნიკალურია; სავალდებულო ველები ადგილზეა.
+

პირველადი გასაღები მართლაც უნიკალურია (იჭერს მე-5 ნაწილის დუბლიკატების ბაგს) და not-null სვეტები არასოდეს არის null. ყველაზე იაფი შემოწმებები, ყველაზე მაღალი დაჭერის მაჩვენებლით.

EXPECT unique(order_id) EXPECT not_null(order_id, amount)
R
რეფერენციული
join-ები ჩუმად არ დაკარგავს სტრიქონებს.
+

შეკვეთებში ყოველი customer_id არსებობს customers ცხრილში. ობოლი გასაღებები ჩუმად ქრება inner join-ში — და შემოსავალიც მათთან ერთად ქრება.

EXPECT orders.customer_id IN customers.id // ობლების გარეშე

Lineage — იცოდეთ, საიდან მოვიდა ციფრი

Lineage არის რუკა იმისა, თუ როგორ გამოიყვანეს ყოველი ცხრილი და სვეტი თავისი წყაროებიდან. როცა დაშბორდი არასწორად გამოიყურება, lineage საშუალებას გაძლევთ ის ყოველი გარდაქმნის გავლით დამნაშავე წყარომდე მიადევნოთ — და დაინახოთ, კიდევ რა იმტვრევა, თუ სვეტს შეცვლით.

  • დებაგინგი — ცუდი მეტრიკის ფესვამდე მიდევნება წუთებში და არა დღეებში.
  • გავლენის ანალიზი — დაინახეთ ქვევით მდებარე ყველა რეპორტი, სანამ სვეტს სახელს გადაარქმევთ.
  • ნდობა & შესაბამისობა — დაამტკიცეთ, საიდან მოვიდა რეგულირებადი ციფრი.

ინსტრუმენტების ლანდშაფტი — ვინ რას აკეთებს

ამ ყველაფერს თითქმის არასოდეს აწყობთ ხელით. თანამედროვე სტეკი, როგორც წესი, სამი საქმეა, სპეციალიზებულ ინსტრუმენტებზე გადანაწილებული: კონექტორი ამოღებისა და ტვირთვისთვის, dbt გარდაქმნისთვის და ერთი ორკესტრატორი, რომ ეს ყველაფერი განრიგით გაეშვას. აი, სად დგანან წამყვანი ინსტრუმენტები და რაში არის თითოეული კარგი (და ცუდი).

წყაროები
აპები · API
მიღება · E+L
Airbyte / Fivetran
საწყობი
ნედლი
გარდაქმნა
dbt · SQL
მოდელირებული
დაშბორდები
ორკესტრირება
Airflow · Dagster · Prefect — განრიგი, გამეორება, ბექფილი, მონიტორინგი
ერთი დირიჟორი მართავს ყველა ეტაპს

ორკესტრატორი (ქვემოთ) დირიჟორობს; კონექტორები E+L-ს ართმევენ თავს, dbt საწყობის შიგნით T-ს იბარებს, ხარისხის შემოწმებები კი წყვეტენ, რა მოხვდება დაშბორდებამდე.

ორკესტრატორი

Apache Airflow

დადებითი — ინდუსტრიის ნაგულისხმევი არჩევანი: უზარმაზარი საზოგადოება, თითქმის ყველგან ეშვება, ინტეგრაცია ყველაფრისთვის.
უარყოფითი — მძიმე Python-ბოილერპლეიტი და ის ამოცანებს გეგმავს ისე, რომ თქვენს მონაცემებს სინამდვილეში ვერ იგებს.

ორკესტრატორი

Dagster

დადებითი — მონაცემთა აქტივებით (ცხრილები, რომლებსაც აწარმოებთ) აზროვნებს, ტიპიზებული შემავალი/გამომავალი მონაცემებით და შესანიშნავი ლოკალური ტესტირებით.
უარყოფითი — Airflow-ზე ახალგაზრდა და პატარაა და აზროვნების ახალი წესის სწავლას მოითხოვს.

ორკესტრატორი

Prefect

დადებითი — მსუბუქი და წმინდა Python; არსებული სკრიპტის მართულ ნაკადად ქცევა სწრაფია.
უარყოფითი — ნაკლები რამაა ყუთშივე ჩადებული; გარშემო სტეკის მეტ ნაწილს თავად აწყობთ.

მიღება · E+L

Airbyte

დადებითი — ასობით მზა კონექტორი (წინასწარ აგებული წამკითხველები წყაროებისთვის), ღია კოდით და თვითჰოსტირებადი.
უარყოფითი — თავად გაშვება შეიძლება მძიმე იყოს და კონექტორების ხარისხი წყაროდან წყაროზე იცვლება.

მიღება · E+L

Fivetran

დადებითი — სრულად მართული კონექტორები: ერთხელ მოაწყობთ და შემდეგ პრაქტიკულად აღარაფერს სჭირდება მოვლა.
უარყოფითი — ფასი გადატანილი მონაცემების მოცულობაზეა მიბმული, ამიტომ დიდ მოცულობაზე ანგარიში სწრაფად იზრდება.

გარდაქმნა

dbt

დადებითი — გარდაქმნები ვერსიების კონტროლში მყოფი SQL-ის სახით, ჩაშენებული ტესტებითა და დოკუმენტაციით, ასე რომ მათი ფლობა ანალიტიკოსებსაც შეუძლიათ.
უარყოფითი — მხოლოდ გარდაქმნა: თავად არც ამოიღებს, არც ჩატვირთავს და არც განრიგში ჩასვამს — ზემოთ ჩამოთვლილი ინსტრუმენტები სჭირდება.

როგორ ავირჩიო — გუნდების უმეტესობა ერთ ინსტრუმენტს არ ირჩევს; ისინი სამ შრეს აერთიანებენ. გამოიყენეთ კონექტორი E+L-სთვის (Fivetran, თუ გირჩევნიათ გადაიხადოთ და თავად არ მოუაროთ; Airbyte, თუ ღია კოდი და კონტროლი გინდათ), dbt გარდაქმნისთვის და ერთი ორკესტრატორი, რომ ეს ყველაფერი შეკრას: Airflow — უსაფრთხო, კარგად დაკომპლექტებული ნაგულისხმევი არჩევანი, Dagster — როცა მონაცემთა აქტივების გააზრება და ტესტირება ყველაზე მნიშვნელოვანია, Prefect — როცა ძირითადად Python-ის განრიგში ჩასმა გინდათ ზედმეტი ცერემონიის გარეშე. ნამდვილი წესი: ნუ გაუშვებთ იმაზე მეტ ინსტრუმენტს, ვიდრე თქვენს გუნდს რეალურად შეუძლია მართოს.
07 · ყველაფერი ერთად 2 წთ

მყიფე სკრიპტიდან
პაიპლაინამდე, რომელსაც ენდობით.

ერთი და იგივე საქმე — შეკვეთების საწყობში გადატანა — ჯერ ისე დაწერილი, როგორც ჩვეულებრივ იწყება, შემდეგ კი ისე, როგორც უნდა დასრულდეს.

ღამის 2 საათის პაიპლაინი
// runs from a laptop, no schedule, no checks
const rows = await prod.query("SELECT * FROM orders") // full table, on prod
rows.forEach(r => warehouse.insert(r))  // blind append
// crash midway ⇒ dups · rename ⇒ silent nulls
// no history · no alert · no idea if it's right
მშვიდი ძილის პაიპლაინი
extract("orders", { from: "replica", since: watermark })
  .transform(clean)                         // typed · tested
  .check([schema, freshness, unique])        // gate
  .load({ key: "order_id", mode: "merge" })  // idempotent
// orchestrated · incremental · re-runnable · alerts on fail
1პაიპლაინი პროდუქტია. განრიგზე მიბმული, დაკვირვებადი, ხელახლა გაშვებადი — და არა სკრიპტი, რომელსაც ვიღაც ხელით უშვებს.
2E, T, L — თანმიმდევრობაზე მერე იკამათეთ. ELT (ჩატვირთე ნედლი, გარდაქმენი საწყობში) თანამედროვე ნაგულისხმევია; ETL კი მაშინ, როცა კონფიდენციალურობა ან მოცულობა გარდაქმნას უფრო ადრე აიძულებს.
3ნაგულისხმევად აირჩიეთ პარტია & ინკრემენტულობა. წაიკითხეთ ცვლილებები watermark-ით; სტრიმინგი დაამატეთ მხოლოდ იქ, სადაც წამები ამ ღირებულებას იმსახურებს.
4გახადეთ ყოველი ნაბიჯი იდემპოტენტური. გასაღებზე მიბმული upsert-ები და დროითი დანაყოფები ხელახალ მცდელობებსა და ბექფილებს უმნიშვნელო ამბებად აქცევს.
5დააყენეთ კარიბჭე მონაცემთა ხარისხზე. ტესტით შეამოწმეთ მონაცემები და არა მხოლოდ კოდი, და აწარმოეთ lineage, რომ არასწორი ციფრის კვალის მიდევნება შესაძლებელი იყოს.

გააგრძელეთ

  • dbt — სტანდარტი ELT გარდაქმნებისთვის, ვერსიების კონტროლში მყოფი SQL-ის სახით
  • Apache Airflow / Dagster — ორკესტრირება & განრიგი
  • The Data Engineering Cookbook & Fundamentals of Data Engineering (Reis & Housley)
  • Great Expectations — მონაცემთა ხარისხის შემოწმებები კოდის სახით

ერთი წინადადება დასამახსოვრებლად

"გადაიტანეთ მონაცემები ერთხელ, განზრახ და ისე, რომ ხელახლა უსაფრთხოდ გაუშვათ."

— მთელი მოხსენება, შეკუმშული

ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი შეკითხვა ETL vs ELT-ზე, პარტია vs სტრიმინგზე, იდემპოტენტურობასა და მონაცემთა ხარისხზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში