๐ฅ
Apache Flink ๋ณธ๋ฌธ
- Apache Flink
- streaming dataflow ์์ง์ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ๋ฆฌ๋ฐ&๋ฐฐ์น ํ๋ซํผ
- streaming mode: native ๋ฐฉ์์ด ์๋๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋ํด spark ๋ณด๋ค low latency๋ฅผ ๋ณด์ธ๋ค
* spark๋ micro-batch ๋ฐฉ์์ ํตํด ์คํธ๋ฆผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ - exactly-once ๋ณด์ฅ
- low-level building block
stateful and timely stream processing์ ์ ๊ณต
process function์ ํตํด datastream API์ ์๋ฒ ๋๋ ๋์ด ์์ ← ์ด์ชฝ์ ๋ง์ ์ ์ ์๊ฒ๋ ํ์๊ฐ ์์ ๊ฒ์ด๊ณ , core API๋ฅผ ๋ง์ด ์ธ ๋ฏํ๋ค. - core API
datastream API (bounded/unbounded stream) / dataset API (bounded data set)
datastream์ ์คํธ๋ฆผ ๋ฐ์ดํฐ์ผ ๋ ์ฌ์ฉํ๊ณ dataset์ ๋ฐฐ์น์์ ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ๋ค.
๋ ๋ค immutable ํ ์์ฑ (๋ณ๊ฒฝ๋์ง ์์)
transformation, join, aggregation, window, state์ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ก์ธ์ฑ์ ์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค. - table API
stream์ ํํํ๋ ํ ์ด๋ธ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ ํ์ฅ๋ ๊ด๊ณํ ๋ชจ๋ธ.
ํ ์ด๋ธ์๋ ์คํค๋ง๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ API๋ select, project, join, group by, aggregate ๋ฑ์ ์ฐ์ฐ์ ์ ๊ณต - SQL
๊ฐ์ฅ ๋์ ๋จ๊ณ์ ์ถ์ํ์ด๋ฉฐ, Table API์ ์ ์ฌํ์ง๋ง sql ์ฟผ๋ฆฌ๋ก ํํํ๋ค.
table API์ ์ ์๋ ํ ์ด๋ธ์์ ์ด sql ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ์ ์๋ค.
Stream dataflow
input stream → source
operator → transformation
output stream → sink ๋ก ํํ
(์นดํ์นด, ํค๋ค์์ค ๋ฑ ๋ฉ์์ง ํ๋ ๋ถ์ฐ๋ก๊ทธ์์ real-time data๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์. ๊ทธ ๊ฒฝ์ฐ flink๊ฐ consumer)
→ source๋ก ์คํธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ๋ฌ transformation์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ sink๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ(์ ์ฅ)ํ๋ streaming dataflow
* lazy evaluation
spark์ ๋ง์ฐฌ๊ฐ์ง๋ก sink ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ ์ค์ ์ฐ์ฐ์ด ์ํ๋์ง ์๊ณ sink๊ฐ ์คํ๋๋ ์๊ฐ ์ง์ ๋ transformation๋ค์ด ์คํ๋จ
Parallel dataflows
ํ๋ ์ด์์ stream partition → stream
ํ๋ ์ด์์ operator subtasks → operation
operator substasks๋ ๋ ๋ฆฝ์ ์ด๋ฉฐ, ๋ค๋ฅธ ์ฐ๋ ๋์์ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋ณ๋ ฌ์ ์ผ๋ก ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ parallelism์ ์ค์ ํ ์ ์์ → ๋ณ๋ ฌ๋ก ์คํ๋๋ tasks๋ค์ ๊ฐ๊ฐ์ ์ฐ๋ ๋์์ ์คํ๋์ด ์ฒ๋ฆฌ๋๋ค.
1:1 stream: source์ map()์ฐ์ฐ์ ์ฌ์ด์ฒ๋ผ element์ ํํฐ์ ๊ณผ ์์ ์ ์ง
→ map()[1]์ source[1]์ ์ํด ์์ฑ๋ ๊ฒ๊ณผ ๋์ผํ ์์ ๋์ผํ ์์๋ก ๋ณด๊ฒ ๋จ
redistributing stream: ๋๋ฒ์งธ ํํฐ์ ์ฒ๋ผ ์ ๋จ๊ณ์ ๋ชจ๋ subtasks๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ transformation. ex) keyBy(), broadcast(), rebalance() ์ฒ๋ผ ๋ค์ ๋ถํ
Stateful stream processing
flink์ operation์ stateful ํ ์ ์๋ค (ํน์ operation์ด statefulํ ์ ์์) → ์ํ ์ ์ฅ์ด ๊ฐ๋ฅ → ํ ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋ ๋ ์ด์ ์ ๋ฐ์ํ ๋ชจ๋ ์ด๋ฒคํธ์ ๋์ ํจ๊ณผ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
stateful operator์ parallel instances๋ sharded key-vallue๋ก ์ ์ฅ๋์ด ์์
์ ๊ทธ๋ฆผ์์ ์ธ ๋ฒ์งธ operation์ด statefulํ๋ค๊ณ ํ๋ค๋ฉด, key-value ํํ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ ๋จ๊ณ์ subtasks๋ค๊ณผ fully network shuffle์ด ๋ฐ์ํ๋ค.
Timely stream processing
์คํธ๋ฆผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ ์์๋ณด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์ ์ง์คํด์ผ ํจ
ex) ํน์ ์ด๋ฒคํธ ํจํด์ ๊ฒ์ํ ๋ (์ง๊ธ๊น์ง ๋ฐ์ํ ์ด๋ฒคํธ ์ํ์ค์ ์ ์ฅ์ด ํ์) ๋ฑ
→ flink์์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์คํ ์ ํด๋ฝ์ด ์๋๋ผ, ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ธฐ๋ก๋ ์ด๋ฒคํธ timestamp๋ฅผ ์ด์ฉ
Distributed execution
flink์๋ ๋ ๊ฐ์ง ํ๋ก์ธ์ค๊ฐ ์์
- master process (job manager)
task์ ์ค์ผ์ฅด๋ง, ์ฒดํฌํฌ์ธํธ, ๋ฆฌ์ปค๋ฒ๋ฆฌ ๋ด๋น
worker๋ค์ ๊ด๋ฆฌ - worker process (task manager)
task๋ฅผ ์ค์ ๋ก ์คํ
standalone, resource framework(yarn, mesos etc) ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅ
TaskManager
JVM ํ๋ก์ธ์ค ๋จ์๋ก ๋์
ํ worker์๋ ์ฌ๋ฌ๊ฐ์ Task Slot์ด ์์ผ๋ฉฐ, Task Slot์๋ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ์์ผ๋ฉฐ, ๊ฐ ์ฐ๋ ๋๋ก subtasks๊ฐ ์ํ๋๋ค.
Time slot๋ผ๋ฆฌ๋ worker ๋ด์ ๋ฆฌ์์ค๋ฅผ ๋๋์ด์ ๊ด๋ฆฌ → slot๋ณ๋ก ๊ฐ๋ณ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ task๋ฅผ ์คํ
→ slot์ ๊ฐ์๋ cpu core ๊ฐ์๋ก ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค.
ํ ์ฐ๋ ๋์ ํ Task๊ฐ ์คํ๋์ง๋ง source/map์ฒ๋ผ operator chain์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ ์ฐ๋ ๋์์ ์คํ
Window
์คํธ๋ฆผ ๋ฐ์ดํฐ๋ ์์๊ณผ ๋์ด ์กด์ฌํ์ง ์๋ unbounded data → ์ง๊ณ์ ๊ฐ์ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด ์์๊ณผ ๋์ ์ ํด์ฃผ์ด์ผ ํจ
window: ์์๊ณผ ๋์ ์ผ์ ํ ๋ฃฐ์ ๋ฐ๋ผ์ ์ ํด์ง ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ
๋นจ๊ฐ ๋ค๋ชจ ํ ์นธ์ด ํ window
Tumbling Window
๊ณ ์ ๋ ์๊ฐ ๋จ์๋ก ๋ฐ์ดํฐ์ ์ค๋ณต ์ฒ๋ฆฌ ์์ด window๋ฅผ ์ค์ ํ๋ ๋ฐฉ์
window size๋ฅผ 5์ด๋ก ์ค์ ํ๋ค๋ฉด 5์ด ๊ฐ๊ฒฉ์ผ๋ก window๊ฐ ๋ถ๋ฆฌ๋จ
Sliding Window
N์๊ฐ ํฌ๊ธฐ์ window๋ฅผ M์๊ฐ ์ฉ slide ํด์ window๋ฅผ ์ ํ๋ ๋ฐฉ์.
๋ฐ์ดํฐ์ ์ค๋ณต ์ฒ๋ฆฌ ํ์ฉ
M์๊ฐ ๋จ์์ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต์ฒ๋ฆฌ๋๊ณ ์๋ค.
Session Window
session gap์ ์ค์
์ผ์ ๊ธฐ๊ฐ๋์ ๋ฐ์์ด ์๋ ๊ฒฝ์ฐ ์ธ์ ์์๋ถํฐ ๋ฐ์์ด ์๋ ์๊ฐ๊ฐ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ window size๋ก ์ฒ๋ฆฌ
→ ๋ฐ์์ด ์๋ ์๊ฐ >= session gap์ด ๋๋ฉด ๋ค๋ฅธ window๋ก ๋ถํ
session gap์ 5์ด๋ก ์ค์ : 5์ด๋์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค์ง ์์ผ๋ฉด ์๋ก ๋ค๋ฅธ window๋ก ์ชผ๊ฐฌ
ํ๋์ window์์ ์ฒ๋ฆฌ๋๋ element์ ๊ฐ์๊ฐ ๋งค์ฐ๋งค์ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
Fault Tolerance
sparks๋ lineage๋ฅผ ์ด์ฉํด ์ ์ฒด ๊ณผ์ ์ ๋ค์ ๊ณ์ฐํจ์ผ๋ก์จ ๋ด๊ณ ์ฅ์ฑ ๋ณด์ฅ
flink๋ checkpoint๋ฅผ ์ค์ ํ๊ณ checkpoint ์ดํ๋ก datasource์์ replayํ๋ ๋ฐฉ์์ผ๋ก ๋ด๊ณ ์ฅ์ฑ ๋ณด์ฅ
์ฒ๋ฆฌ๋๋ stream ์ค๊ฐ์ checkpoint barrier๋ฅผ ๋ผ์๋ฃ์ (job manager๊ฐ ์์ฒญ)
sink์ barrier๊ฐ ๋์ฐฉํ๋ฉด barrier ์ด์ ์ ๋ฐ์ดํฐ์ ๋ํด ์ฐ์ฐ์ด ์๋ฃ๋ ๊ฒ์๋ก ๊ฐ์ฃผ, source๋ก ํด๋น barrier์ ๋ํด ack๋ฅผ ๋ณด๋ ( source๋ ack ๋ฐ์ barrier ์ด์ ์ ๋ฐ์ดํฐ์ ๋ํด์ ์ญ์ )
๋ง์ฝ ์คํธ๋ฆผ์ด ์ฒ๋ฆฌ๋๋ ์ค๊ฐ์ fault๊ฐ ๋ฐ์ํ๋ฉด ack๋ฅผ ๋ฐ์ barrier ์ดํ์ ๋ฐ์ดํฐ๋ถํฐ ๋ค์ ์ฒ๋ฆฌ
→ ๋ชจ๋ ๋ ์ฝ๋๋ง๋ค replayํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์ฑ๋ฅ
→ exactly-once ๋ณด์ฅ
'๋ฐ์ดํฐ > ํ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
parquet ํ์ผ ์ ๋ณด ๋ณด๊ธฐ (0) | 2022.10.05 |
---|---|
[CM] Yarn Node Manager ์ถ๊ฐ ์ ava.lang.IllegalArgumentException: java.net.UnknownHostException: HOSTNAME (0) | 2022.05.13 |
Python์ ํตํด impala ์ ์ (0) | 2022.03.03 |
Apache Kafka (0) | 2022.02.11 |
ํ๋ก ์์ฝ์์คํ (0) | 2022.02.11 |