Spark Streaming Fault-tolerant
Receiver, WAL, Direct Kafka API
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) μ λμ νλ€.
Write Ahead Logs (WAL) μ¬μ©
WAL μ μ¬μ©νλ©΄ λλΌμ΄λ², λ§μ€ν° νΉμ μμ»€λ Έλμμ μ₯μ κ° λ°μνλλΌλ μ λ ₯ λ°μ΄ν°κ° μ μ€λλ κ²μ λ°©μ§ν μ μλ€. μ€νν¬ μ€μ νμΌμμ WAL μ¬μ© μ€μ νκ³ StreamingContext λ₯Ό 체ν¬ν¬μΈνΈνλ©΄ μ₯μ κ° λ°μν λ 체ν¬ν¬μΈνΈλ₯Ό 볡ꡬνμ¬ λ°μ΄ν°λ 볡ꡬν μ μλ€.

WALμ μ¬μ©νλ©΄ λ°μ΄ν°κ° μ μ€λλ λ¬Έμ λ ν΄κ²°ν μ μμ§λ§, λ°μ΄ν°κ° μ€λ³΅λ μ μλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ₯Ό WAL μ μ μ₯νκ³ Kafka Offset μ Zookeeper μ μ λ°μ΄νΈνμ§ λͺ»ν μνμμ μ₯μ κ° λ°μνλ©΄, Spark Streaming μ Kafka μμ λ°μ΄ν°λ₯Ό λ€μ κ°μ Έμ μ€λ³΅ μ²λ¦¬νλ λ¬Έμ κ° λ°μνλ€. (at-least-one)
λ°μ΄ν° μ€λ³΅ μ²λ¦¬ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Spark 1.3 λ²μ μμλ Direct Kafka API λμ νμλ€
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 μ°λ
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/
Last updated
Was this helpful?