Top Banner
Wielki Brat patrzy Czyli jak zbieramy dane o użytkownikach Allegro
50

[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Jan 08, 2017

Download

Software

allegro.tech
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Wielki Brat patrzyCzyli jak zbieramy dane o użytkownikach Allegro

Page 2: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

O nas

Marcin Kuthan

mkuthan.github.io

Maciej Arciuch

zbyt leniwy, żeby mieć konto na githubie

Page 3: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Opowiemy o

● czym jest clickstream (co?)

● potrzebach biznesowych i

technicznych (dlaczego?)

● ogólnej architekturze

systemu, technicznych

aspektach (jak?)

Page 4: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 5: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Jak być powinno

● Dane dostępne od razu - małe opóźnienia

● Dobrze opisane, łatwo dostępne dla innych

● Efektywny format danych

● Stabilnie

● Skalowalnie

Page 6: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

A jak czasem wychodzi...

Page 7: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 8: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Spróbujmy jeszcze raz

Page 9: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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ść

Page 10: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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)

Page 11: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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.

Page 12: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 13: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 14: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Pageviews

MobileEvents

Errors

Source

Clickstream Ingestion System

Buffer Kafka

...

Clients Kafka

Page 15: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Pageviews

MobileEvents

Errors

Clickstream Ingestion System (cont)

...

Clients Kafka camus

camus2hive.sh

Page 16: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Why Spark Streaming?

Page 17: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Why Apache Kafka?

Page 18: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Requirements

● Scalability

● At least once delivery

● Fault tolerance

● Back pressure

Page 19: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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)

Page 20: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 21: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Exactly once - end2end

Apache Kafka

Streaming Engine

Apache Kafka

Page 22: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Fault tolerance

● yarn-cluster

● spark.yarn.maxAppAttempts

● spark.yarn.max.executor.failures

● spark.task.maxFailures

● spark.streaming.kafka.maxRetries

Page 23: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Fault tolerance

● min.insync.replicas = 2

● acks = all

● topics rep factor >= 3

● kafka clusters >= 4 nodes

● retries > 0

● retry.backoff.ms > 0

Page 24: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Fault tolerance

Page 25: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Back pressure

input rate == processing rate

Source Sink

Page 26: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Back pressure

Source Sink

input rate > processing rate

Page 27: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Back pressure

Source Sink

steady state again

Page 28: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Back pressure

Source Sink

initial state

spark.streaming.kafka.maxRatePerPartition*

* effectively requires single topic

Page 29: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Back pressure

● Pull from source

● Process

● Push to sink (sync)buffer.memory=not too muchblock.on.buffer.full=true

Page 30: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Spark Streaming & Apache Kafka integration

● Receiver based approach / high

level Kafka consumer

● Direct streams approach / low level

Kafka consumer

Page 31: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Receiver based approach

Spark Executor

Receiver

1

HDFS (WAL)

Spark Driver

StreamingContext

Offset Store

Source

pull data

Page 32: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Receiver based approach

Spark Executor

Receiver

1

HDFS (WAL)

2

Spark Driver

StreamingContext

Offset Store

Source

store Write Ahead Log

Page 33: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Receiver based approach

Spark Executor

Receiver

1

HDFS (WAL)

2

Spark Driver

StreamingContext

3

4

Offset Store

Source

send blocks’ ids and commit offset

Page 34: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Receiver based approach

Spark Executor6

HDFS (WAL)

Spark Driver

StreamingContext

5

Offset Store

Sink

process data and publish results

Page 35: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Driver checkpointing

Spark Driver

StreamingContext

Blocks’ ids

HDFS (checkpoint)

Page 36: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Driver checkpointing

HDFS (checkpoint)Failed

Spark Driver

RestartedSpark Driver

StreamingContext

Blocks’ ids

Page 37: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Driver checkpointing

StreamingContext.getOrCreate( checkpointDir, functionToCreateContext)

Page 38: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Problems

1. Receiver occupies 1 core / executor2. Data duplication3. Additional latency4. HDFS load5. Complex back pressure6. Controversial checkpointing

Page 39: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Other gotchas

● High Level Consumer rebalancing

● Spark partition != Kafka partition

val kafkaDStreams = (1 to readParallelism).map { KafkaUtils.createStream(...)}val unionDStream = ssc.union(kafkaDStreams)

Page 40: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Receivers - summary

Page 41: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream approach

1

2

Offset Store

Spark Driver

StreamingContext

Spark ExecutorSource

fetch offset & distribute work

Sink

Page 42: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream approach

1

2 3

Offset Store

Spark Driver

StreamingContext

Spark ExecutorSource

fetch, process & publish data

Sink

4

Page 43: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream approach

1

2 3

5

6

Offset Store

Spark Driver

StreamingContext

Spark ExecutorSource

wait for completion & commit offset

Sink

4

5’

Page 44: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

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

Page 45: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream - bad parts

● Built-in at least onceauto.offset.reset=smallest

● Offset Store based at least onceDIY

Page 46: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream - bad parts

● Lack of kafka connections pool● Less mature/mainstream than

receiver based approach

Page 47: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Direct stream - summary

Page 48: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Key takeaways

● Avro schemas and a central schema repo - a way to reduce confusion

● Spark Streaming & Apache Kafka - almost perfect couple

● Use Direct Streams

Page 49: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Q/A?

Page 50: [WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro

Thank you!

http://github.com/allegro

http://allegro.tech