본문 바로가기

카테고리 없음

flink(플링크) vs Spark(스파크)

Apache Flink와 Apache Spark는 대규모 데이터 처리를 위한 오픈 소스 분산 처리 시스템입니다. 두 시스템 모두 빅 데이터 애플리케이션을 위한 풍부한 기능과 라이브러리를 제공하지만, 아키텍처와 처리 모델에서 몇 가지 중요한 차이점이 있습니다.

차이점:

  1. 처리 모델:

    • Flink: Flink는 주로 스트리밍 데이터를 처리하기 위해 설계된 플랫폼입니다. Flink는 트루 스트리밍 (true streaming) 처리 모델을 사용하여 데이터를 실시간으로 처리합니다. 이는 데이터가 시스템에 도착하자마자 바로 처리되며, 미니 배치 형태가 아닌 순수한 스트리밍 방식으로 작동합니다.
    • Spark: Spark는 미니 배치 모델을 사용하여 스트리밍 데이터를 처리합니다. 이는 스트리밍 데이터를 작은 배치로 나누어 처리한다는 의미입니다. Spark의 스트리밍은 Spark Streaming 라이브러리(DStream API)를 통해 이루어지지만, Spark 2.x부터는 Structured Streaming이라는 더 발전된 스트리밍 처리 방식을 도입하였습니다.
  2. 메모리 관리:

    • Flink: Flink는 자체적인 메모리 관리 시스템을 가지고 있어서 JVM 힙 메모리에 의존하지 않습니다. 이는 OutOfMemoryError와 같은 메모리 문제에 더욱 견고하다는 장점이 있습니다.
    • Spark: Spark는 JVM 힙 메모리에 의존하며, 메모리 관리를 위해 탄력적인 분산 데이터셋(RDD)를 사용합니다. 이는 메모리 관리 최적화를 위해 종종 추가 튜닝이 필요하다는 단점이 있습니다.
  3. 이터레이터 기반 처리:

    • Flink: Flink의 실행 엔진은 데이터를 이터레이터로 처리하여 장기 실행 작업에서 메모리 사용량을 줄입니다.
    • Spark: Spark는 이터레이터 기반 방식을 사용하지 않으며, 각 단계에서 전체 데이터셋을 메모리에 로드할 수 있습니다.

유사점 및 대응 관계:

  • 실시간 처리: Flink의 스트리밍 처리 모델은 Spark의 Structured Streaming과 비교할 수 있습니다.
  • 배치 처리: Flink와 Spark 모두 배치 데이터 처리 기능을 제공합니다. Spark의 RDD와 데이터프레임 API는 Flink의 DataSet API와 유사합니다.
  • API: 두 시스템 모두 Java, Scala, Python 등 다양한 언어를 지원합니다.
  • 상태 관리와 내결함성: Flink와 Spark 모두 상태 관리와 내결함성을 위한 메커니즘을 갖추고 있으며, 체크포인트 및 스냅샷을 사용합니다.
  • 라이브러리와 툴: Flink와 Spark 모두 머신러닝, 그래프 처리, SQL 인터페이스 등 다양한 라이브러리와 툴을 제공합니다.

Apache Spark 예제 코드 (Scala 언어로 작성된 Word Count):

import org.apache.spark.sql.SparkSession

object SparkWordCount {
  def main(args: Array[String]) {
    // Spark 세션 생성
    val spark = SparkSession.builder.appName("Word Count").getOrCreate()

    // 텍스트 파일 로드


 val textFile = spark.read.textFile("hdfs://path/to/textfile.txt")

    // 단어로 분리하여 카운트
    val counts = textFile.flatMap(line => line.split(" "))
                 .groupByKey(identity)
                 .count()

    // 결과 출력
    counts.show()

    // 종료
    spark.stop()
  }
}

위 코드는 HDFS에 저장된 텍스트 파일을 로드하고, 각 줄을 단어로 분리한 다음, 단어의 발생 횟수를 계산합니다. 결과는 출력되고 Spark 세션은 종료됩니다.