[TIL] Spark Day 1~4

heering·2023년 7월 3일
0

Day 1

  • 특강

    • 구직공고의 '이런 분이면 좋아요'는 가산점 느낌이 강하니까, 쫄지 말기
    • '3년 이상'이라는 경력이 적혀있다면, 2년까지는 지원해도 괜찮다고 보시는 편
    • 프로젝트 경험은 너무 기술적인 내용을 적기보다는, 어떤 점을 해결했고 그걸 가지고 뭘 했는지를 서술하는 것이 좋음.
    • 기술 질문에 답할 때 어떻게 해야할지 생각이 안난다면, 어떤 부분에서 막히는지 이야기 & 도움 요청 부끄러운 거 아님. 바로 답하지 않고 문제를 명확히 이해하려는 질문을 한다면 시간도 벌고 & 의사소통 열심히 하는 사람으로 보이고 일석이조
  • Spark vs. MapReduce

    SparkMapReduce
    기본적으로 메모리 기반, 다양한 컴퓨팅 지원, pandas 데이터프레임과 개념적으로 동일한 데이터 구조 지원디스크 기반, 하둡(YARN) 위에서만 동작, key-value 기반 데이터 구조만 지원

Day 2

  • Spark 데이터 처리 흐름

    • 데이터프레임은 작은 파티션들로 구성됨 (한 번 만들어지면 수정 불가)
    • 입력 데이터프레임을 원하는 결과 도출까지 다른 데이터프레임으로 계속 변환 (sort, group by, filter, join, ...)
  • 셔플링: 파티션 간에 데이터 이동이 필요한 경우 발생

    • 발생하는 경우: 명시적 파티션을 새롭게 하는 경우 (파티션 수를 줄이기), 시스템에 의해 이뤄지는 셔플링 (그룹핑 등의 aggregation이나 sorting)
    • 데이터 처리에 병렬성을 주지만, Data Skewness가 발생하는 단점이 있기 때문에, 셔플링은 최소화하고 파티션 최적화를 하는 것이 중요함
  • Spark DataFrame 실습

    df = spark.read.format("csv")\
         .option("inferSchema", "true")\
         .load("1800.csv")\
         .toDF("stationID", "date", "measure_type", "temperature", "_c4", "_c5", "_c6", "_c7")

    여기서 inferSchema 옵션은 원래 default가 False. 직역하면 스키마를 추론한다 → Spark가 해당 DataFrame을 만들 때 앞의 레코드들을 샘플링 해서 본 뒤 type이 무엇인지 추측하는 것임.

    from pyspark.sql.types import StringType, IntegerType, FloatType
    from pyspark.sql.types import StructType, StructField
    
        schema = StructType([ \
            StructField("stationID", StringType(), True), \
            StructField("date", IntegerType(), True), \
            StructField("measure_type", StringType(), True), \
            StructField("temperature", FloatType(), True)])

    앞 코드에서는 추론해보라고 했지만 이 코드는 명시적으로 알려주는 코드.

    • DataFrame의 컬럼을 지칭하는 방식 4가지 (모두 동일한 표현)
    from pyspark.sql.functions import col, column
    
    stationTemps = minTemps.select(
    "stationID",
    col("stationID"),
    column("stationID"),
    minTemps.stationID
    )

Day 3

  • Window 함수: ROWS BETWEEN AND

    
    SELECT value FROM rows_test;
    
    SELECT
    	SUM(value) OVER(
       	order by value
           rows between 2 preceding and 2 following -- 뜻: 자기 기준 앞 2개 & 뒤 2개. 숫자 대신 unbounded도 가능
       ) AS rolling_sum
    FROM rows_test;
  • Parquet: Spark의 기본 파일 format. 하나의 데이터 블록은 하나의 Row Group으로 구성됨

Day 4

  • JOIN 2종류
    • 큰 데이터 - 큰 데이터 간의 JOIN: 보통 JOIN (Shuffle JOIN)
    • 큰 데이터 - 작은 데이터 간의 JOIN: Broadcast JOIN
      • spark.sql.autoBroadcastJoinThredshold 파라미터로 데이터프레임 하나가 충분히 작은지 여부 결정
  • JOIN 할 때 생각해야 할 부분
    • Shuffle되는 양을 줄이는 방법(Filtering 먼저 하기, Grouping 먼저 하기 등)
    • 병렬화를 최대화할 방법 찾기(Executor 수, Partition 수)
    • JOIN 키 값의 분포 확인 후 균일하게 만들 방법 찾기 (Data Skew)
    • Partition 로딩 시에 버킷팅을 통해 키가 같은 레코드들이 같은 파티션에 존재하도록 설정
  • UDF (User Defined Function)
    DataFrame이나 SQL에서 적용할 수 있는 사용자 정의 함수

0개의 댓글