본문 바로가기
카테고리 없음

[Spark] Spark로 Hadoop 프로그래밍 하기

by psihyeong 2023. 3. 21.

"Udemy Hadoop 강의를 참고해 Spark의 개요에 대해 정리한 글"

 

What is spark?

"대규모 데이터 처리에 사용되는 신속하고 보편적인 엔진"

  • Hadoop 생태계 전체에 해당되는 말이지만, Spark는 이걸 새로운 차원으로 끌어올립니다
  • Spark는 Java나 Scala, Python 같은 실제 프로그래밍 언어를 사용해 스크립트를 작성할 수 있는 유연성을 제공하고 복잡한 데이터를 조작이나 변형, 분석할 수 있습니다.
  • Pig같은 기술과 다른 점은 Spark 위에 또 다른 풍부한 생태계가 존재하고, 그걸 사용해 머신 러닝이나 데이터 마이닝, 그래프 분석, 데이터 스트리밍 같은 복잡한 일을 할 수 있습니다.
  • 아주 강력하고 빠른 프레임워크

 

Spark 패턴

드라이버 프로그램

- 작업을 어떻게 진행할지 통제하는 스크립트

클러스터 관리자 

- 범용 컴퓨터 클러스터에 작업을 분배해 데이터를 병렬로 처리합니다.

집행자(executor) 프로세스

- 일종의 캐시(cache)와 작업(task)을 갖습니다

- 캐시는 Spark 성능의 키입니다. HDFS와 항상 접촉하는 '디스크 기반 솔루션'과는 달리 Spark는 '메모리 기반 솔루션'입니다. 정보를 최대한 RAM에 유지하며 처리합니다

 

after 디스크 기반 솔루션 vs 메모리 기반 솔루션

 

Spark vs MapReduce

- MapReduce와 비교하면 메모리 내에 작동할 때 최대 100배까지 빠르고, 디스크 엑세스에 제한되면 10배까지 빠릅니다.

- MapReduce는 문제를 매퍼와 리듀서의 관점에서 생각해야 하기 때문에 할 수 있는 일이 제한되어 있습니다.

- Spark는 Pig처럼 프레임워크를 제공해 원하는 결과가 무엇인지와 프로그램에 더 집중하고, 클러스터에 어떻게 분배할지는 덜 신경써도 됩니다.

 

Spark 구조

Spark Core 내의 RDD에 프로그래밍하면 Spark 위에 구축된 라이브러리 패키지가 있어 함께 사용 가능합니다.

Spark Streaming

- 데이터를 일괄 처리하는 대신, 실시간으로 데이터를 입력할 수 있습니다.

- 동시다발적으로 배출해 내는 로그 데이터를 실시간으로 가져와 일정 시간 안에 분석하고 데이터베이스나 NoSQL 데이터 스토어에 그 결과를 저장할 수 있습니다

Spark SQL

- Spark의 SQL 인터페이스

- SQL에 익숙하다면 데이터에 그냥 SQL 쿼리를 작성하거나 SQL 유사 함수를 사용해 Spark의 데이터 세트를 변환합니다.

- '데이터 세트'라는 최적화 작업이 진행 중이며 이걸 통해 방향성 비사이클 그래프 이상의 최적화를 달성합니다.

MLLib

- Spark의 데이터 세트에 실행하는 머신 러닝이나 데이터 마이닝 같은 도구의 라이브러리입니다.

- 매퍼와 리듀서로의 회귀 분석이나 클러스터링 같은 머신 러닝 문제를 풀어내는 건 여간 쉬운 일이 아니지만, 대략적인 클래스만 만들어 놓으면 Spark MLLib가 데이터의 의미를 추출해서 해결해 줍니다

GraphX

- 그래프 이론에서 사용되는 그래프

- 소셜 네트워크 그래프가 있다고 예를 들면, 그래프의 속성을 분석하고 어떻게 가장 짧게 연결할 수 있는지 등을 볼 수 있습니다.

 

Spark 언어 python vs scala

Scala는 Spark를 개발한 언어이고 Spark의 작동 방식을 구성한 기능적인 프로그래밍 모델

Python은 사용하기 훨씬 간단하고, 컴파일링이나 jar 파일을 만들고 종속성을 고려하는 등의 복잡한 일을 할 필요가 없습니다.

Scala는 Java 바이트코드에서 바로 컴파일합니다. Python처럼 오버헤드가 필요 없기 때문에 훨씬 빠르고 안정적인 성능을 갖고 있습니다. 

 

RDD

RDD는 회복성 분산 데이터 세트(Resilient Distributed Dataset)의 약자로 Spark  내부에서 일어나는 지저분한 일들을 추상적으로 표현한 겁니다. 작업을 클러스터에 고르게 '분산'하고 실패가 생겨도 '회복'할 수 있으며 사용자에게 '데이터 세트'처럼 보입니다.

RDD 객체는 키-값 정보나 일반적인 정보를 저장하는 수단이고 클러스터가 알아서 작업합니다. 때문에 프로그래밍 관점에선 RDD는 그냥 데이터 세트입니다. 내부적으로는 회복성이 있고 분산되어 있지만 사용자가 고려할 것은 많이 없습니다.

 

How to make RDD?

드라이버 프로그램이 SparkContext라는 것을 만듭니다. 이는 RDD를 운영할 환경임과 동시에 RDD를 만들어 줍니다.

'sc'라는 객체를 대화형으로 만드는 Spark shell도 있고 아니면 독립적인 스크립트를 사용해 SparkContext를 스케줄에 따라 만들 수도 있습니다.

SparkContext는 Spark 내에서 드라이버 프로그램이 작동하는 환경이며 RDD를 만드는 주체입니다. RDD는 다양한 방법으로 만들 수 있습니다. 보통은 RDD를 어떤 텍스트 파일에서 불러옵니다. 

nums = parallelize([1,2,3,4])
sc.textFile("file:///c:/users/t.txt")
	- or s3n://, hdfs://
hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("SELECT name, age FROM users")

 

Transforming RDD

기본적으로 매핑과 리듀싱.. Transforming RDD == Maping

1. map

- RDD에 'map'을 사용하여 각 입력 행에 어떤 함수를 적용해 전환된 데이터를 가지고 새로운 RDD를 만듭니다.

- 'map'은 기존 RDD의 모든 입력 행이 새로운  RDD의 출력 행과 1대 1 관계를 가지고 있을 때 사용합니다.

2. flatmap

- 때로는 각 입력 행마다 다른 수의 출력이 필요하기도 합니다. 예를 들면 각 줄을 여러 행으로 분할하거나 무효한 입력 줄을 폐기할 수도 있습니다. 'flatmap'이 이런 작업을 합니다.

- 'flatmap'은 입력 행과 출력 행 사이에 다양한 관계가 있을 수 있습니다.

3. filter

-  RDD에서 데이터를 빼낼 때 사용합니다. 이때 RDD의 행을 유지할지 말지 결정하는 함수를 사용합니다.

4. distinct

- RDD 내에서 고유한 값을 찾아냅니다.

5. sample

- 무작위 표본을 만들어냅니다.

6. union, intersection, subtract, cartesian

- RDD를 합칠 수 있습니다.

 

RDD actions

데이터의 수를 줄이는 리듀싱.  action == Reducing

1. collect

-  RDD 결과물을 입력으로 받아 드라이브 스크립트로 빨아들입니다. 이 시점에 결과물이 메모리에 들어갈만한 사이즈로 리듀싱되었는지 확인해야 합니다.

- 'collect'는 RDD의 데이터를 가져와 Python 객체를 반환하고 Python 드라이버 스크립트를 사용해 출력하거나 텍스트 파일로 저장하는 등 필요한 작업을 하며 됩니다.

2. count

- 'count'는 RDD에 얼마나 많은 행이 있는지 세어줍니다.

3. countByValue

- 'countByValue'는 각각의 고유 값이 RDD에 얼마나 있는지 총계를 냅니다.

4. take, top

- 어떤 시점에 RDD에 뭐가 있는지 재빠르게 확인하거나 디버깅할 때 유용하게 사용할 수 있습니다.

5. reduce

- MapReduce의 리듀싱에서 하는 것처럼 각 고유 키와 관련된 값들을 집게하는 함수를 정의할 수 있습니다.

 

Lazy evaluation

Spark에서 중요한 점은 위의 명령어가 호출되기 전까지, RDD에 함수를 호출하기 전까지 드라이버 스크립트에서 아무 일도 일어나지 않는다는 겁니다. 

Spark는 결과물을 만들기 위해 거꾸로 일하며 그 결과물에 다다를 수 있는 최단 경로를 찾아냅니다. 그러니까 이 스크립트를 실행하기 전까지 작성한 내용은 이 드라이브 스크립트의 종속성의 그래프 혹은 계통을 구성하는 것에 불과합니다.

스크립트가 실행되면 이 종속성을 통해 가장 빠른 경로를 찾아내고 그 후에야 클러스터에서 작업을 시작합니다.

-> Spark가 빠른 이유