3. Opowiemy o
● czym jest clickstream (co?)
● potrzebach biznesowych i
technicznych (dlaczego?)
● ogólnej architekturze
systemu, technicznych
aspektach (jak?)
4. Clickstream w Allegro
● Czym jest clickstream?
● Zbierane z frontu, web i mobile
● Ponad 400 mln zdarzeń dziennie
● Podstawa do wielu decyzji biznesowych
● Kilka zespołów Big Data
5. Jak być powinno
● Dane dostępne od razu - małe opóźnienia
● Dobrze opisane, łatwo dostępne dla innych
● Efektywny format danych
● Stabilnie
● Skalowalnie
7. Spróbujmy jeszcze raz
● Potrzeba nr 1: szybciej!
● Kolejka + przetw. strumieniowe: po 2s
● Stabilnie i skalowalnie
● Nowe zastosowania:
○ dział wykrywania “wałków”
○ rekomendacje, wyszukiwarka
9. Spróbujmy jeszcze raz
Potrzeba nr 2: miejsce. Rozwiązanie: format Avro
● dojrzałe rozwiązanie
● zajmuje (całkiem) mało miejsca
● schematy: struktura + dokumentacja
● do przetw. wsadowego i strumieniowego
● kompatybilność
10. Spróbujmy jeszcze raz
● Dane nieskompresowane: Avro zajmuje 45% JSON-a
● Avro - format binarny: niektóre alg. kompresji się nie
nadają (vide Snappy, 9 razy mniejszy stopień
kompresji Avro niż JSON-a)
● Realny wybór: GZip vs LZ4
○ wybraliśmy LZ4 - mniejsze zużycie CPU kosztem
20% gorszej kompresji
● Możliwość zmiany “w locie” (Kafka)
11. Spróbujmy jeszcze raz
Problem nr 3: bałagan. Rozwiązanie: centralne
repozytorium schematów.
● single source of truth
● każdy element czyta z repo najnowszy schemat
● kontrola kompatybilności przy commicie
● wiemy z czym porównać
● propagacja do metastore’a, plików, itd.
12. Repozytorium schematów
● “schema review” - praca nad
schematem przez pull-requesty
● merge, wdrożenie na DEV
● promocja na TEST i PROD
● nie ważne co wdrożymy pierwsze:
kod czy schemat
13. Repozytorium schematów
● Dwie konkurencyjne implementacje
○ https://github.com/schema-repo/schema-repo
○ https://github.com/confluentinc/schema-registry
● Korzystamy ze schema-repo
○ była pierwsza, wyszła z AVRO-1124
○ trzyma schematy w ZK, a nie Kafce
19. At least once - end2end
“Offset Store”“Streaming Engine”
fetch_data(topic, partitions, offset_begins, offset_ends)
process_data
commit_offsets(topic, partitions, offsets)
publish_results(topic, results)
Kafka Out Kafka In
get_offsets(topic)
20. Exactly once
“Checkpoint Store”“Streaming Engine”
fetch_data(topic, partitions, offset_begins, offset_ends)
process_data
store_checkpoint(metadata, results)
publish_results(results)
Kafka Out Kafka In
load_checkpoint()
transactional
non-transactional
exactly once
42. Direct stream approach
1
2 3
Offset Store
Spark Driver
Streaming
Context
Spark Executor
Source
fetch, process & publish data
Sink
4
43. Direct stream approach
1
2 3
5
6
Offset Store
Spark Driver
Streaming
Context
Spark Executor
Source
wait for completion & commit offset
Sink
4
5’
44. Direct stream - good parts
● Low level Kafka consumer
● Straightforward fault tolerance for
at least once
● Built-in natural back pressure
● No WAL
● Kafka partition == Spark partition
45. Direct stream - bad parts
● Built-in at least once
auto.offset.reset=smallest
● Offset Store based at least once
DIY
46. Direct stream - bad parts
● Lack of kafka connections pool
● Less mature/mainstream than
receiver based approach
48. Key takeaways
● Avro schemas and a central schema repo
- a way to reduce confusion
● Spark Streaming & Apache Kafka - almost
perfect couple
● Use Direct Streams