Spark Streaming Fault-tolerant
Receiver, WAL, Direct Kafka API
Last updated
Was this helpful?
Receiver, WAL, Direct Kafka API
Last updated
Was this helpful?
Spark์ RDD๋ ์ฅ์ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค. RDD ๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ณ , ์ฐ์ฐ ์์๋ฅผ ๊ธฐ์ตํ๊ณ (lineage) ์์ด์ ๋ค์ ๋ง๋ค ์ ์๋ ๋ถ์ฐ ๋ฐ์ดํฐ์ ์ด๋ค. ์์ปค ๋ ธ๋์ ์ค๋ฅ ๋๋ฌธ์ RDD ์ ์ด๋ค ๋ถ๋ถ์ด ์ ์ค๋๋ฉด ๊ทธ ๋ถ๋ถ์ ์ฐ์ฐ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์์ฑํ ์ ์๋ค. Spark Streaming์ DStream ๋ RDD๋ฅผ ๊ทผ๊ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ณต์ํ ์ ์๋ค.
Spark๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฅ์ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด์ HDFS, S3 ๋ฑ์ ๋ฐ์ดํฐ ์์ค๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ง ์๋๋ค. ํ์ง๋ง ๋คํธ์ํฌ๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ(์, kafka, flume)์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ ์ ์๋ค.
Spark Streaming ์์ Receiver๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, Receiver๋ ๋ฐ์ดํฐ ์ ์ค์ ๋ง๊ธฐ ์ํด์ ๋คํธ์ํฌ๋ฅผ ํตํด์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๋ ธ๋์ ๋ณต์ ํ๊ธฐ ๋๋ฌธ์(๋ํดํธ ๋ณต์ ์ธ์: 2), ์์ปค ๋ ธ๋๊ฐ ์คํจํ ๋ ๋ณต์ฌ๋ณธ์ผ๋ก ์ ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ ์ ์๋ค.
๊ทธ๋ฌ๋ Receiver๊ฐ ์๋ ์์ปค ๋ ธ๋์์ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ Receiver์์ ๋ค๋ฅธ ์์ปค๋ ธ๋๋ก ๋ณต์ ๋์ง ์๊ณ ๋ฒํผ์ ๋จ์ ์๋ ๋ฐ์ดํฐ๋ ์ ์ค๋ ์ ์๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ์ ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Spark 1.2 ๋ฒ์ ์์๋ Write Ahead Logs(WAL) ์ ๋์ ํ๋ค.
WAL ์ ์ฌ์ฉํ๋ฉด ๋๋ผ์ด๋ฒ, ๋ง์คํฐ ํน์ ์์ปค๋ ธ๋์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค. ์คํํฌ ์ค์ ํ์ผ์์ WAL ์ฌ์ฉ ์ค์ ํ๊ณ StreamingContext ๋ฅผ ์ฒดํฌํฌ์ธํธํ๋ฉด ์ฅ์ ๊ฐ ๋ฐ์ํ ๋ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ณต๊ตฌํ์ฌ ๋ฐ์ดํฐ๋ ๋ณต๊ตฌํ ์ ์๋ค.
WAL์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ค๋๋ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ง๋ง, ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฅผ WAL ์ ์ ์ฅํ๊ณ Kafka Offset ์ Zookeeper ์ ์ ๋ฐ์ดํธํ์ง ๋ชปํ ์ํ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด, Spark Streaming ์ Kafka ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ ์ค๋ณต ์ฒ๋ฆฌํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. (at-least-one)
๋ฐ์ดํฐ ์ค๋ณต ์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Spark 1.3 ๋ฒ์ ์์๋ Direct Kafka API ๋์ ํ์๋ค
๋ฐ์ดํฐ ์์ ์๋ฃ ์ฌ๋ถ๋ฅผ 2๊ฐ์ ์์คํ ์์ ๊ด๋ฆฌํ๋ฉด, ์์์ฑ์ ๊ฐ์ง๊ณ ์ ๋ฐ์ดํธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ์ผ์น์ฑ์ด ๋ฐ์ํ๋ค. ๋ถ์ผ์น์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด 1๊ฐ์ ์์คํ ์์ ๋ฐ์ดํฐ ์์ ์ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. Spark Streaming ์ Kafka์ Simple Consumer API ๋ฅผ ์ฌ์ฉํ์ฌ offset ์ Spark Streaming ์์ ์ง์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ์๋ค.
์ด ๋ฐฉ์์ Receiver ์ WAL ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ค์ ๋ฐฉ์งํ๋ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ค๋ฅด๋ค. Receiver๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ WAL ์ ์ ์ฅํ๋ ๋์ ์ ๋งค ๋ฐฐ์น๊ฐ๊ฒฉ(Batch Interval)๋ง๋ค Consume ํ ๋ฐ์ดํฐ์ offset range์ ์ค์ ํ๊ณ ๋์ค์ Batch Jobs์ ์คํํ ๋, offset range ์ค์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ Kafka Broker์์ ์ฝ์ด์ค๊ณ offset์ checkpointํ๊ณ ๋ณต๊ตฌํ ๋ ์ฌ์ฉํ๋ค.
Spark Streaming ์ Direct Kafka API ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ ์ค์ ๋ฐฉ์งํ๊ณ ์ค๋ณต ์์ด ์ ํํ๊ฒ ํ๋ฒ(Exactly-one)๋ง ์ฒ๋ฆฌํ ์ ์๋ค.
์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
Direct Kafka API๋ฅผ ์ฌ์ฉํ๋ฉด Receiver ๊ฐ ํ์์๊ธฐ ๋๋ฌธ์ Receiver (Kafka Consumer) ๋น Kafka Partition ์ ๊ตฌ์ฑํ ํ์๊ฐ ์๊ณ ๊ฐ Kafka Partition ๋ณ๋ก RDD Partition ์์ฑํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
Spark Streaming์ Fault-tolerant๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ Kafka ์ฐ๋ ๋ฐฉ์์ Checkpointing ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค. ๋ง์ฝ Spark ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ปดํ์ผํ์ฌ ์ฌ๋ฐฐํฌํด์ผ ํ๋ค๋ฉด ์ด์ ๋ฐ์ด๋๋ฆฌ๋ก checkpointํ Context ๋ฅผ ๋ค์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ checkpoint Directory๋ฅผ ์ญ์ ํ๊ณ Spark ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํด์ผ ํ๋ค.
ACID(์์์ฑ, ์ผ๊ด์ฑ, ๊ณ ๋ฆฝ์ฑ, ์ง์์ฑ)
ACID ์์์ฑ (Atomicity) ํธ๋์ญ์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๋ฉด, ํญ์ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์งํด์ผ ํ๋ค.
ACID ์ง์์ฑ (Durability) ํ์ผ์์คํ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ํธ๋์ญ์ ์ ์์ํ ๋ฐ์๋์ด์ผ ํ๋ค.
Improvements to Kafka integration of Spark Streaming, https://databricks.com/blog/2015/03/30/improvements-to-kafka-integration-of-spark-streaming.html Improved Fault-tolerance and Zero Data Loss in Spark Streaming, https://databricks.com/blog/2015/01/15/improved-driver-fault-tolerance-and-zero-data-loss-in-spark-streaming.html Integrating Kafka and Spark Streaming: Code Examples and State of the Game, http://www.michael-noll.com/blog/2014/10/01/kafka-spark-streaming-integration-example-tutorial/ Exactly-once Spark Streaming from Apache Kafka, http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/