brunch

You can make anything
by writing

C.S.Lewis

by 송 재희 Nov 17. 2018

Spark: Python or Scala?

빅 데이터 처리


데이터 엔지니어의 대 부분의 시간은 데이터 추출 및 가공에 쓴다고 봐야 한다. 데이터를 어떻게 처리하는가? 거대한 양, 다양한 형식의 데이터, 빠른 데이터 생성 속도 등으로 대변되는 빅 데이터, 쉽지만은
않다. 빅 데이터 처리 툴은 다양하다. Hadoop 분산 파일 시스템으로 기본으로 한 다양한 제품군. 그중에 Spark는 Hadoop와 연동할 수 있고, 단독으로 쓸 수 있다. 오늘은 Spark에 대해 알아보자.
Spark는 Scala를 쓸 수도 있고, Python이나 자바를 쓸 수 있다. 


Python 과 Scala?

일반적으로 대부분의 개발자들은 Scala가 성능과 동시처리성(Concurrency) 측면에서 유리하다는 점에 동의한다. Spark을 사용하여 작업할 때 Python보다 확실히 빠르며 동시성에 관해 말할 때 Scala와 Play 프레임 워크는 이를 확인 할수 있다. 쉽게 추론할 수 있는 깨끗하고 효율적인 비동기 코드를 작성하기 쉽다. Play는 완전히 비동기식이기 때문에 스레드를 처리하지 않고도 많은 동시 연결이 가능하다. 성능을 향상하고 실시간, 스트리밍 및 서버 푸시 기술을 사용할 수 있도록 병렬로 I / O 호출을 하는 것이 더 쉬울 것이다.


비동기 코드는 원격 서비스를 호출할 때 비 차단 I / O를 허용한다. 예를 들면, 첫 번째 코드가 데이터베이스에 쿼리하고 두 번째 코드가 콘솔에 출력될 때 동기 프로그래밍은 무언가를 인쇄하기 전에 쿼리가 완료될 때까지 기다린다. 프로그램이 (잠시) 차단되었습니다. 프로그래밍 언어가 비동기 프로그래밍을 지원하지 않으면 병렬로 코드 행을 실행하는 스레드를 만들어야 한다. 반면 비동기 프로그래밍은 데이터베이스가 쿼리 되는 동안 이미 콘솔에 인쇄된다. 쿼리가 백그라운드에서 처리기 때문이다.


간단히 말해 위의 내용은 Spark의 구조화된 스트리밍이 이미 간격을 줄이고 있는 것처럼 보이지만 스트리밍 데이터로 작업할 때 Python보다 Scala를 사용하는 것이 강하게 권장되는 이유를 설명한다.


그러나 스트리밍 데이터는 성능면에서 유일한 고려 사항은 아닙니다.

DataFrame API로 작업할 때는 실제로 파이썬과 스칼라 간에 차이가 없지만 사용자 정의 함수 (UDF)에 주의해야한다. 사용자 정의 함수 (UDF)는 스칼라보다 효율적이지 않다. 그렇기 때문에 파이썬으로 작업하는 경우 내장 식(built-in expressions)을 선호해야 한다. 파이썬으로 작업할 때는 데이터 전송의 직렬화 및 비 직렬 화가 특히 비용이 많이 들기 때문에 DataFrame과 RDD 간에 데이터를 불필요하게 전달하지 않도록 해야한다.


직렬화는 객체를 디스크 또는 데이터베이스에 유지되거나 스트림을 통해 전송될 수 있는 일련의 바이트로 변환하는 프로세스임을 기억하자. 역순으로 바이트 시퀀스에서 객체를 만드는 것을 직렬화 해제라고 한다. 보다 실제적인 예를 들어, 서버 및 클라이언트와 같은 영화 응용 프로그램을 만든다고 가정하자. 클라이언트의 응용 프로그램이 서버에 쿼리를 전송하여 예를 들어 영화 목록을 검색할 때마다 서버는 사용 가능한 Movie 객체 목록을 클라이언트에 전달해야 하므로 객체를 직렬화 해야한다.


스파크 및 타입 안전성 : 스칼라 또는 파이썬?

또 고려할 사항은 유형 안전성과 Python 또는 Scala로 작업할 때 얻을 수 있는 고급 기능의 양이다. 타입 안전성에 관해서는, 당신이 작은 임시 실험을 할 때 Python이 좋은 선택이라고 말할 수 있다. Scala는 프로덕션에서 더 큰 프로젝트를 작업할 때 훌륭하다. 이것은 주로 스칼라와 같이 정적으로 형식이 지정된 언어가 리팩터링 할 때 훨씬 쉽고 번거롭지 않기 때문이다.


언어가 정적으로 입력될 때 모든 변수 이름은 유형과 객체 모두에 바인딩된다는 것을 기억하자. 형식 검사는 컴파일할 때 발생한다. 대표적인 예는 Java 또는 Scala이다. 스칼라의 경우, 타입 시스템은 변수의 타입을 추론할 수 있으므로, 타입 추론의 형태가 있어 작업을 조금 더 빠르게 할 수 있다. 동적으로 유형화된 언어에서 모든 변수 이름은 null이 아닌 한 객체에만 바인딩된다. 유형 검사는 런타임에 수행된다. 개발자는 매번 형식을 지정하지 않아도 되기 때문에 일반적으로 작업 속도가 빨라진다는 것을 의미한다. 여기에 전형적인 예가 파이썬이나 루비입니다.

스파크 및 고급 기능 : 파이썬 또는 스칼라?

마지막으로 파이썬이나 스칼라를 사용할 수 있는 몇 가지 고급 기능이 있다. 여기에서는 SparkMLib와 같은 기계 학습 및 자연 언어 처리를 위한 많은 훌륭한 도구를 사용자에게 제공하기 때문에 데이터 과학에 대해 이야기할 때 파이썬이 가장 큰 이점이 있다고 볼수 있다.


결론

요컨대, Spark을 사용하는 경우 두 언어 모두 장단점이 있다. 하나 또는 다른 하나를 결정하는 것은 프로젝트의 필요, 자신 또는 팀의 능력에 달려 있다.  중요한 것은 각 각 언어의 장단점, 한계를 알고 요구 조건에 많은 툴을 고르면 된다. 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari