실습2

'하둡,spark' 카테고리의 다른 글

spark 데이터프레임 실습4  (0) 2024.01.24
spark 데이터프레임 실습3  (0) 2024.01.24
spark 데이터프레임 실습1  (0) 2024.01.23
spark 기초 실습(colab)  (0) 2024.01.19
spark 데이터 구조  (0) 2024.01.19
Spark DataFrame 실습1

'하둡,spark' 카테고리의 다른 글

spark 데이터프레임 실습3  (0) 2024.01.24
spark 데이터프레임 실습2  (0) 2024.01.23
spark 기초 실습(colab)  (0) 2024.01.19
spark 데이터 구조  (0) 2024.01.19
spark 데이터 처리  (0) 2024.01.18
PySpark_설치_및_테스트

'하둡,spark' 카테고리의 다른 글

spark 데이터프레임 실습2  (0) 2024.01.23
spark 데이터프레임 실습1  (0) 2024.01.23
spark 데이터 구조  (0) 2024.01.19
spark 데이터 처리  (0) 2024.01.18
Spark 프로그램 실행 환경  (0) 2024.01.18

RDD, DataFrame, Dataset (Immutable Distributed Data)

  • 2016년에 DataFrame과 Dataset은 하나의 API로 통합됨
  • 모두 파티션으로 나뉘어 Spark에서 처리됨



RDD (Resilient Distributed Dataset):

  • - **로우레벨 데이터:** RDD는 클러스터 내의 서버에 분산된 로우레벨 데이터를 지칭합니다.
      - **스키마 없음:** 레코드별로 존재하지만 스키마가 존재하지 않습니다. 따라서 구조화된 데이터나 비구조화된 데이터를 모두 지원합니다.

DataFrame과 Dataset:

  • DataFrame:
        - RDD 위에 만들어지는데, 필드 정보를 갖고 있습니다. 이는 테이블 형태로 생각할 수 있습니다.
        - 구조화된 데이터를 다룰 때 유용하며, 스키마 정보를 가지고 있습니다.
        - PySpark에서도 사용 가능하며, 특히 Python에서는 주로 DataFrame을 활용합니다.

  •  Dataset:
     DataFrame과 마찬가지로 RDD 위에 만들어집니다. 하지만 Dataset은 타입 정보가 존재하며, 컴파일 언어에서 사용 
        - 주로 Scala와 Java에서 활용되며, 컴파일러가 타입을 검사할 수 있는 장점이 있습니다.
        - PySpark에서는 주로 DataFrame을 사용하고, 타입 정보가 필요한 경우에는 Dataset을 활용할 수 있습니다.

 

spark sql 엔진

  1. Code Analysis (코드 분석):
       - **역할:** Spark는 사용자 코드를 분석하여 데이터프레임 또는 RDD의 트랜스포메이션 및 액션을 파악합니다.
       - **기능:** 코드 분석 단계에서는 사용자가 작성한 코드를 해석하고, 실행 계획을 수립하기 위한 정보를 추출합니다.

  2. Logical Optimization (Catalyst Optimizer, 논리적 최적화):
       - **역할:** Catalyst Optimizer는 논리적 최적화를 수행하여 불필요한 계산을 제거하고 최적의 실행 계획을 도출
       - **기능:** 논리적 최적화는 사용자의 쿼리를 내부적으로 최적화하여 처리 효율을 향상시킵니다. 예를 들어, 필요없는 컬럼이나 조건을 제거하고, 필터링을 최적화하는 등의 작업이 이루어집니다.

  3. Physical Planning (물리적 계획):
       - **역할:** Catalyst Optimizer에 의해 최적화된 논리적 실행 계획을 물리적 실행 계획으로 변환합니다.
       - **기능:** 최적화된 논리적 계획을 어떻게 물리적으로 실행할지에 대한 계획을 수립합니다. 이는 실제 익스큐터에서 수행될 태스크 및 데이터 셔플링 방법 등을 결정합니다.

  4. Code Generation (Project Tungsten):
       - **역할:** Project Tungsten은 물리적 실행 계획을 효율적으로 구현하기 위해 코드를 생성합니다.
       - **기능:** 물리적 실행 계획에 대한 코드를 생성하고, 코드 실행 시점에서 최적화된 코드를 사용하여 성능을 최대한 끌어올립니다. 코드 생성을 통해 JVM을 효율적으로 활용하고, 불필요한 오버헤드를 최소화합니다.

 

Spark 데이터 구조 - RDD

  • 변경이 불가능한 분산 저장된 데이터:
      - RDD는 여러 개의 파티션으로 나누어진 변경이 불가능한 데이터를 나타냅니다.
      - 각각의 파티션은 클러스터 내에 분산되어 저장되며, 데이터의 내결함성을 제공합니다.
      - RDD는 로우레벨의 함수형 변환을 지원하며, `map`, `filter`, `flatMap` 등의 함수형 프로그래밍 연산을 활용하여 데이터를 조작할 수 있습니다.

  • 일반 파이썬 데이터의 RDD 변환:
      - 파이썬에서는 `parallelize` 함수를 사용하여 일반적인 데이터를 RDD로 변환할 수 있습니다.
      - RDD를 사용하면 분산 환경에서 데이터를 효율적으로 처리할 수 있으며, RDD의 불변성과 내결함성을 활용하여 안정적인 분산 처리를 보장합니다.
      - 반대로, RDD를 일반적인 파이썬 데이터로 변환하려면 `collect` 함수를 사용할 수 있습니다. 이는 RDD의 모든 데이터를 드라이버 노드로 수집하는 역할을 합니다.

 

Spark 데이터 구조 - 데이터 프레임:

  • 변경이 불가한 분산 저장된 데이터:**
      - 데이터 프레임은 RDD와 마찬가지로 변경이 불가능한 분산 저장된 데이터입니다.
      - 여러 개의 파티션으로 나누어져 클러스터에 분산 저장되며, 내결함성과 데이터 처리의 안정성을 제공합니다.

  • 관계형 데이터베이스 테이블과 유사한 구조:**
      - RDD와 달리 데이터 프레임은 관계형 데이터베이스 테이블과 유사한 형태로 구성됩니다.
      - 행과 열로 이루어진 테이블 형식으로 데이터를 저장하며, 각 컬럼은 데이터의 속성을 나타냅니다.
      - 판다스의 데이터 프레임이나 관계형 데이터베이스의 테이블과 유사한 편리한 조작 기능을 제공합니다.

  • 다양한 데이터 소스 지원:**
      - 데이터 프레임은 다양한 데이터 소스로부터 데이터를 읽거나 저장할 수 있습니다.
      - HDFS, Hive, 외부 데이터베이스, 기존 RDD 등 다양한 데이터 소스와 통합하여 사용할 수 있습니다.

  • 다양한 언어 지원:**
      - 데이터 프레임은 스칼라, 자바, 파이썬과 같은 다양한 프로그래밍 언어에서 지원됩니다.
      - 이로써 사용자는 선호하는 언어를 선택하여 데이터 프레임을 조작하고 분석할 수 있습니다.

Spark Session 생성:

  • Spark 프로그램 시작점:
      - Spark 프로그램의 시작은 SparkSession을 생성하는 것으로 이루어집니다.
      - 각 프로그램은 하나의 SparkSession을 생성하며, 이를 통해 Spark Cluster와의 통신이 이루어집니다.
      - SparkSession은 싱글톤 객체로 구현되어 있어, 하나의 프로그램에서 전역적으로 사용됩니다.

  • Spark 2.0에서 도입:
      - Spark 2.0 버전에서 처음으로 도입된 개념으로, 이전에는 SparkContext를 통해 Spark 기능을 사용했습니다.
      - SparkSession은 Spark 2.0에서 통합된 인터페이스로 다양한 기능들을 효과적으로 사용할 수 있도록 지원합니다.

  • 다양한 기능 통합:
      - Spark Session을 통해 DataFrame, SQL, Streaming, ML API 등 다양한 Spark 기능에 접근할 수 있습니다.
      - config 메소드를 활용하여 다양한 환경 설정이 가능하며, 각종 작업을 효율적으로 수행할 수 있습니다.

  • RDD와의 관계:
      - RDD와 관련된 작업을 수행할 때는 SparkSession 밑의 sparkContext 객체를 사용합니다.
      - SparkSession은 DataFrame과 관련된 작업에 최적화되어 있으며, RDD 작업은 sparkContext를 통해 수행됩니다.

Spark 세션 생성 - PySpark 예제

  • 위의 코드는 PySpark에서 Spark Session을 생성하는 코드입니다. 각각의 파라미터에 대한 설명은 다음과 같습니다:

    - **master("local[*]"):**
      - Spark 클러스터의 주소 또는 클러스터 관리자에 대한 URL을 지정합니다.
      - "local[*]"는 로컬 환경에서 모든 가능한 코어를 사용하여 실행하도록 지정합니다. 이것은 주로 개발 및 테스트 목적으로 사용됩니다.

    - **appName('PySpark Tutorial'):**
      - 생성되는 Spark 애플리케이션의 이름을 지정합니다. 이는 Spark 클러스터의 웹 UI에서 식별에 사용됩니다.

    - **getOrCreate():**
      - SparkSession 객체를 생성하거나 이미 존재하는 경우 기존의 SparkSession을 반환합니다.
      - SparkSession은 보통 하나의 애플리케이션에 대해 하나만 생성되어야 하므로, 이미 존재하는지 여부를 체크하고 새로 생성하거나 반환합니다.

    이 코드를 통해 SparkSession이 생성되면, 해당 객체를 사용하여 PySpark에서 다양한 기능들을 수행할 수 있습니다.

 

PySpark에 주요 모듈 및 클래스

  1. pyspark.sql.SparkSession:**
       - Spark 애플리케이션을 시작하기 위한 핵심 진입점인 Spark 세션을 생성하는 클래스입니다.

  2. pyspark.sql.DataFrame:**
       - 테이블이나 데이터베이스 테이블과 유사한 분산 데이터프레임을 나타내는 클래스입니다. 구조화된 데이터를 처리하는 데 사용됩니다.

  3. pyspark.sql.Column:**
       - DataFrame의 컬럼을 나타내는 클래스로, 특정 컬럼에 대한 작업 및 변환을 수행하는 데 사용됩니다.

  4. pyspark.sql.Row:**
       - DataFrame의 레코드를 나타내는 클래스로, 각 레코드는 여러 컬럼의 값으로 구성됩니다.

  5. pyspark.sql.functions:**
       - 다양한 내장 함수를 제공하는 모듈로, DataFrame 컬럼에 대한 다양한 연산과 변환을 수행하는 데 사용됩니다.

  6. pyspark.sql.types:**
       - 다양한 데이터 타입을 정의하는 모듈로, DataFrame의 스키마를 정의하거나 데이터 타입 변환에 사용됩니다.

  7. pyspark.sql.Window:**
       - 윈도우 함수를 정의하고 사용하는 데 사용되는 클래스로, 데이터의 윈도우 기반 분석을 수행하는 데 도움을 줌

    이러한 모듈과 클래스는 PySpark를 사용하여 구조화된 데이터를 처리하고 분석하는 데 필수적이며, 다양한 작업 및 변환을 수행할 수 있도록 도와줍니다.

 

Spark Session을 생성할 때  주요 환경 변수 몇 가지

  1. executor별 메모리:** `spark.executor.memory` (기본값: 1g)
       - 각 익스큐터가 사용할 메모리 양을 설정합니다.

  2. executor별 CPU 수:** `spark.executor.cores` (YARN에서는 기본값 1)
       - 각 익스큐터가 사용할 CPU 코어 수를 설정합니다.

  3. driver 메모리:** `spark.driver.memory` (기본값: 1g)
       - 드라이버가 사용할 메모리 양을 설정합니다.

  4. Shuffle 후 Partition의 수:** `spark.sql.shuffle.partitions` (기본값: 최대 200)
       - 셔플 후 생성되는 파티션의 수를 설정합니다.

  5. 그 외 환경변수들 https://spark.apache.org/docs/latest/configuration.html#application-properties

Spark Session의 환경 설정은 다음 4가지 방법으로 수행할 수 있습니다:

  1. 환경변수:**
       - 환경 변수를 사용하여 Spark Session의 설정을 지정할 수 있습니다.

  2. $SPARK_HOME/conf/spark_defaults.conf:**
       - Spark이 사용하는 기본 설정 파일인 `spark_defaults.conf`를 편집하여 설정을 지정할 수 있습니다.

  3. spark-submit 명령의 커맨드라인 파라미터:**
       - `spark-submit` 명령을 사용할 때, 명령행에서 직접 설정을 지정할 수 있습니다.

  4. SparkSession 만들 때 지정:**
       - Spark Session을 생성할 때 직접 설정을 지정할 수 있습니다. 이는 `SparkConf` 객체를 통해 수행됩니다.

    이 중에서 `spark-submit` 명령의 커맨드라인 파라미터와 SparkSession을 만들 때 지정하는 방법은 각각 프로그램 실행 시 동적으로 설정을 변경할 수 있는 방법입니다.

spark 환경설정 방법( sparksession 생성시 일일히 지정)

  • from pyspark.sql import SparkSession
    # SparkSession은 싱글턴이므로 이미 존재하는 경우 가져오고, 없으면 새로 생성합니다.
    spark = SparkSession.builder \
        .master("local[*]") \  # 클러스터 매니저를 설정합니다. "local[*]"는 로컬 모드에서 사용 가능한 모든 코어를 활용함을 의미합니다.
        .appName('PySpark Tutorial') \  # Spark 애플리케이션의 이름을 지정합니다.
        .config("spark.some.config.option1", "some-value") \  # 사용자가 지정한 Spark 환경 설정을 추가합니다.
        .config("spark.some.config.option2", "some-value") \
        .getOrCreate()  # 이미 존재하는 SparkSession이 있다면 가져오고, 없다면 새로 생성합니다.

spark 환경설정 방법( SparkConf 객체에 환경 설정하고 SparkSession에 지정)

  • from pyspark.sql import SparkSession
    from pyspark import SparkConf

    # SparkConf 객체를 생성하고 필요한 설정을 추가합니다.
    conf = SparkConf()
    conf.set("spark.app.name", "PySpark Tutorial")  # Spark 애플리케이션의 이름을 설정합니다.
    conf.set("spark.master", "local[*]")  # 클러스터 매니저를 설정합니다. "local[*]"는 로컬 모드에서 사용 가능한 모든 코어를 활용함을 의미합니다.

    # SparkSession을 생성하고 SparkConf 객체를 전달합니다.
    # 이미 존재하는 SparkSession이 있다면 가져오고, 없다면 새로 생성합니다.
    spark = SparkSession.builder \
        .config(conf=conf) \
        .getOrCreate()

전체적인 PySpark 프로세스의 흐름

  1. Spark 세션 생성:**
       - `SparkSession`을 생성하여 Spark 클러스터와 통신합니다.

  2. 입력 데이터 로딩:**
       - `SparkSession`을 사용하여 원하는 입력 데이터를 로드합니다.

  3. 데이터 조작 작업:**
       - DataFrame API나 Spark SQL을 활용하여 데이터를 조작합니다.
       - 판다스와 유사한 방식으로 작업하며, 필요한 경우 새로운 DataFrame을 생성합니다.
       - 원하는 결과가 나올 때까지 다양한 작업을 수행합니다.

  4. 최종 결과 저장:**
       - 조작한 데이터나 계산된 결과를 최종적으로 저장합니다.
       - 다양한 출력 포맷에 따라 적절한 형식으로 결과를 저장할 수 있습니다.

    이러한 플로우를 통해 PySpark을 활용하여 데이터 처리 및 분석 작업을 수행할 수 있습니다.

 

Spark Session에서 지원하는 주요 데이터 소스

  • `spark.read`와 `spark.write`를 사용하여 데이터를 로드하고 저장합니다. 

  • 많이 사용되는 데이터 소스들
    HDFS 파일:**
       - CSV, JSON, Parquet, ORC, Text, Avro 등과 같은 다양한 파일 형식을 지원합니다.
       - 특히, Parquet, ORC, Avro는 고성능 및 압축 효율성을 제공하는데, 이에 대한 자세한 내용은 나중에 설명될 것
       - Hive 테이블

  • JDBC 관계형 데이터베이스:**
       - JDBC를 통해 연결된 다양한 관계형 데이터베이스에서 데이터를 읽거나 쓸 수 있습니다.

  • 클라우드 기반 데이터 시스템:**
       - 다양한 클라우드 플랫폼에서 제공하는 데이터 저장소나 데이터 서비스를 지원합니다.

  • 스트리밍 시스템:**
       - Spark Streaming을 사용하여 실시간 데이터를 처리하거나, 다양한 스트리밍 소스에서 데이터를 읽을 수 있습니다.
    이를 통해 Spark은 다양한 데이터 소스와 형식을 효율적으로 처리하고 분석할 수 있습니다.

 

Spark 개발 환경 옵션

  • Local Standalone Spark + Spark Shell
  • Python IDE – PyCharm, Visual Studio 
  • Databricks Cloud – 커뮤니티 에디션을 무료로 사용
  • 다른 노트북 – 주피터 노트북, 구글 Colab, 아나콘다 등등

Local Standalone Spark:

  • 로컬 스탠드얼론(Spark Standalone)은 Spark을 단일 머신에서 실행하고 테스트하기 위한 클러스터 매니저 옵션입니다. 주로 개발 및 간단한 테스트 목적으로 사용됩니다.

    - Spark Cluster Manager 설정:**
      - `master`를 `local[n]`으로 설정하여 사용합니다.
      - `n`은 사용할 쓰레드 수를 나타내며, 로컬 클러스터 내에서 실행될 스레드 수를 조절합니다.

    - 주로 개발이나 간단한 테스트 용도
    - 하나의 JVM(Java Virtual Machine)에서 모든 프로세스가 실행됩니다.
      - 단일 Driver와 단일 Executor가 실행됩니다.
      - 1+ 쓰레드가 Executor안에서 실행됨

    - Executor 내에서 생성되는 쓰레드 수는 다음과 같이 조절됩니다:
      - `local`: 하나의 쓰레드만 생성됩니다.
      - `local[*]`: 컴퓨터의 CPU 수만큼 쓰레드가 생성됩니다.

    로컬 스탠드얼론 모드를 사용하면 효율적으로 개발 및 테스트를 수행할 수 있으며, 단일 머신에서 Spark 애플리케이션을 실행하는 간편한 방법을 제공합니다.

 

구글 Colab에서 Spark 사용

  • PySpark + Py4J를 설치
    1) 구글 Colab 가상서버 위에 로컬 모드 Spark을 실행
    2) 개발 목적으로는 충분하지만 큰 데이터의 처리는 불가
    3) Spark Web UI는 기본적으로는 접근 불가 (ngrok을 통해 억지로 열 수는 있음)
    4) Py4J(파이썬에서 JVM내에 있는 자바 객체를 사용가능하게 해줌)

'하둡,spark' 카테고리의 다른 글

spark 데이터프레임 실습1  (0) 2024.01.23
spark 기초 실습(colab)  (0) 2024.01.19
spark 데이터 처리  (0) 2024.01.18
Spark 프로그램 실행 환경  (0) 2024.01.18
spark 기초  (0) 2024.01.18

spark 데이터 시스템 아키텍처

데이터 병렬 처리 가능성 조건

  1. 데이터 분산
       - **하둡 맵의 데이터 처리 단위:** 하둡에서는 데이터를 먼저 분산시켜야 합니다. 맵리듀스에서의 데이터 처리 단위는 디스크에 있는 데이터 블록으로, 일반적으로 128MB 크기입니다. 이 크기는 `hdfs-site.xml`의 `dfs.block.size` 프로퍼티에 의해 결정됩니다.
       - **Spark에서의 파티션:** Spark에서는 데이터를 파티션으로 구분합니다. 기본적으로 파티션의 크기도 128MB(조절 가능)이며, 이는 `spark.sql.files.maxPartitionBytes` 프로퍼티에 의해 설정됩니다. 이 프로퍼티는 주로 HDFS 등에 있는 파일을 읽어올 때 적용됩니다.

  2. 동시 처리
       - **맵리듀스에서의 처리:** 맵리듀스에서는 N개의 데이터 블록으로 구성된 파일을 처리할 때 N개의 Map 태스크가 동시에 실행됩니다.
       - **Spark에서의 처리:** Spark에서는 데이터가 파티션 단위로 메모리에 로드되어 Executor에 배정되어 동시에 처리됩니다. Executor는 클러스터에서 실행되는 독립적인 작업 단위입니다.

 

spark 데이터 처리 흐름

  • 파티션 구성:
    • 작은 파티션: 데이터프레임은 작은 파티션들로 구성됩니다. 이는 데이터를 효율적으로 처리하기 위한 작업 단위로, 작은 단위로 데이터를 분할하여 병렬 처리를 가능케 합니다.
  • 불변성 (Immutable):
    • 데이터프레임의 불변성: 데이터프레임은 한 번 생성되면 수정할 수 없는 불변성을 가지고 있습니다. 이는 새로운 데이터프레임이 필요할 때 기존 데이터프레임을 변경하는 대신 새로운 데이터프레임을 생성하는 방식으로 동작합니다.
  • 변환 작업:
    • 다양한 변환 작업: 입력 데이터프레임을 원하는 결과까지 다른 데이터프레임으로 계속 변환할 수 있습니다. 이러한 변환 작업에는 sort, group by, filter, map, join 등이 포함됩니다.



셔플링 (Shuffling):

  • 셔플링 발생 상황:
        - 명시적으로 파티션을 변경하는 경우 (예: 파티션 수를 줄일 때)
        - 시스템에 의해 이뤄지는 셔플링 작업, 예를 들면 그룹핑(aggregation)이나 정렬(sorting)과 같은 작업이 있을 때

  • 셔플링이 발생할 때 네트웍을 타고 데이터가 이동하게 됨
        - 셔플링이 발생하면 파티션 간에 데이터 이동이 필요합니다. 이때 네트워크를 통해 데이터가 이동하게 됩니다.
        - 몇 개의 파티션이 결과로 만들어질까?
        - 셔플링이 발생할 때 최종적으로 몇 개의 파티션이 결과로 생성될지는 `spark.sql.shuffle.partitions` 프로퍼티에 의해 결정됩니다. 이 값은 기본적으로 200이며, 이는 최대 파티션 수를 나타냅니다.
        - 오퍼레이션에 따라 파티션 수가 동적으로 결정되며, 예를 들어 랜덤, 해싱 파티셔닝, 레인지 파티셔닝 등이 있다.
        - 정렬 작업의 경우 레인지 파티셔닝을 사용하게 됩니다.
      - **Data Skew 발생 가능성:**
        - 셔플링 과정에서 데이터 스뷰(skew)가 발생할 수 있습니다. 일부 파티션에 데이터가 고르게 분배되지 않고 특정 파티션에 데이터가 집중되는 현상을 말합니다.


셔플링: hashing partition( Aggregation 오퍼레이션)

 

데이터 스뷰 (Data Skewness)

  • 데이터 파티셔닝의 병렬성과 단점:
      - 데이터 파티셔닝은 데이터 처리에 병렬성을 제공하지만, 데이터가 균등하게 분포하지 않는 경우에는 단점이 발생
      - 이러한 단점은 주로 데이터 셔플링(shuffling) 이후에 발생합니다.

  • Data Skew 발생 원인:
      - **셔플링 이후 데이터 불균형:** 셔플링 작업을 통해 데이터를 재분배하는 과정에서 특정 파티션에 데이터가 과도하게 집중되는 현상으로 인해 Data Skew가 발생합니다.

  • 대응 방안:**
      - 셔플링 최소화:** 데이터 셔플링을 최소화하는 것이 중요합니다. 셔플링은 비용이 큰 작업 중 하나이며, 최소화하면 성능을 향상시킬 수 있습니다.
      - 파티션 최적화:** 데이터 파티션의 수를 최적으로 조절하여 균형 있는 분산을 유지하도록 최적화하는 것이 중요합니다. 효율적인 파티션 설정은 Data Skew를 방지하고 성능을 향상시킬 수 있습니다.

 

'하둡,spark' 카테고리의 다른 글

spark 기초 실습(colab)  (0) 2024.01.19
spark 데이터 구조  (0) 2024.01.19
Spark 프로그램 실행 환경  (0) 2024.01.18
spark 기초  (0) 2024.01.18
맵리듀스(MapReduce) 문제점  (0) 2024.01.18

Spark 프로그램 실행 환경

  1. 개발/테스트/학습 환경 (Interactive Clients):**
       - **노트북 (주피터, 제플린):** 주피터 노트북이나 제플린과 같은 대화형 노트북 환경에서 Spark 코드를 작성하고 실행할 수 있습니다. 이는 데이터 탐색, 실험 및 작은 규모의 작업에 유용합니다.
       - **Spark Shell:** Spark의 REPL(Read-Eval-Print Loop) 환경으로, 쉘에서 실시간으로 Spark 코드를 작성하고 실행할 수 있습니다.

  2. 프로덕션 환경 (Submit Job):**
       - **spark-submit (command-line utility):** 가장 일반적인 방법으로, Spark 애플리케이션을 제출하여 클러스터에서 실행합니다. 대규모의 프로덕션 운영에 적합합니다.
       - **데이터브릭스 노트북:** 노트북 코드를 주기적으로 실행할 수 있는 기능을 제공하며, 머신 러닝 파이프라인의 일부로 사용될 수 있습니다.
       - **REST API:** Spark Standalone 모드에서만 가능하며, API를 통해 Spark 작업을 실행할 수 있습니다. 실행 코드는 미리 HDFS 등의 파일 시스템에 적재되어 있어야 합니다.

Spark 프로그램의 구조

  1. Driver:**
       - **역할:** Spark 프로그램을 실행하고 제어하는 메인 프로세스로, 실행되는 코드의 마스터 역할을 수행합니다.
       - **기능:**
         - 클러스터에서 애플리케이션의 메인 논리를 실행하고 제어합니다.
         - 작업 스케줄링, 태스크 분배, 데이터 분산, 결과 수집 등을 담당합니다.
         - 클러스터 매니저 (예: YARN)에서 실행 중인 Application Master와 유사한 역할을 합니다.

  2. Executor:**
       - **역할:** 실제로 태스크를 실행하고 데이터를 처리하는 역할을 수행하는 프로세스입니다.
       - **기능:**
         - 드라이버로부터 할당받은 태스크를 수행합니다.
         - 태스크의 실행 과정에서 데이터를 메모리에 캐시하고, 중간 결과를 저장합니다.
         - 드라이버에게 결과를 보고하고, 새로운 태스크를 할당받을 준비를 합니다.
         - 클러스터 매니저에서 실행 중인 컨테이너에 해당합니다. (예: YARN의 컨테이너)

    이러한 구조에서 드라이버는 클러스터의 메인 노드에서 실행되며, 여러 개의 익스큐터가 클러스터의 워커 노드에서 병렬로 동작합니다. 드라이버와 익스큐터 간의 통신은 네트워크를 통해 이루어집니다. Spark 애플리케이션이 실행되면 드라이버와 익스큐터는 클러스터 매니저에 의해 할당되어 동작하게 됩니다.

 

Spark 프로그램의 구조 더 자세히

  1. Driver:**
    - **사용자 코드 실행 및 실행 모드에 따른 위치:**
      - 드라이버는 사용자 코드를 실행하며, 실행 모드에 따라 클라이언트 모드에서는 사용자의 로컬 머신에서 실행되고, 클러스터 모드에서는 클러스터의 매니저에서 실행됩니다.

    - **리소스 지정:**
      - 사용자 코드를 실행하는데 필요한 리소스를 지정합니다. 예를 들어, `--num-executors`, `--executor-cores`, `--executor-memory`와 같은 설정을 통해 익스큐터의 개수와 각 익스큐터의 자원을 지정할 수 있습니다.

    - **SparkSession 생성 및 클러스터 통신:**
      - SparkSession을 만들어 Spark 클러스터와 통신을 수행합니다.
      - 클러스터 매니저(예: YARN의 Resource Manager)와 통신하여 클러스터 리소스를 할당받습니다.
      - Executor(예: YARN의 Container)를 클러스터에 요청하고 관리합니다.

    - **사용자 코드 변환 및 실행:**
      - 사용자 코드를 Spark 태스크로 변환하고 클러스터에서 실행합니다.
      - 클러스터 매니저를 통해 익스큐터를 할당하고, 사용자 코드를 익스큐터에서 실행합니다.

  2. Executor:**
    - **실제 태스크 실행 역할(jvm: Java Virtual Machine):**
      - 익스큐터는 드라이버로부터 할당받은 태스크를 실행하는 역할을 수행합니다.
      - Transformations과 Actions 단계에서 작업을 수행하며, 데이터를 처리하고 중간 결과를 저장합니다.

    - **YARN에서의 Container:**
      - YARN 환경에서는 익스큐터가 클러스터에서 실행되는데, 이때는 YARN의 컨테이너가 해당 역할을 수행합니다.

    드라이버와 익스큐터 간의 통신은 SparkSession을 통해 이루어지며, 사용자 코드는 클러스터 환경에서 분산되어 실행됩니다.

Spark 클러스터 매니저 옵션

  1. **local[n]:**
    - **설명:** 로컬 환경에서 개발 및 테스트 목적으로 사용되는 Spark 클러스터 매니저 옵션입니다. 주로 Spark Shell, 통합 개발 환경(IDE), 노트북 등에서 활용됩니다.
    - **특징:**
      - 하나의 JVM이 클러스터로 동작하며, Driver와 하나의 Executor가 실행됩니다.
      - `n`은 코어의 수를 나타내며, Executor의 스레드 수가 됩니다.
      - 예를 들어, `local[4]`는 4개의 코어를 사용하여 동작하며, 이는 Executor가 4개의 스레드를 갖는다는 것을 의미합니다.
      - `local[*]`는 컴퓨터에 있는 모든 코어를 사용하여 동작함을 나타냅니다.

    **용도:**
    - 작은 규모의 데이터나 단일 머신에서의 테스트 및 개발 시에 활용됩니다.
    - 병렬 처리가 필요한데 클러스터 구성이나 대규모 데이터가 필요하지 않은 경우에 유용합니다.
    - 스레드 수를 조절하여 성능 튜닝이 가능하며, 단일 머신의 자원을 최대한 활용할 수 있습니다.
  2. YARN:
    • 두 가지 실행 모드: YARN 환경에서 Spark 애플리케이션을 실행할 때는 두 가지 실행 모드를 선택할 수 있습니다: Client 모드와 Cluster 모드.
    Client 모드:
    • 설명: Spark 애플리케이션의 Driver가 Spark 클러스터 외부에서 동작하는 모드입니다.
    • 용도:
      • YARN 기반 Spark 클러스터를 기반으로 개발 및 테스트를 수행할 때 사용됩니다.
      • 개발자가 로컬 머신에서 애플리케이션을 실행하고, 클러스터 리소스를 활용하는 방식으로 사용됩니다.
    Cluster 모드:
    • 설명: Spark 애플리케이션의 Driver가 Spark 클러스터 내부에서 동작하는 모드입니다.
    • 특징:
      • 하나의 YARN Container 슬롯을 차지하며, 클러스터 내부에서 실행됩니다.
      • 실제 프로덕션 운영에 사용되는 모드로, 클러스터의 리소스를 효과적으로 활용할 수 있습니다.
    용도:
    • 클러스터에서 대규모의 데이터를 처리하거나 실제 운영 환경에서 Spark 애플리케이션을 실행할 때 사용됩니다.
    • 리소스 매니저에 의해 할당된 컨테이너 내에서 애플리케이션이 실행되므로 클러스터의 전체 자원을 효과적으로 활용할 수 있습니다.

  3. **Kubernetes:**
    - **설명:** Kubernetes 컨테이너 오케스트레이션 플랫폼을 사용하는 클러스터 매니저 옵션으로, 컨테이너화된 Spark 애플리케이션을 실행합니다.
    - **용도:** 컨테이너 기반의 마이크로서비스 아키텍처에서 Spark 애플리케이션을 실행하거나, Kubernetes를 활용한 클러스터 관리가 필요한 경우 사용됩니다.

  4. **Mesos:**
    - **설명:** Apache Mesos를 클러스터 매니저로 사용하는 옵션으로, 자원 관리 및 분산 시스템에서 Spark 애플리케이션을 실행합니다.
    - **용도:** Mesos 클러스터에서 Spark를 실행하거나, Mesos를 활용하여 리소스 동적 할당이 필요한 경우 사용됨

  5. **Standalone:**
    - **설명:** Spark 자체적으로 제공하는 클러스터 매니저로, 스파크가 내부적으로 클러스터 매니징을 수행하는 옵션
    - **용도:** 작은 규모의 클러스터에서 간단한 분산 처리를 위해 Spark 자체적인 클러스터 매니저를 사용할 때 사용됨

요약

  1. 하둡 등장:** 빅데이터 처리를 위해 오픈소스인 하둡이 등장하였으며, 이는 분산 파일 시스템과 분산 컴퓨팅 시스템으로 구성되어 있습니다. 주요 구성 요소로는 HDFS와 맵리듀스/YARN이 있습니다.

  2. 맵리듀스 제약:** 맵리듀스 프로그래밍의 제약으로 SQL이 다시 부각되었습니다.

  3. Spark 대세:** Spark는 대용량 데이터 분산 컴퓨팅 기술로, Pandas와 Scikit Learn의 스테로이드 버전이라 할 수 있습니다. 또한, SQL과 스트림 데이터, 그래프 처리도 제공하며 현재 대세로 자리 잡고 있습니다.

 

'하둡,spark' 카테고리의 다른 글

spark 데이터 구조  (0) 2024.01.19
spark 데이터 처리  (0) 2024.01.18
spark 기초  (0) 2024.01.18
맵리듀스(MapReduce) 문제점  (0) 2024.01.18
하둡 설치 +맵리듀스(wordcount) 실습  (0) 2024.01.18

spark 등장

  1. 버클리 대학의 AMPLab에서 아파치 오픈소스 프로젝트로 2013년 시작
  2. 나중에 Databricks라는 스타트업 창업
  3. 하둡의 뒤를 잇는 2세대 빅데이터 기술
    1) YARN등을 분산환경으로 사용
    2) Scala로 작성됨
  4. 빅데이터 처리 관련 *다양한* 기능 제공

spark 3.0의 구성

  1.  **Spark Core:**
       - Apache Spark의 핵심 엔진으로, 분산 데이터 처리의 기본 기능을 담당합니다.
       - 클러스터에서 데이터를 로딩하고, 분산 데이터셋을 생성하며, 다양한 연산 및 변환을 수행하는 데 사용됩니다.

  2.  **Spark SQL:**
       - 구조화된 데이터 처리를 위한 모듈로, SQL 쿼리를 사용하여 데이터에 대한 쿼리 및 분석을 수행합니다.
       - Hive 쿼리 및 데이터 프레임 API를 지원하여 SQL을 사용하여 대화식으로 데이터를 다룰 수 있습니다.

  3.  **Spark ML / Spark MLlib:**
       - 머신러닝을 위한 라이브러리로, Spark MLlib은 고전적인 머신러닝 알고리즘과 기계 학습 파이프라인을 제공
       - Spark ML은 DataFrame API를 기반으로 한 머신러닝 라이브러리로, 풍부한 기능을 제공하며 머신러닝 모델의 구축과 평가를 지원합니다.

  4.  **Spark Streaming:**
       - 실시간 데이터 스트림 처리를 지원하는 모듈로, 초당 수천 개의 이벤트를 처리할 수 있습니다.
       - 스트리밍 데이터에 대한 윈도우 기반의 연산 및 처리를 제공하여 실시간으로 결과를 생성합니다.

  5.  **Spark GraphX:**
       - 그래프 처리를 위한 라이브러리로, 복잡한 그래프 알고리즘을 처리할 수 있습니다.
       - 그래프 구조를 다루며, 그래프 상의 연산 및 알고리즘을 제공하여 소셜 네트워크 분석 등 다양한 그래프 기반 작업

주로 하둡과 kubernetes가 쓰인다.

 

Spark vs. MapReduce

  1.  **Spark은 기본적으로 메모리 기반:**
       - Spark은 데이터를 메모리에 캐싱하여 빠른 데이터 처리를 가능케 합니다.
       - 메모리 부족 시에는 디스크를 사용하므로 MapReduce에 비해 성능이 향상될 수 있습니다.

  2.  **MapReduce는 디스크 기반:**
       - MapReduce는 대부분의 데이터를 디스크에 저장하고 읽어오기 때문에 IO 오버헤드가 발생할 수 있습니다.
       - 디스크를 주로 활용하기 때문에 상대적으로 처리 속도가 느릴 수 있습니다.

  3.  **MapReduce는 하둡(YARN)위에서만 동작:**
       - MapReduce는 주로 하둡 클러스터의 YARN 위에서 동작합니다.
       - Spark은 하둡의 YARN 외에도 Mesos, Kubernetes와 같은 다른 분산 컴퓨팅 환경에서도 실행될 수 있습니다.

  4.  **Spark은 판다스 데이터프레임과 개념적으로 동일한 데이터 구조 지원:**
       - Spark는 DataFrame API를 통해 데이터를 처리하며, 이는 판다스 데이터프레임과 유사한 구조를 가지고 있습니다.
       - MapReduce는 키-값 쌍의 형태로 데이터를 처리하는데 비해, Spark은 풍부한 데이터 구조를 지원하여 다양한 데이터 처리 작업을 수행할 수 있습니다.

  5.  **Spark은 다양한 방식의 컴퓨팅을 지원:**
       - Spark은 배치 데이터 처리, 스트리밍 데이터 처리, SQL 쿼리, 머신 러닝, 그래프 분석 등 다양한 컴퓨팅 모델을지원
       - MapReduce는 주로 대용량 데이터의 배치 처리에 적합한데 반해, Spark은 다양한 작업에 유연하게 대응

Spark 프로그래밍 API

  • **RDD (Resilient Distributed Dataset):**
    - **로우레벨 프로그래밍 API:** RDD는 Apache Spark의 핵심 데이터 구조로, 분산된 클러스터에서 데이터를 나타냅니다. 이는 높은 수준의 추상화를 제공하지 않고, 개발자에게 세밀한 제어를 허용합니다.
    - **세밀한 제어 가능:** RDD를 사용하면 데이터의 파티션을 직접 제어하고, 변환 및 액션을 수행할 수 있습니다. 하지만 이로 인해 코딩의 복잡도가 증가할 수 있습니다.

  • **DataFrame & Dataset:**
    - rdd 대비 하이레벨 프로그래밍 API인 DataFrame 및 Dataset은 RDD보다 더 높은 수준의 추상화를 제공하는 API로, 구조화된 데이터를 처리하는 데 특화되어 있습니다.
    - **구조화 데이터 조작:** 판다스의 데이터프레임과 유사한 인터페이스를 제공하며, SQL과 유사한 쿼리를 사용하여 데이터를 처리할 수 있습니다.
    - **Spark SQL 사용 추세:** 많은 사용자들이 구조화된 데이터를 다루기 위해 Spark SQL을 사용하며, DataFrame/Dataset API를 선호합니다.
    - **DataFrame/Dataset이 필요한 경우는?
      - ML 피쳐 엔지니어링이나 Spark ML을 사용하는 경우에는 DataFrame/Dataset이 더 편리할 수 있습니다.
      - SQL로는 수행하기 어려운 복잡한 데이터 조작이 필요한 경우에도 유용합니다.

    최근에는 DataFrame 및 Dataset을 활용한 데이터 처리가 증가하고 있으며, 세밀한 제어가 필요한 경우에는 여전히 RDD를 사용할 수 있습니다.

Spark SQL

  • 구조화된 데이터 처리를 SQL로 처리:** Spark SQL은 구조화된 데이터를 다루기 위한 모듈로, SQL 쿼리를 사용하여 데이터를 처리할 수 있습니다.

  • 데이터프레임을 SQL로 처리 가능:
      - 데이터프레임은 테이블처럼 SQL로 처리할 수 있습니다.
      - 판다스와 비슷한 기능을 제공하여 데이터를 SQL 쿼리로 조작할 수 있습니다.

  • Hive 쿼리보다 최대 100배까지 빠른 성능을 보장:
      - Spark SQL은 Hive 쿼리에 비해 최대 100배까지 빠른 성능을 제공한다고 알려져 있습니다.
      - Hive가 디스크에서 데이터를 읽어오는 방식에 비해, Spark는 메모리에서 데이터를 읽어오는 방식을 채택하여 성능 향상을 이루었습니다.

  • 실제로는 그렇지 않음:
      - 사실은 Hive도 최근 버전에서는 메모리를 사용하여 성능을 향상시키고 있습니다.
      - Spark는 기본적으로 메모리를 활용하지만, 큰 데이터셋의 경우 디스크를 활용하기도 합니다.
      - Presto와 같은 다른 분산 쿼리 엔진들도 메모리와 디스크를 적절히 조합하여 성능을 극대화하려고 합니다.
      - 세 방식 모두 비슷한 방식, 비슷한 기능으로 가고 있음

 Spark ML

  • 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리:**
      - Spark ML은 Spark의 머신러닝 라이브러리로, 다양한 머신러닝 알고리즘과 유틸리티로 구성되어 있습니다.
      - Classification, Regression, Clustering, Collaborative Filtering 등 다양한 머신러닝 작업을 지원합니다.

  • 전체 리스트는 링크 참고. 딥러닝 지원은 미약:**
      - Spark ML의 머신러닝 알고리즘 및 기능은 계속해서 업데이트되고 있습니다.
      - 딥러닝 지원은 현재로서는 미약하지만, 라이브러리의 발전에 따라 향후 지원이 강화될 수 있습니다.

  • RDD 기반과 데이터프레임 기반의 두 버전이 존재:**
      - `spark.mllib`와 `spark.ml` 두 가지 버전이 존재합니다.
      - `spark.mllib`는 RDD 기반에서 동작하는 이전 버전의 머신러닝 라이브러리로 더 이상 업데이트되지 않음
      - 이제 `spark.ml`이 대세. 데이터프레임 기반에서 동작하며, 최신 기능과 개선된 API를 제공. 
      - `import pyspark.ml`를 사용하여 `spark.ml` 모듈을 가져와야 한다.

    Spark ML의 데이터프레임 기반 버전은 더 간편하고 효율적인 API를 제공하며, RDD 기반 버전은 호환성 유지를 위해 여전히 사용 가능하지만, 더 이상의 업데이트가 이루어지지 않습니다.

 

Spark ML의 장점

  1. **원스톱 ML 프레임웍:**
       - **데이터프레임과 SparkSQL을 이용한 전처리:** Spark ML은 데이터프레임과 SparkSQL을 이용하여 데이터의 전처리를 편리하게 수행할 수 있습니다. 구조화된 데이터를 다루는 강력한 도구들을 제공합니다.
       - **Spark ML을 이용한 모델 빌딩:** 머신러닝 모델의 빌딩을 위해 다양한 알고리즘과 기능을 제공하며, 간단한 API를 통해 사용자 친화적으로 모델을 개발할 수 있습니다.
       - **ML Pipeline을 통한 모델 빌딩 자동화:** ML Pipeline은 여러 단계의 데이터 처리 및 모델 학습 단계를 효과적으로 관리하고 자동화하는데 사용됩니다.

  2.  **MLflow로 모델 관리하고 서빙 (MLOps):**
       - **MLflow를 통한 모델 관리:** MLflow는 모델의 라이프사이클을 관리하고 추적할 수 있는 플랫폼을 제공합니다. 실험 및 모델 버전 관리를 손쉽게 수행할 수 있습니다.
       - **서빙 (MLOps):** MLflow를 사용하여 모델 서빙을 구축하고 관리할 수 있습니다. 이는 MLOps (Machine Learning Operations)의 한 부분으로 모델을 프로덕션 환경에 효과적으로 배포하고 관리하는 것을 의미합니다.

  3. **대용량 데이터도 처리 가능:**
       - Spark는 대용량의 데이터를 효과적으로 처리할 수 있는 분산 컴퓨팅 프레임워크이며, Spark ML은 이를 기반으로 머신러닝 모델을 처리할 수 있습니다.
       - 클러스터 환경에서 병렬 처리를 통해 대용량의 데이터를 효율적으로 다룰 수 있으며, 성능과 확장성 면에서 강력한 기능을 제공합니다.

Spark 데이터 시스템 사용 예

  1. 대용량 비구조화된 데이터 처리 (ETL 혹은 ELT):**
       - 시나리오:** 대용량의 비구조화된 데이터를 추출(Extract), 변환(Transform), 적재(Load)하는 ETL 또는 ELT 프로세스를 구축할 때 사용될 수 있습니다.
       - 예시:** 로그 데이터, 웹 클릭 데이터, 센서 데이터 등의 비구조화된 데이터를 Spark를 사용하여 처리하고, 구조화된 형태로 변환하여 데이터 웨어하우스에 적재합니다.
  2. ML 모델에 사용되는 대용량 피쳐 처리 (배치/스트림):**
       - 시나리오:** 머신러닝 모델의 학습을 위해 대용량의 피쳐 데이터를 처리하고 추출하는 작업이 필요할 때 사용됨
       - 예시:** 사용자 행동 데이터, 이미지 데이터, 텍스트 데이터 등 다양한 형태의 데이터를 Spark를 사용하여 전처리하고 모델에 사용 가능한 형태로 변환합니다.(사용자가 들어오면 그 사용자의 데이터로 분석해 추천 강의 띄움)
  3. Spark ML을 이용한 대용량 훈련 데이터 모델 학습:**
       - 시나리오:** 대규모 데이터셋을 사용하여 머신러닝 모델을 훈련하고 학습시키는 작업을 수행할 때 사용될 수 있다.
       - 예시:** Spark ML의 기능을 활용하여 분산 환경에서 대용량의 데이터로부터 머신러닝 모델을 학습시키는 작업을 수행합니다. 클러스터 환경에서 분산 처리를 통해 높은 확장성을 제공합니다.

    이러한 예시들은 Spark를 사용하여 다양한 데이터 처리 및 분석 작업을 수행하는데 활용할 수 있는 일부 시나리오입니다. Spark는 배치 처리, 스트림 처리, 머신러닝 등의 다양한 기능을 통합하여 대용량의 데이터를 효과적으로 다루는 데 도움을 줍니다.

'하둡,spark' 카테고리의 다른 글

spark 데이터 처리  (0) 2024.01.18
Spark 프로그램 실행 환경  (0) 2024.01.18
맵리듀스(MapReduce) 문제점  (0) 2024.01.18
하둡 설치 +맵리듀스(wordcount) 실습  (0) 2024.01.18
MapReduce(맵리듀스) 프로그래밍  (0) 2024.01.17

1. 맵리듀스 프로그래밍 문제점

  1. **생산성이 떨어짐. 데이터 모델과 오퍼레이션에 제약이 많음:**
       - **제한된 프로그래밍 모델:** MapReduce는 간단하고 병렬화하기 쉽지만, 일부 복잡한 문제에 대한 표현력이 제한되어 있습니다. 일부 알고리즘은 MapReduce로 표현하기 어려울 수 있습니다.
       - **데이터 모델 제약:** 기본적으로 Key-Value 쌍에 기반한 데이터 모델을 사용하며, 이는 모든 문제에 적합하지 않을 수 있습니다.

  2. **모든 입출력이 디스크를 통해 이뤄짐:**
       - **입출력 오버헤드:** MapReduce는 중간 결과를 디스크에 저장하고, 그 결과를 다시 읽어와서 처리하는 방식을 사용합니다. 이로 인해 디스크 I/O 오버헤드가 발생할 수 있습니다.
       - **성능 저하:** 대용량 데이터셋의 경우 디스크 입출력이 성능에 영향을 미칠 수 있으며, 메모리에 적재된 데이터를 처리하는 방식이 아니기 때문에 성능 저하가 발생할 수 있습니다.

  3.  **Shuffling 이후에 Data Skew가 발생하기 쉬움:**
       - **데이터 불균형:** Shuffling 단계에서 데이터가 노드 간에 이동할 때 데이터 불균형이 발생할 수 있습니다. 일부 키는 다른 키보다 더 많은 데이터를 생성할 수 있으며, 이는 처리 시간을 늘릴 수 있습니다.
       - **일부 태스크가 지연될 수 있음:** 데이터 불균형으로 인해 일부 리듀스 태스크가 다른 태스크에 비해 지연되는 현상이 발생할 수 있습니다.

  4.  **Reduce 태스크 수를 개발자가 지정해주어야 함:**
       - **타당한 태스크 수 설정 어려움:** Reduce 태스크 수를 지정하는 것은 어려울 수 있습니다. 너무 적은 태스크 수는 병렬성을 떨어뜨리고, 너무 많은 태스크 수는 오버헤드를 유발할 수 있습니다.

    이러한 문제점은 빅데이터 처리에 대한 새로운 접근 방식과 프레임워크의 개발로 극복되고 있습니다. Apache Spark와 같은 프레임워크는 이러한 제한을 극복하고 성능을 개선하기 위해 메모리 기반의 데이터 처리 및 다양한 프로그래밍 모델을 제공합니다.

+빨간부분 : Data Skew

결론 : spark 추천

'하둡,spark' 카테고리의 다른 글

Spark 프로그램 실행 환경  (0) 2024.01.18
spark 기초  (0) 2024.01.18
하둡 설치 +맵리듀스(wordcount) 실습  (0) 2024.01.18
MapReduce(맵리듀스) 프로그래밍  (0) 2024.01.17
YARN  (0) 2024.01.16

 

하둡(Hadoop)은 대용량 데이터를 처리하기 위한 오픈 소스 분산 컴퓨팅 프레임워크입니다. 아래는 간단한 가이드라인을 제공하여 Ubuntu 리눅스 서버에 Hadoop 3.0을 의사분산 모드로 설치하는 방법입니다. 주어진 정보를 기반으로 설치를 진행해보세요.
(더 자세한건 : https://github.com/apache/hadoop)

**준비 사항:**
1) AWS 계정 및 EC2 인스턴스 (t2.medium) 보유.
2) Ubuntu 서버에 자바 8 설치.

1. 우분투 어카운트에 로그인( AWS 계정 및 EC2 인스턴스 계정)


2. Ubuntu 서버에 자바 8 설치:**

 

  • ```bash
    sudo apt update
    sudo apt install openjdk-8-jdk-headless
    #유저추가
    sudo adduser hdoop
    su - hdoopssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    # 생성된 공개 키를 authorized_keys 파일에 추가합니다.
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    # authorized_keys 파일에 대한 권한을 설정하여 소유자에게 읽기 및 쓰기 권한만 부여
    chmod 0600 ~/.ssh/authorized_keys
    ```
    # pw 없게 로그인 되게 설정
    # RSA 알고리즘을 사용하여 SSH 키를 생성하고, -P 옵션을 이용하여 암호를 빈 문자열(암호없음)로 설정합니다.



3. Hadoop 다운로드 및 설치:**

 

4. Hadoop 환경 설정:*

 

  • # 로그인시마다 실행되는 파일 설정추가
    vi .bashrc

v

  • # 방금 설정한 설정 적용
    source .bashrc

  • # 마스터 환경설정 파일 접속후 설정 변경
    vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

 

  • # 내임노드 관련 정보가 들어가는 파일, 수정
    vi $HADOOP_HOME/etc/hadoop/core-site.xml
    <configuration>
      <!-- 임시 디렉터리 설정 -->
      <property>
        <!-- 하둡이 사용하는 임시 디렉터리의 이름을 지정합니다. -->
        <name>hadoop.tmp.dir</name>
        <!-- 임시 디렉터리의 경로를 지정합니다. -->
        <value>/home/hdoop/tmpdata</value>
      </property>

      <!-- 하둡 분산 파일 시스템 (HDFS) 설정 -->
      <property>
        <!-- HDFS의 기본 이름을 지정합니다. -->
        <name>fs.default.name</name>
        <!-- 기본 HDFS 인스턴스의 주소 및 포트를 지정합니다. -->
        <value>hdfs://127.0.0.1:9000</value>
      </property>
    </configuration>
  • # Hadoop의 추가적인 설정을 정의, replication 요소를 1로 추가, 설정추가
    vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
    <!-- Hadoop Configuration File -->
    <configuration>
      <!-- Hadoop NameNode 데이터 디렉터리 설정 -->
      <property>
        <!-- NameNode가 사용하는 데이터 디렉터리의 이름을 지정합니다. -->
        <name>dfs.data.dir</name>
        <!-- NameNode 데이터 디렉터리의 경로를 지정합니다. -->
        <value>/home/hdoop/dfsdata/namenode</value>
      </property>

      <!-- Hadoop DataNode 데이터 디렉터리 설정 -->
      <property>
        <!-- DataNode가 사용하는 데이터 디렉터리의 이름을 지정합니다. -->
        <name>dfs.data.dir</name>
        <!-- DataNode 데이터 디렉터리의 경로를 지정합니다. -->
        <value>/home/hdoop/dfsdata/datanode</value>
      </property>

      <!-- HDFS 복제 팩터(Replication Factor) 설정 -->
      <property>
        <!-- 파일의 복제본 수를 지정합니다. -->
        <name>dfs.replication</name>
        <!-- 파일의 단일 복제본을 사용하도록 설정합니다. -->
        <value>1</value>
      </property>
    </configuration>


  • # Hadoop MapReduce 프레임워크에서 사용할 프레임워크의 yarn을 지정
    vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
    <!-- Hadoop Configuration File -->
    <configuration>
      <!-- MapReduce 프레임워크 설정 -->
      <property>
        <!-- 사용할 MapReduce 프레임워크의 이름을 지정합니다. -->
        <name>mapreduce.framework.name</name>
        <!-- YARN (Yet Another Resource Negotiator)을 사용하도록 설정합니다. -->
        <value>yarn</value>
      </property>
    </configuration>

  • # YARN(Yet Another Resource Negotiator)의 여러 설정을 정의
    vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
    <configuration>
      <!-- YARN 노드 매니저의 보조 서비스 설정 -->
      <property>
        <!-- 노드 매니저가 사용할 보조 서비스의 이름을 지정합니다. -->
        <name>yarn.nodemanager.aux-services</name>
        <!-- 맵리듀스 셔플을 사용하도록 설정합니다. -->
        <value>mapreduce_shuffle</value>
      </property>

      <!-- 맵리듀스 셔플 보조 서비스 클래스 설정 -->
      <property>
        <!-- 맵리듀스 셔플 보조 서비스의 클래스를 지정합니다. -->
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <!-- 맵리듀스 셔플 핸들러 클래스를 설정합니다. -->
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
      </property>

      <!-- YARN 리소스 매니저 호스트 설정 -->
      <property>
        <!-- YARN 리소스 매니저의 호스트 이름을 지정합니다. -->
        <name>yarn.resourcemanager.hostname</name>
        <!-- 로컬 호스트를 사용하도록 설정합니다. -->
        <value>localhost</value>
      </property>

      <!-- YARN ACL 활성화 설정 -->
      <property>
        <!-- YARN ACL을 활성화 또는 비활성화합니다. -->
        <name>yarn.acl.enable</name>
        <!-- ACL을 비활성화하도록 설정합니다. -->
        <value>0</value>
      </property>

      <!-- 노드 매니저 환경 변수 화이트리스트 설정 -->
      <property>
        <!-- 노드 매니저가 허용하는 환경 변수의 화이트리스트를 지정합니다. -->
        <name>yarn.nodemanager.env-whitelist</name>
        <!-- 허용된 환경 변수 목록을 지정합니다. -->
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PERPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
      </property>

    </configuration>

5. hdfs실행, yarn 실행

  • # 초기화
    hdfs namenode -format

  • # 디렉토리 이동
    cd hadoop-3.3.4/sbin/

  • #HDFS를 시작
    ./start-dfs.sh

  • #yarn을 시작
    ./start-yarn.sh

  • #exit 로 우분투로 나와서, Ubuntu 또는 Debian 기반 시스템에서 OpenJDK 8의 headless(그래픽 사용자 인터페이스 없음) 버전 설치, (GUI) 기능이 없는 환경에서 Java 애플리케이션을 실행하는 데 사용됨
    exit
    sudo apt install openjdk-8-jdk-headless

  • #하둡 계정으로 다시 접근 
    su - hdoop

  • #어떤 자바 프로그램이 돌고 있는지 봄
    jps


6. 하둡 실행

  • ```bash
    # Hadoop 포맷
    bin/hdfs namenode -format

    # Hadoop 시작
    sbin/start-dfs.sh
    ```

    웹 브라우저에서 `http://localhost:9870`으로 접속하여 Hadoop 관리자 페이지 확인.

 

7. 맵리듀스 실행 실습

  • #하둡 폴더로 이동
    cd hadoop-3.3.4/

    #유저 생성
    bin/hdfs dfs dfs -mkdir /user

    # /hdoop 폴더 제작
    bin/hdfs dfs dfs -mkdir /user/hdoop

    # input폴더 만듦
    bin/hdfs dfs dfs -mkdir input

    # words.txt 제작후 분석할 내용 입력
    vi words.txt
    the brave yellow lion the lion ate the cow now the lion is happy

  • 로컬 파일 시스템에 있는 words.txt 파일을 Hadoop 분산 파일 시스템 (HDFS)의 input 디렉토리로 복사
    bin/hdfs dfs -put words.txt input

  • Hadoop 클러스터에서 WordCount 예제가 실행되어 입력 데이터에서 각 단어의 출현 빈도를 계산하고 output에 저장
    bin/hadoop jar shqre/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount input output 
    + bin/hadoop: Hadoop 명령어를 실행 / jar: JAR 파일을 실행 / 실행할 JAR 파일의 경로/ 실행할 Java 클래스인 wordcount / 입력 데이터가 위치한 HDFS의 경로/  출력 결과를 저장할 HDFS의 경로
  • bin/hdfs dfs -ls output
    출력물 리스트 보기

  • #출력물에서 하나 선택
    bin/hdfs dfs -cat output/part-r-00000

 

'하둡,spark' 카테고리의 다른 글

spark 기초  (0) 2024.01.18
맵리듀스(MapReduce) 문제점  (0) 2024.01.18
MapReduce(맵리듀스) 프로그래밍  (0) 2024.01.17
YARN  (0) 2024.01.16
하둡 기초  (0) 2024.01.15

맵리듀스(MapReduce) 프로그래밍의 특징

  1. **불변성 데이터 셋:**
       - 맵리듀스에서는 데이터 셋이 Key-Value 쌍의 집합으로 구성되며, 이 데이터 셋은 변경 불가능한(immutable) 특성을 가집니다. 즉, 한 번 생성된 데이터는 수정이 불가능하며 새로운 데이터를 생성해야 합니다. 이는 데이터 일관성을 유지하고 분산 처리를 간편하게 만듭니다.

  2. **Map과 Reduce 오퍼레이션:**
       - 데이터 조작은 맵(Map)과 리듀스(Reduce) 두 개의 기본 오퍼레이션으로 이루어집니다.
       - **맵 오퍼레이션:** 입력 데이터의 각 요소에 대해 사용자가 정의한 함수(map 함수)를 적용하여 Key-Value 쌍을 생성합니다. 각 입력 데이터는 독립적으로 처리됩니다.
       - **리듀스 오퍼레이션:** 맵 오퍼레이션의 결과로 생성된 Key-Value 쌍을 그룹화하고 사용자가 정의한 함수(reduce 함수)를 적용하여 최종 결과를 생성합니다. 리듀스 단계에서는 여러 맵 결과가 하나의 결과로 합쳐지는 과정이 발생합니다.

  3. **연속적인 실행:**
       - 맵리듀스에서는 맵과 리듀스 오퍼레이션이 항상 하나의 쌍으로 연속적으로 실행됩니다. 맵의 결과가 리듀스로 전달되어 처리되는 방식으로 동작합니다.
       - 이러한 연속적인 실행은 데이터 처리 과정을 단순화하고, 병렬 처리를 쉽게 수행할 수 있도록 도와줍니다.

  4. **맵 결과를 리듀스로 셔플링:**
     - 맵리듀스 시스템은 맵 단계에서 생성된 결과를 리듀스로 셔플링(shuffling)합니다. 이 단계에서는 네트워크를 통해 데이터가 이동하게 되며, 각 리듀스 작업이 필요로 하는 맵의 출력을 수집하게 됩니다.
    - 셔플링은 데이터를 그룹화하고 필요한 리듀스 작업에 전달하는 중요한 단계로, 전체 작업의 성능에 영향을 미침

 

맵리듀스 방식의 코딩의 예

  • 맵리듀스 프로그래밍은 대용량의 데이터에서 분산 병렬 처리를 효과적으로 수행하는 데에 활용됩니다. 여기에서는 대표적인 예제 중 하나인 로그 분석을 통한 사용자 행동 추적을 통해 맵리듀스가 어떻게 활용될 수 있는지를 설명하겠습니다.
**목표:**
- 대량의 로그 데이터에서 특정 이벤트의 발생 횟수를 계산하여 사용자 행동을 추적한다.

**맵 단계 (Map Phase):**
1. **Input:** 대량의 로그 데이터 (로그당 한 줄씩)
2. **Map 함수:** 각 로그에서 특정 이벤트의 발생 여부를 체크하고, 발생했다면 해당 이벤트에 대한 Key-Value 쌍을 생성 (예: `(사용자ID, 1)`).
3. **Output:** 특정 이벤트가 발생한 로그들에 대한 Key-Value 쌍

```python
# 맵 함수 예제 (파이썬)
def map_function(log_line):
    if '특정 이벤트 발생' in log_line:
        user_id = extract_user_id(log_line)
        return [(user_id, 1)]
    else:
        return []
```

**셔플링 (Shuffling):**
- Map 함수에서 생성된 (사용자ID, 1)의 쌍들이 리듀스 단계로 전달되기 위해 셔플링됨.

**리듀스 단계 (Reduce Phase):**
1. **Input:** 셔플링된 (사용자ID, 1) 쌍들
2. **Reduce 함수:** 동일한 사용자ID를 가진 모든 쌍들의 값을 합산하여 해당 사용자의 특정 이벤트 발생 횟수를 계산.
3. **Output:** (사용자ID, 특정 이벤트 발생 횟수)의 쌍들.

```python
# 리듀스 함수 예제 (파이썬)
def reduce_function(user_id, counts):
    total_count = sum(counts)
    return (user_id, total_count)
```

이렇게 맵리듀스를 사용하여 로그 데이터를 처리하면 대규모 데이터 세트에서도 효과적으로 특정 이벤트의 발생 횟수를 계산할 수 있습니다. 각각의 로그를 독립적으로 맵 함수에서 처리하고, 그 결과를 리듀스 함수에서 집계함으로써 분산 처리와 병렬 처리가 이루어집니다. 이를 통해 대규모 데이터에 대한 효율적인 분석 및 통계를 수행할 수 있습니다.

 

맵리듀스 프로그래밍

  • 이것은 맵리듀스 프로그래밍의 기본적인 동작을 나타내는 설명입니다. 여기에서는 Map 단계와 Reduce 단계에 대한 개념을 설명하겠습니다.

    **Map 단계:**
    - **입력:** Hadoop Distributed File System (HDFS)에 저장된 파일로부터 시스템에 의해 주어진다.
    - **작업:** 각각의 (k, v) 쌍은 Map 함수에 의해 처리된다. Map 함수는 각 (k, v) 쌍을 새로운 키, 밸류 쌍의 리스트로 변환한다.
    - **출력:** 변환된 리스트는 출력으로 사용되며, 각각의 새로운 (k', v') 쌍은 Hadoop 시스템에 의해 적절한 방식으로 처리된다.

    **Reduce 단계:**
    - **입력:** 맵 단계의 출력 중에서 동일한 키를 가진 키/밸류 페어들은 시스템에 의해 묶여 Reduce 함수에 전달된다.
    - **작업:** Reduce 함수는 동일한 키를 가진 키/밸류 페어들의 밸류를 리스트로 받아들이고, 이를 새로운 키, 밸류 쌍으로 변환한다. 이 과정은 SQL에서의 GROUP BY와 유사하다.
    - **출력:** 변환된 (k'', v'') 쌍은 HDFS에 저장되어 전체 작업의 최종 결과를 형성한다.

    이렇게 MapReduce는 대용량 데이터를 분산하여 처리할 수 있는 프로그래밍 모델로, 각각의 맵과 리듀스 함수가 독립적으로 실행되어 데이터를 처리하고 집계합니다. 이를 통해 대규모 데이터셋에서 효과적인 분산 병렬 처리를 달성할 수 있습니다.

 

워드 카운트(MapReduce 프로그램 동작 예시)

맵리듀스 프로그래밍의 전형적인 예시 중 하나는 워드 카운트(Word Count)입니다. 이 예제에서는 대량의 텍스트 문서에서 각 단어의 출현 횟수를 계산하는 간단한 맵리듀스 작업을 수행합니다.

1. **맵 단계 (Map Phase):**
   - **Input:** 텍스트 문서들
   - **Map 함수:** 각 문서에서 단어를 추출하고, 각 단어에 대해 1이라는 값을 부여한 Key-Value 쌍을 생성
   - **Output:** (단어, 1)의 쌍들

```python
# 맵 함수 예제 (파이썬)
def map_function(document):
    words = document.split()
    word_count_pairs = [(word, 1) for word in words]
    return word_count_pairs
```

2. **셔플링 (Shuffling):**
   - 맵 함수에서 생성된 (단어, 1)의 쌍들이 리듀스 단계로 전달되기 위해 셔플링됩니다. 동일한 단어를 가진 쌍들이 같은 리듀스 작업으로 전송됩니다.

3. **리듀스 단계 (Reduce Phase):**
   - **Input:** 셔플링된 (단어, 1) 쌍들
   - **Reduce 함수:** 동일한 단어를 가진 모든 쌍들의 값을 합산하여 해당 단어의 총 출현 횟수를 계산
   - **Output:** (단어, 총 출현 횟수)의 쌍들

```python
# 리듀스 함수 예제 (파이썬)
def reduce_function(word, counts):
    total_count = sum(counts)
    return (word, total_count)
```

이 예제에서는 각 단어의 출현 횟수를 계산하기 위해 맵 함수에서 1이라는 값을 부여하고, 리듀스 함수에서 해당 단어의 총 출현 횟수를 합산합니다. 이러한 맵리듀스 프로그램을 실행하면 대량의 텍스트 문서에서 각 단어의 출현 횟수를 효과적으로 계산할 수 있습니다.

실제 맵리듀스 프로그래밍에서는 맵과 리듀스 함수를 작성하고, 맵리듀스 프레임워크 (예: Apache Hadoop)를 사용하여 클러스터에서 분산 처리를 수행합니다.

 

같은 키를 갖는 레코드들을 하나로 묶음

Shuffling (셔플링):

  1. **데이터 그룹화 (Data Grouping):** Mapper의 출력은 특정 키를 기준으로 여러 개의 그룹으로 나누어집니다. 이 과정에서 동일한 키를 가진 데이터가 같은 그룹에 속하게 됩니다.

  2. **파티셔닝 (Partitioning):** 그룹화된 데이터는 여러 파티션으로 나뉘어져 각각의 리듀스 태스크에 할당됩니다. 각 파티션은 리듀스 태스크로 전송될 것입니다.

  3. **정렬 (Sorting):** 파티션 내에서 키를 기반으로 정렬이 수행됩니다. 이로써 리듀스 태스크가 받는 입력 데이터가 키 순서대로 정렬되게 됩니다.

  4. **복사 (Copying):** 정렬된 데이터는 네트워크를 통해 복사되어 실제로 리듀스 노드로 이동합니다. 이 단계에서는 데이터의 크기와 네트워크 대역폭이 중요한 역할을 합니다. 크기가 크면 네트워크 병목현상을 초래한다.

Sorting (정렬):

  • - **키를 기반으로 정렬:** Shuffling 중에는 주로 키를 기반으로 데이터가 정렬됩니다. 이로써 리듀스 태스크는 정렬된 순서대로 데이터를 처리할 수 있게 됩니다.

  • - **입력 데이터 정렬:** 일반적으로 리듀스 태스크에 전달되는 입력 데이터는 키를 기준으로 정렬되어야 합니다. 이는 리듀스 함수가 효과적으로 동작하게 하기 위함입니다.

  • Shuffling과 Sorting은 데이터 처리의 효율성과 성능에 큰 영향을 미치는 단계이며, 특히 대용량의 데이터를 처리할 때 이러한 단계를 최적화하는 것이 중요합니다.

 

맵리듀스에서 생기는 data skew

  1. **데이터 크기 불균형의 문제:**
       - MapReduce 작업에서 각각의 Map 또는 Reduce 태스크가 처리하는 데이터 크기에 불균형이 발생하는 경우가 있습니다.
       - 특히, Reducer로 전송되는 데이터 크기에 큰 차이가 있을 수 있으며, 이는 Group By, Join 등의 작업에서 특히 두드러집니다.

  2.  **병렬 처리의 한계:**
       - 불균형한 데이터 크기로 인해 각 태스크의 작업 속도가 차이가 나면, 병렬 처리의 이점을 충분히 활용하기 어려워집니다.
       - 전체 작업의 속도는 가장 느린 태스크에 의해 결정되므로 일부 태스크가 과도한 데이터를 처리해야 할 경우 작업 전체가 느려집니다.

  3.  **Reducer로의 데이터 불균형:**
       - Group By나 Join과 같은 작업에서는 일부 Reducer가 많은 양의 데이터를 처리하고 다른 Reducer는 적은 양의 데이터를 처리할 수 있습니다.
       - 이는 전체 시스템의 성능에 영향을 미치며, 특히 Reducer의 수에 따라 메모리 에러 등의 문제가 발생할 수 있습니다.

  4.  **데이터 엔지니어링의 어려움:**
       - 이러한 데이터 불균형은 빅데이터 시스템에서 흔한 문제로, 데이터 엔지니어는 이를 해결하기 위한 효과적인 전략을 필요로 합니다.
       - 파티셔닝 전략, 리듀서 수 조절, 데이터 스케일링과 같은 기술적인 접근을 사용하여 데이터 불균형에 대응해야 합니다.

  5.  **시스템 성능 저하 가능성:**
       - 데이터 불균형이 해결되지 않으면 전체 시스템의 성능이 저하될 수 있습니다.
       - 따라서 데이터 엔지니어는 이러한 불균형을 모니터링하고 조정하여 전체 작업의 효율성을 유지해야 합니다.

 

MapReduce 프로그래밍의 문제점

  1.  **낮은 생산성:**
       - MapReduce는 특정한 프로그래밍 모델을 따르며, 이로 인해 프로그래머들이 가진 융통성이 부족합니다. Map과 Reduce 두 가지 오퍼레이션만을 제공하기 때문에 다양한 작업을 표현하기가 어려울 수 있습니다.
       - 튜닝과 최적화도 쉽지 않은 편입니다. 특히, 데이터의 분포가 균등하지 않은 경우에는 성능 향상을 위한 조정이 어려울 수 있습니다.

  2. **배치 작업 중심:**
       - MapReduce는 기본적으로 대용량 데이터를 처리하는 데 중점을 두고 있어서 배치 작업에 적합합니다. 이는 대화형 또는 실시간 처리에는 적합하지 않은 특징입니다.
       - Low Latency(낮은 응답 시간)보다는 Throughput(처리량)에 초점이 맞춰져 있어, 실시간 데이터 처리에는 적합하지 않을 수 있습니다.

  3.  **복잡한 프로그래밍 모델:**
       - MapReduce 프로그래밍은 비교적 낮은 수준의 추상화를 제공하며, 개발자가 세부적인 작업을 직접 다루어야 합니다. 이로 인해 코드의 가독성이 떨어지고, 프로그램을 작성하는 데 높은 수준의 역량이 필요할 수 있습니다.

  4.  **데이터 이동 비용:**
       - MapReduce는 중간 결과를 디스크에 저장하고, 이를 다시 읽어와서 다음 단계의 작업을 수행하는 방식으로 동작합니다. 이러한 디스크 I/O 작업은 데이터 이동 비용을 증가시키고, 성능을 저하시킬 수 있습니다.

    이러한 문제점은 더 최신의 빅데이터 처리 프레임워크들이 나오게 된 동기 중 하나이며, Apache Spark, Apache Flink 등이 MapReduce의 한계를 극복하고자 나왔습니다. 이들 프레임워크들은 더 높은 수준의 추상화와 다양한 연산 지원으로 개발자의 생산성을 향상시키고, 실시간 처리와 반응성에 강점을 가지고 있습니다.

 

MapReduce 대안들의 등장

  • 더 범용적인 대용량 데이터 처리 프레임웍들의 등장 ( YARN, Spark)
    1. **YARN (Yet Another Resource Negotiator):**
       - YARN은 Hadoop 2.x부터 도입된 클러스터 자원 관리 시스템으로, Hadoop 클러스터에서 여러 응용 프로그램을 실행하고 조율하는 역할을 합니다. YARN은 MapReduce 뿐만 아니라 다양한 응용프로그램들을 실행할 수 있게끔 범용적으로 설계되었습니다.

    2. **Apache Spark:**
       - Spark는 빅데이터 처리를 위한 오픈소스 클러스터 컴퓨팅 프레임워크로, RDD(Resilient Distributed Dataset)를 통한 데이터 처리를 지원합니다. MapReduce보다 빠른 속도와 다양한 연산 지원 등으로 인해 많은 관심을 받고 있습니다.

  • SQL의 컴백: Hive, Presto등이 등장
    1. **Hive:**
       - Hive는 데이터 웨어하우스 기능을 제공하는 데이터웨어하우스 기반의 데이터 처리 도구입니다. Hadoop 클러스터 위에서 동작하며, SQL과 유사한 HiveQL을 사용하여 데이터를 쿼리하고 처리합니다. Hive는 MapReduce를 기반으로 구현되어 있어서 대용량 ETL(Extract, Transform, Load) 작업에 적합합니다.

    2. **Presto:**
       - Presto는 Facebook에서 개발한 분산 SQL 쿼리 엔진으로, 대용량 데이터 처리에 특화되어 있습니다. Presto는 기존의 데이터 웨어하우스나 Hadoop과 연동하여 사용할 수 있으며, Adhoc 쿼리에 강점을 가지고 있습니다. 메모리를 주로 사용하여 빠른 쿼리 성능을 제공합니다.

    3. **AWS Athena:**
       - AWS Athena는 Presto 엔진을 기반으로 한 서버리스 쿼리 서비스로, S3에 저장된 데이터를 쿼리할 수 있습니다. 사용자는 쿼리당 비용을 지불하며, 특정한 클러스터를 관리하지 않아도 되므로 유연성이 높습니다.

    이들 대안들은 각각의 특성에 따라 다양한 용도에 활용되고 있으며, MapReduce보다 더 높은 수준의 추상화, 빠른 처리 속도, SQL 기반의 쿼리 인터페이스 등을 제공하여 빅데이터 처리의 생산성과 성능을 향상시키고 있습니다.

'하둡,spark' 카테고리의 다른 글

맵리듀스(MapReduce) 문제점  (0) 2024.01.18
하둡 설치 +맵리듀스(wordcount) 실습  (0) 2024.01.18
YARN  (0) 2024.01.16
하둡 기초  (0) 2024.01.15
빅데이터 기초  (0) 2024.01.15

+ Recent posts