#Kafka #Streaming #DataEngineer
- ์นด์นด์ค ๋ฐ์ดํฐ ์์ง๋์ด(์ : SKํ๋๋)
- ์ ์
- ์ํ์น ์นดํ์นด ์ ํ๋ฆฌ์ผ์ด์
ํ๋ก๊ทธ๋๋ฐ with ์๋ฐ
- ์์ค24: https://bit.ly/3uFmhpF
- ๊ต๋ณด๋ฌธ๊ณ : https://bit.ly/39Pk0Ak
- ์๋ผ๋: https://bit.ly/3a3Xa7T
- ์ค์๊ฐ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ํคํ
์ฒ
- ์์ค24: https://bit.ly/3JjY96j
- ๊ต๋ณด๋ฌธ๊ณ : http://bit.ly/3WEcgGJ
- ์๋ผ๋: https://bit.ly/3Hcbwmz
- ์ํ์น ์นดํ์นด ์ ํ๋ฆฌ์ผ์ด์
ํ๋ก๊ทธ๋๋ฐ with ์๋ฐ
Courses
Reviews
tommy0419
ยท
[Apache Kafka Application Programming] From concepts to consumers, producers, connects, and streams![Apache Kafka Application Programming] From concepts to consumers, producers, connects, and streams!llilill
ยท
[Apache Kafka Application Programming] From concepts to consumers, producers, connects, and streams![Apache Kafka Application Programming] From concepts to consumers, producers, connects, and streams!- [DevOneYoung] Apache Kafka for beginners
- [DevOneYoung] Apache Kafka for beginners
Posts
Q&A
์ถฉ๋ถํ ํฐ ํํฐ์ ์์ฑ์ ๊ถ๊ธ์ฆ์ด ์กด์ฌํฉ๋๋ค.
์๋ ํ์ธ์. ๋ฌธ์์ฌํญ์ ๋ต๋ณ๋๋ฆฝ๋๋ค. 1.์ถฉ๋ถํ ํฐ ํํฐ์ ์ฐ์ ์ฌ๊ธฐ์ ๋งํ๋ ์ถฉ๋ถํ ํฐ ํํฐ์ ์ด๋, ์ฐ๋ฆฌ๊ฐ ํ์ฉํ๊ณ ์๋ ํด๋น ํ ํฝ์ ํ๋ก๋์, ์ปจ์๋จธ์ ์ฒ๋ฆฌ๋์ ์ธก์ ํ์ฌ ์ฐ์ ํ์๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋น ํ ํฝ์ผ๋ก ๋ณด๋ด๋ ํ๋ก๋์์ ์ต๋ ์ ์ก์์ด 100๊ฐ/์ด ์ด๊ณ ์ปจ์๋จธ์ ์ฒ๋ฆฌ๋์ด 100๊ฐ/์ด ๋ผ๋ฉด ํํฐ์ ๊ฐ์๋ฅผ 2๊ฐ๋ก ๋ ์ ์์ฃ . ์ด๋ฐ ๊ฒฝ์ฐ, ์ปจ์๋จธ๋ฅผ 2๊ฐ๋ก ํ ๋นํ์ฌ ํ๋ก๋์๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณด๋ด๋์์ด ์ต๋ 2๋ฐฐ๊น์ง ๋์ด๋๋๋ผ๋ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตฌํํ๊ณ ์ ํ๋ ์๋น์ค์ ๋ฐฉํฅ์ฑ๊ณผ ๋ฏธ๋์ ๋์ด๋ ๋ฐ์ดํฐ์/์ฑ๋ฅ ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์๋ ๊ฒ์ด ์ข์ต๋๋ค. 2.Spring Application Consumer ๊ตฌํ์ ์ด๋ค ๊ตฌ์กฐ๋ก ๊ตฌ๋ ํ๋ฉด ์ข์์ง?์ด๊ฒ์ ์ด๋ป๊ฒ ์ด์ฉํ๋์ง์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. Spring application์์ consumer๋ concurrency๋ฅผ ์กฐ์ ํ์ฌ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ์ปจ์๋จธ ์ค๋ ๋๋ก ์ด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํํฐ์ ๊ฐ์ 4๊ฐ์ผ ๊ฒฝ์ฐ, concurrency=2์ธ ์ปจ์๋จธ 2๊ฐ๋ก ์ด์ํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ , ๋๋ concurrency=1์ธ ์ปจ์๋จธ๋ฅผ 4๊ฐ ์ด์ํ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ต๋๋ค. ํน์ concurrency=1์ธ ์ปจ์๋จธ๋ฅผ 2๊ฐ๋ง ์ด์ํ๋ ๊ฒฝ์ฐ๋ ํ๋ฆฐ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌํ์๋ ํ๊ฒฝ๊ณผ spring application์ด ํ๋ ์ญํ ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
- 0
- 2
- 26
Q&A
KTable ํค๊ฐ ์๋ ๋ ์ฝ๋ ์ฒ๋ฆฌ
์๋ ํ์ธ์.KTable์์ ๋ฉ์์ง ํค(message key)๊ฐ ์๋ ๋ ์ฝ๋๋ ๋ฌด์ํ๊ณ ๊ตฌ์ฒดํ๋ ๋ทฐ(Materialized View)๋ก ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค.
- 0
- 2
- 34
Q&A
์ปจ์๋จธ ํ ์คํธ ์ฝ๋ ์์ฑ
์๋ ํ์ธ์.์นดํ์นด ์ปจ์๋จธ์ poll() ๋ฉ์๋ ํธ์ถ์ ์ํด while(true)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์ฉํ๊ฒฝ์์๋ ํํ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ๊ณ ๋ก wakeup()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด poll()๋ฉ์๋์์ wakeupException์ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๋ณดํต while(true) ์๋ค๋ก try-catch๋ฌธ์ ์์ฑํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ฑฐ๋ ๋ง๋ฌด๋ฆฌ๋ฅผ ํฉ๋๋ค. ์๋๋ ๊ด๋ จ ์ฝ๋์ด๋ฏ๋ก ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค. try { while (true) { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); records.forEach(record -> { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); }); } } catch (WakeupException e) { // wakeup() ํธ์ถ ์ ์ด ์์ธ ๋ฐ์ (์ ์ ์ข ๋ฃ ์ฉ๋) System.out.println("WakeupException caught. Exiting..."); } finally { consumer.close(); System.out.println("Consumer closed."); }๊ทธ๋ฆฌ๊ณ ํ ์คํธ์ ๊ฒฝ์ฐ ํฌ๊ฒ ๋๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๋๋๋ฉด ์ข๊ฒ ์ต๋๋ค. ํตํฉ ํ ์คํธ์ ๋จ์ ํ ์คํธ์ ๋๋ค. ํตํฉ ํ ์คํธ์ ๊ฒฝ์ฐ cbt kafka cluster๋ฅผ ์ด์ํ๋ฉด์ cbt consumer๋ฅผ ์ฌ๋ฆฌ๊ณ ๋ ์ฝ๋๋ฅผ ์ ๋ฌํ์ฌ ํ ์คํธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํตํฉ ํ ์คํธ๊ฐ ์๋ฃ๋๋ฉด prod kafka cluster์ ์ฐ๋๋๋ prod consumer๋ฅผ ์๋ก์ด ๋ฒ์ ์ผ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ์ ํ ์คํธ์ ๊ฒฝ์ฐ poll() ๋ด๋ถ์์ ๊ฐ๋ณ ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ตฌ๋ฌธ์ ๋ฉ์๋ ๋๋ ํด๋์ค๋ก ๋นผ์ mock ์ฒ๋ฆฌ ๊ฐ์ ๊ฒ์ ํตํด ํ ์คํธํ์๋ฉด ์ข์๊ฒ ๊ฐ์ต๋๋ค.
- 0
- 2
- 43
Q&A
๋ฆฌ๋ฐธ๋ฐ์ค onPartitionRevoked์ด ํ์ํ ์ํฉ
์๋ ํ์ธ์. ๋ต๋ณ๋๋ฆฝ๋๋ค.1) '๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ปค๋ฐ'์๋ ์ปค๋ฐ ์ข ๋ฅ์ ๋ฐ๋ผ poll()์ด ์ด์ ์ ํธ์ถ๋๋๋ผ๋ ์ปค๋ฐ์ด ๋์ง ์์ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์๋ฉด ์ผ์ฅ ์๊ฐ๋ง๋ค ์๋ ์ปค๋ฐ์ ํ๋ ๊ตฌ๋ฌธ์ ์์ฑํ ๊ฒ์ด ์์ ์ ์์ต๋๋ค.์ด๋ฐ ๊ฒฝ์ฐ, ๋ฆฌ๋ฐธ๋ฐ์ฑ์ด ๋ฐ์ํ ๋ ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌํ record์ offset์ ๊ธฐ์ค์ผ๋ก commit์ ์ํํ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.๊ทธ๋ฌ๋ฏ๋ก, onPartitionRevoked()์์ ๊ทธ๋ฐํ ์ํฉ์ ์ฒํ ๊ฒฝ์ฐ ์ปค๋ฐ์ ํ๋ ๋ก์ง์ ํด๋น ๋ฆฌ์ค๋์์ ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค๋ ์๋ฏธ์ ๋๋ค.2) ์คํ ์ปค๋ฐ์์ ์ธ์ ํ์ํ ์ง?์ปจ์๋จธ๋ ํ ๋น๋ ํํฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ํฉ์ ๋ฐ๋ผ onPartitionRevoked()์ ์ปจ์๋จธ ์ฒ๋ฆฌ์ ๋ฐ๋ฅธ ๋ฆฌ์์ค์ ํ ๋น ๋ฐ ํด์ ๊ฐ ํ์ํ ์ ์์ต๋๋ค.์๋ฅผ ๋ค์ด, consumer๊ฐ ๋ฐ์ record์ partition๋ฒํธ์ ๋ฐ๋ผ {partition ๋ฒํธ}.txt ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปจ์๋จธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ํด๋น ํํฐ์ ์ด ์ปจ์๋จธ์์ ํด์ ๋ ๊ฒฝ์ฐ ๋ฆฌ์ค๋์์ file write flush & io close ์ ๊ฐ์ ์กฐ์น๊ฐ ํ์ํ ์ ์์ต๋๋ค.
- 0
- 2
- 37
Q&A
์นดํ์นด ํด๋ฌ์คํฐ์์ ๊ฐ๋น ๊ฐ๋ฅํ ํํฐ์ (๋ ํ๋ฆฌ์นด) ์ ๋ฌธ์
์๋ ํ์ธ์. ์นดํ์นด ํด๋ฌ์คํฐ์ ์ ํฉํ ํํฐ์ ๊ฐ์๋ ๋ฆฌ์์ค(cpu, memory, network, disk ๋ฑ) ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋จ์ํ 1๋ธ๋ก์ปค๋น x๊ฐ์ ํํฐ์ ์ด ํ ๋น ๊ฐ๋ฅํ๋ค๊ณ ํ๋ ๊ฒ์ ์์ฃผ ๋๋ต์ ์ธ ์ถ์ธ์ผ ๋ฟ ์ ๋ต์ด ์๋๋๋ค. ์๋ ค์ฃผ์ ํํฐ์ ๊ฐ์ ์ด 18,000๊ฐ์ธ ๊ฒฝ์ฐ์ ๋ํด์ ์ ์ ํ ์ปดํจํ ๋ฆฌ์์ค ์ํฉ์ด๋ผ๋ฉด 1๊ฐ์ ํด๋ฌ์คํฐ์์๋ ์ถฉ๋ถํ ์ด์ฉ๊ฐ๋ฅํ ์ ๋๋ผ๊ณ ์๊ฐ๋์ด ์ง๋๋ค. ํํฐ์ ์ด ์ง์ํด์ ๋ง์์ง๋ ๊ฒฝ์ฐ ๋ธ๋ก์ปค ๊ฐ์๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ ํ ์ด์ฉํ์ค ์ ์์ ๊ฑฐ๋ผ ์๊ฐ๋ฉ๋๋ค๋ง, ์ํฉ์ ๋ฐ๋ผ ํด๋ฌ์คํฐ๋ฅผ ์๋ก ๋ง๋ค์ด ์ด์ฉํ๋ ๊ฒ๋ ๋์์ง ์์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 77
Q&A
reset offset ์ง๋ฌธ
์๋ ํ์ธ์. ํน์ ํํฐ์ 1๊ฐ์ ๋ํด์๋ง ์คํ์ ์ resetํ์๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํํ์๋ฉด ๋ฉ๋๋ค.// ๋์ ํ ํฝ : test // ์ปจ์๋จธ ๊ทธ๋ฃน : my-group // ๋์ ํํฐ์ : 3 $ bin/kafka-consumer-groups.sh \ --bootstrap-server localhost:9092 \ --group my-group \ --topic test:3 \ --reset-offsets \ --to-earliest \ --execute
- 0
- 2
- 43
Q&A
KStreamJoinKTable ์คํ์ ์ค๋ฅ
์๋ ํ์ธ์.๋ณด๋ด์ฃผ์ ๋ก๊ทธ์ ๋ฐ๋ฅด๋ฉด ์ ํํ ์์ธ์ ์ฐพ๊ธฐ ์ด๋ ต์ต๋๋ค.์ฌ์ฉ๋ ์๋ฐ ์ฝ๋build.gradle๋ก๊ทธ ์ ์ฒด์คํ์ ์ฌ์ฉํ JDK ๋ฒ์ ์ ๊ณต์ ํด์ฃผ์๋ฉด ๋ค์ ํ๋ฒ ํ์ธ ํ ๋ต๋ณ๋๋ฆฌ๊ฒ ์ต๋๋ค~
- 0
- 2
- 47
Q&A
auto.commit.interval.ms ์ต์ ๊ด๋ จ ์ง๋ฌธ ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์, auto.commit.interval.ms ๋ฅผ ์ง์ ํ๋ค๋ ๋ป์ auto commit์ ์ํํ๋ค๋ ๋ป์ด๋ฉฐ, ์ด๋ ํ ์ฌ์ ๋ก ์ธํด ์๋ฒ๊ฐ ๋ถ๋์ดํ๊ฒ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ์๋ ์ปค๋ฐ ๋๋ฝ์ผ๋ก ์ค๋ณต ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- 0
- 2
- 89
Q&A
ํํฐ์ , ์ปจ์๋จธ ๊ทธ๋ฃน, ์ปจ์๋จธ ๊ด๋ จ ์ง๋ฌธ
์๋ ํ์ธ์~ ๋ต๋ณ๋๋ฆฌ๊ฒ ์ต๋๋ค 1-1. ํ๋์ ํํฐ์ ์ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ฌถ์ธ ์ปจ์๋จธ์ ๋ํด์ ์ฌ๋ฌ๊ฐ๊ฐ ํ ๋น๋ ์ ์์ต๋๋ค. ์ฆ, '๋์ผ ์ปจ์๋จธ ๊ทธ๋ฃน' ์ผ ๊ฒฝ์ฐ์ ๋ํด์ ํ ๋น์ด ์๋๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์๋ก ๋ค๋ฅธ ์ปจ์๋จธ ๊ทธ๋ฃน์ ๋ํด์๋ ๋ณ๊ฐ๋ก ๋์ํฉ๋๋ค! 1-2. ์ปจ์๋จธ ๊ทธ๋ฃน๋ณ๋ก ํํฐ์ ๋ณ๋ก ๋ค๋ฅธ commit์ด ์๋ฃ๋ ์คํ์ ์ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด ํํฐ์ ์ด 3๊ฐ์ธ ํ ํฝ์ hdfs-group๊ณผ elasticsearch-group ์ด๋ผ๋ ๊ฐ๊ฐ์ ์ปจ์๋จธ ๊ทธ๋ฃน์ด ๋ถ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ํ์ ๋, hdfs-group์ ๊ฐ ํํฐ์ ์ ํด๋นํ๋ ์ปค๋ฐ๋ ์คํ์ ์ด 3๊ฐ ์กด์ฌํ๊ณ elasticsearch-group์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ํํฐ์ ์ ํด๋นํ๋ ์ปค๋ฐ๋ ์คํ์ ์ด 3๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ์ปจ์๋จธ ๊ทธ๋ฃน์ ์คํ์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๋์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. 2.ํ๋์ ์ปจ์๋จธ๊ฐ ์ฌ๋ฌ ํ ํฝ์ ๊ตฌ๋ ํ๋ ๊ฒฝ์ฐ๋ ์ค๋ฌด ๊ธฐ์ค์ผ๋ก ํํ์ง๋ ์์๊ฒ ๊ฐ์ต๋๋ค. ์คํค๋ง๊ฐ ๋น์ทํ๊ณ ๋์์ ์ฒ๋ฆฌ๋์ด์ผ ํ ๊ฒฝ์ฐ์ ๊ฐ์ด ํน์ํ ๊ฒฝ์ฐ์ ์ฌ๋ฌ ํ ํฝ์ ๊ตฌ๋ ํ ์ํฉ์ด ์์ ์๋ ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค!
- 0
- 1
- 82
Q&A
java, kotlin
์๋ ํ์ธ์!๊ฐ์์์ ๋์จ ์ฃผ์ ๊ฐ๋ ์ kafka-clients ๊ณต์ ์ํ์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ์ค์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ java๋ก ์์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ kotlin์์๋ ๋์ผํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค! ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 86





![Thumbnail image of the [Apache Kafka Application Programming] From concepts to consumers, producers, connects, and streams!](https://cdn.inflearn.com/public/courses/327041/cover/d1e15d56-83e2-464d-866d-09cd80bee4a2/327041-eng-original.png?w=148)