강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

oleole님의 프로필 이미지
oleole

작성한 질문수

스파크 머신러닝 완벽 가이드 - Part 1

aggregation 적용하기

Pandas vs Spark: 비용, 처리시간 비교

작성

·

1.2K

·

수정됨

0

안녕하세요 선생님, 항상 좋은 강의 제공해주셔서 감사합니다.

 

저는 데이터 관련 현업에 종사하고 있는 직장인입니다. 업무를 하다가 궁금한 점이 있어서 질문 드립니다.

 

데이터:

  • 매주 60만개 레코드가 업데이트 및 증가하는 DF_A

  • 매일 1000개 레코드가 업데이트 및 증가하는 DF_B

 

Task: 

매일 DF_A 와 DF_B를 1) merge하여 2) aggregation (groupby, count, merge 등 포함)을 하고 3) 결과 값을 다른 곳에 저장하는Databricks에 job이 있습니다.

 

이 둘을 spark로 읽어들여 merge를 함으로써 메모리 및 시간을 (이미 오래걸리지만) 절약하고 있습니다. Spark로 둘을 merge한 후, pandas로 dataframe을 변화하여, aggregation 처리를 하고 있습니다.

 

제가 이해하기로 Pandas는 아무래도 dataframe을 memory에 올려놓고 하다보니 groupby(), count() 와 같은 aggregation 결과를 즉각적으로 볼 수 있는 반면, spark는 memory에 올려놓지 않아서 dataframe의 레코드 개수 파악을 하기 위해 count()를 하더라도 엄청 오래걸려 aggregation 처리는 pandas로 하고 있습니다. 다만 이 경우, memory의 사용이 너무 과다하여 시간이 지날수록 처리해야하는 데이터 양이 많아지게 되면 out of memory 에러가 날 수 있는 위험이 있다고 생각이 듭니다.

 

제가 aggregation을 pandas로 바꿔서 하는 이유는

1.     pandas에 익숙해서

2.     spark보다 aggregation이 더 빨라서 (테스트해보지 않아 사실 정확하지 않습니다. 눈에 보이는 즉각적인 aggregation 결과만 봤을때 pandas가 더 빠르다고 생각이 들었습니다.)

 

제가 생각하기에 pandas가 아닌 모든 것을 spark로 aggregation 함으로써 장점은

1.     memory 에러가 날 걱정이 거의 없다.

2.     Memory를 덜 사용함으로써 비용 절감의 효과가 있다? (databricks에서 cluster를 리소스 사용량이 아닌 이미 만들어진 cluster에 대해서는 사용량이 적던 많던 사용시간에 비례해서 늘어나는 걸로 알고 있는데 확실치 않습니다.)

3.     어쩌면 pandas보다 aggregation이 빠를 수 있다???

위에 spark 장점 2, 3번에 대해서 특히 3번에 대해서 spark 보다 pandas의 aggregation 연산이 더 빠른지, 아직 spark로 aggregation 코드를 작성하지 않아 직접 비교는 해보지 않았습니다.

 

혹시 선생님의 의견으로는 모든 것을 spark로 하는게 좋을지 혹은 현재처럼 pandas로 하는 것도 괜찮을지, 그 외 추가적으로 고려해 보아야할 부분에 대한 조언 여쭙고자 질문 남깁니다. 답변에 대한 추가적인 질문은 대댓글을 남기면 되는지 혹은 질문을 다시 추가해야 선생님이 알림 받기가 편하신지 알려주시면 감사하겠습니다!

 

항상 좋은 컨텐츠 제공해 주심에 감사합니다!

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

어려운 고민을 하고 계셨군요.

먼저 제 생각은 oleole님이 사용하기 편하신대로 적용하시는게 가장 좋다고 생각됩니다.

일일 처리하는 용량 증가가 pandas에서 어떻게 되는지 확인해 보신 뒤 향후 3개월내에 별 문제가 없다면 pandas를 그대로 사용하시는게 좋을 것 같습니다.

pandas는 매우 빠릅니다. 하지만 잘 아시다시피 단점이 메모리 제약이 있습니다. 데이터가 100GB 이상이 되면 물리적으로 RAM이 200GB 이상 필요할 수 있습니다. 물론 Pandas의 컬럼 타입을 최대한 메모리를 적게하여 변환할 수도 있습니다. 가령 int64를 int32로 바꾼다거나..

하지만 물리적인 메모리 제약을 그래도 회피하기는 어렵습니다.

spark를 한개의 노드에서만 수행할 경우 동등한 H/W 사양이라면 Pandas 보다 빠르기 어렵습니다. 하지만 대량의 데이터(TB 단위)의 경우 여러개의 노드에서 병렬로 spark를 수행한다면 Pandas보다 더 빠를 겁니다.

만약 데이터 증가량이 1~2개월내에 H/W 메모리를 다 사용할 정도라면 Spark를 전환을 고민해 보시면 좋을 것 같습니다.

감사합니다.

oleole님의 프로필 이미지
oleole

작성한 질문수

질문하기