Bosh sahifa Wiki Spark

Spark

Spark — katta hajmdagi ma’lumotlarni clusterda parallel qayta ishlashga mo‘ljallangan distributed computing engine. U batch processing, SQL, stream processing, machine learning va graph hisoblash kabi workloadlarni bitta umumiy execution modelida bajarishi mumkin.

Spark storage tizimi emas. U HDFS, object storage, database, message broker va boshqa manbalardan ma’lumot o‘qib qayta ishlaydi.

Driver

Spark applicationning boshqaruv processi driver.

Driver:

  • application code’ni bajaradi;
  • logical plan yaratadi;
  • tasklarni rejalashtiradi;
  • executorlarni boshqaradi;
  • natija va metadata’ni yig‘adi.

Driver ishlamay qolsa application odatda to‘xtaydi, agar maxsus recovery modeli bo‘lmasa.

Executor

Executor worker node’da tasklarni bajaradi.

U:

  • partitionlarni qayta ishlaydi;
  • memory va disk cache saqlaydi;
  • shuffle data yaratadi;
  • driverga status yuboradi.

Executor soni, core va memory parallelismga ta’sir qiladi.

Cluster manager

Spark resource’larni cluster manager orqali oladi.

Cluster manager:

ni boshqaradi.

Spark task schedulingni o‘zi bajaradi, ammo fizik resource ajratishni tashqi scheduler amalga oshirishi mumkin.

RDD

Resilient Distributed Dataset — partitionlangan immutable collection abstraction.

RDD operationlari:

RDD lineage asosida yo‘qolgan partitionni qayta hisoblash mumkin.

Zamonaviy structured API ko‘p holatda DataFrame’dan foydalanadi.

DataFrame

DataFrame schema’ga ega distributed table.

U SQLga o‘xshash operationlar bilan ishlaydi.

Optimizer:

bajarishi mumkin.

DataFrame typed bo‘lmagan yoki tilga qarab qisman typed API beradi.

Dataset

Ayrim til APIlarida Dataset compile-time type bilan structured distributed collection sifatida ishlaydi.

DataFrame amalda row tipidagi Datasetga yaqin bo‘lishi mumkin.

Aniq API til va Spark versiyasiga bog‘liq.

Transformation

Transformation yangi logical dataset yaratadi, ammo darhol execution qilmasligi mumkin.

Misollar:

  • select;
  • filter;
  • join;
  • groupBy;
  • map.

Spark lazy evaluation orqali bir nechta transformationni umumiy plan sifatida optimallashtiradi.

Action

Action haqiqiy executionni boshlaydi.

Misollar:

  • count;
  • collect;
  • save;
  • show;
  • reduce.

collect barcha natijani driver memory’siga olib keladi.

Katta datasetda driver out-of-memory bo‘lishi mumkin.

DAG

Transformations dependency graph hosil qiladi.

Spark bu graphni stage va tasklarga ajratadi.

Narrow dependency bir parent partitiondan ma’lumot oladi.

Wide dependency shuffle talab qiladi.

Partition

Dataset bir nechta partitionga bo‘linadi.

Har task odatda bitta partition ustida ishlaydi.

Partition juda kam bo‘lsa cluster parallelizmi ishlatilmaydi.

Juda ko‘p mayda partition scheduling va file overheadini oshiradi.

Shuffle

Data key bo‘yicha workerlar orasida qayta taqsimlanadi.

Shuffle operationlari:

  • group by;
  • join;
  • distinct;
  • repartition;
  • sort.

Shuffle network, disk va serialization xarajatiga ega.

Data skew bitta taskni juda sekinlashtirishi mumkin.

Cache

Qayta ishlatiladigan dataset memory yoki diskda cache qilinadi.

Cache faqat bir marta ishlatiladigan data uchun foydasiz bo‘lishi mumkin.

Cache qilingan dataset unpersist qilinmasa executor memory’sini egallab turadi.

Lineage

RDD va dataset qaysi source va transformationlardan yaratilganini lineage graph saqlaydi.

Partition yo‘qolsa shu graph orqali qayta hisoblanadi.

Juda uzun lineage checkpoint talab qilishi mumkin.

Checkpoint

Dataset yoki stream state barqaror storage’ga yoziladi.

Bu lineage’ni qisqartiradi va failure recoveryni yengillashtiradi.

Checkpoint directory ishonchli distributed storage’da bo‘lishi kerak.

Spark SQL

SQL querylar DataFrame bilan bir execution engine’da ishlaydi.

Catalog table, view va file metadata’ni saqlaydi.

Query optimizer logical planni physical planga aylantiradi.

Statistics join va scan tanloviga ta’sir qiladi.

Broadcast join

Kichik table barcha executor’ga yuboriladi.

Katta table partitionlari local kichik nusxa bilan join qiladi.

Bu shuffle’ni kamaytiradi.

Kichik deb baholangan table aslida katta bo‘lsa executor memory muammosi yuz beradi.

Stream processing

Structured Streaming cheksiz table modeliga yaqin API beradi.

Source’dan yangi data kelganda incremental query bajariladi.

Window, watermark, state va checkpoint ishlatilishi mumkin.

Exactly-oncega yaqin sink kafolati source va sink capability’siga bog‘liq.

Serialization

Task closure va data workerlar orasida serialize qilinadi.

Katta closure, connection yoki keraksiz objectlarni yuborish sekinlik yaratadi.

Database connection executor ichida partition darajasida boshqariladi.

Data skew

Join yoki group keylarning katta qismi bitta qiymatga tegishli bo‘lsa bir task boshqalardan ancha katta partition oladi.

Bu stage’ning barcha tez tasklar tugaganidan keyin bitta sekin taskni kutishiga olib keladi.

Skew:

  • key salting;
  • adaptive execution;
  • pre-aggregation;
  • hot keyni alohida qayta ishlash

orqali kamaytiriladi.

Adaptive query execution

Runtime statistikasi asosida Spark partitionlarni birlashtirishi, skew joinni ajratishi yoki join strategiyasini o‘zgartirishi mumkin.

Bu optimizerning oldindan noto‘g‘ri row estimate qilgan holatini tuzatadi.

Feature yoqilgan bo‘lsa ham input statistics va limitlar muhim.

UDF

User-defined function built-in expression yetarli bo‘lmaganda ishlatiladi.

UDF optimizerga ichki mantiqni yashirishi, serialization va til chegarasi xarajatini qo‘shishi mumkin.

Imkon bo‘lsa built-in column function ishlatiladi.

Output file

Parallel tasklar ko‘p mayda fayl yaratishi mumkin.

Yozishdan oldin partition soni maqsadli file hajmiga moslashtiriladi. Bitta filega majburan yig‘ish esa faqat bitta task bottleneckini yaratishi mumkin.

Bog‘liq tushunchalar

Distributed computing, Driver, Executor, RDD, DataFrame, Partition, Shuffle, Lazy evaluation, Spark SQL, Structured Streaming