2014년 10월 28일 화요일

Spark 사용기 1 - Hive vs Spark vs SAS : select count(*) performance 비교

오늘은 야간에 데이타센터 님께서 작업하시므로 새벽 대기를 해야하는 날이다.

오랫만에 철야 하는 기념으로 다가, 오늘은 드디어 Code 를 돌려 보도록 하겠다.

우선 master node 에서 아래 명령어를 수행하였다.
 ./spark-shell --master spark://master003.prod.moneymall.ssgbi.com:7077

아래처럼 멋쮠 Spark 텍스트 로고가 보인다.

우선 첫번째로 해보고 싶은 것은 Hive Table 의 Seclect Count(*) 와 Spark Engine 에서의 Line Count 의 성능 비교이다. 덤으로 SAS 에서 Hadoop Connector(내부적으로 HiveQL JDBC를 이용한다.)의 성능도 함께 비교해 보았다. 

간단한 수행이므로, Hive 는 Hive Shell Console 에서, 그리고 Spark 는 Spark의 Scala Console 에서 수행 해보았다. SAS 는 SAS 서버에서 직접 Base Programe Code로 수행하였다.

[1] Hive Console 에서 수행.

수행한 쿼리는 다음과 같다.

hive> select count(*) from search_keyword_result;

결과는 다음과 같이, 15.459초



[2] SCALA Console 에서 수행.

비교를 위해 선정한 위의 Table 은 Hive 의 External Table 로서, HDFS 입장에서는 Directory 이다. 해당 디렉토리에 일배치가 끝난 파일이 하루에 한개씩 파일이 생기는 구조이며, Hive Table 입장에서는 Row 가 일단위로 Append 되는 형태의 Table 이다.

그래서, 먼저 처음 수행한 코드는 아래와 같다.

 val hdfsFile = sc.textFile("hdfs://master001.prod.moneymall.ssgbi.com:9000/user/hive/warehouse/research_keyword_result/")

혹시나 디렉토리가 바로 로딩 되진 않을까 하는 기대여서 였지만....
역시나... 아래처럼 에러가 발생한다.


서칭을 좀 해보니, 디렉토리를 통채로 로딩할때는 아래처럼 하면 된다.

 val hdfsFile = sc.textFile("hdfs://master001.prod.moneymall.ssgbi.com:9000/user/hive/warehouse/research_keyword_result/*")

count 를 위한 아래와 같은 짧은 코드를 위 코드 뒤이어 수행해 보았다.

hdfsFile.count()

결과는 놀랄 말큼 빠르다.
0.38초....

결과도 Hive 와 동일하다.


[3] SAS 에서 Hive Connector 로 수행.

(1) 첫번째 시도. ( with SAS Dataset Binding )

SAS 에서 맨처음 해본것은 Data Step 에서 Hive Table 라이브러리를 임시 테이블로 Dataset 로딩 해보는 작업이었다. 그렇게만 하여도, Observation 관측치 값을 알려주기 때문이다. 그런데, 위에서 scala가 1초도 안걸리는 수행을 임시 테이블 바인딩 작업이 무려 21분이나 소요 되었다. (현재 12시가 넘어버린 시점이라 위 시점과 아래 스샷의 시점차에 의한 결과 값이 미묘하게 다르지만, 너무 오래걸려서 저걸 다시 수행하고 싶진 않다.)


뭘 해보기도 전에 21분씩이나 초기 로딩에 소요 되는 것은 대략 안습이다. 게다가 저게 얼마 주고 산건데.... 벤츠를 3대는 뽑았을 금액인데..

(2) 두번째 시도. ( with SAS Memory Iteration )

일단 SAS 도 포기하고 싶지 않아 몇가지 실험을 더 해보기로 하였다. 사실 Hive Table 을 SAS DataSet으로 바인딩 하는 것은 Hive Table 이 매우 클 수 있음을 감안하면, 좀 무식한 접근 일 수 있다. Data Download Time 및 serialize Time 을 고려하면, 위 첫번째 시도는 그럴만도 했다고 일단은 스스로 위안을 해보도록 하자.

그래서 아래처럼 메모리 상에서 루프 돌며 Count 를 구해 보았다. 결과는 일단, 드라마틱하게 개선....

21분 걸렸던게 무려 3분8초로 단축 되었다.


(3) 세번째 시도. ( With SAS SQL )

한가지만 더 실험해 보고 싶은 욕구가 생겼다... 흑, 조금있으면 출근해야 할 정도로 시간이 많이 지나 버렸긴 하지만....잠자기는 틀린것 같고..

SAS 영업께서는 늘 말씀 하셨다. SAS 의 Hadoop Connector는 Hadoop의 자원을 쓰기 때문에 Hadoop 과 공존하며, 상호 보완적 하이브리드 Analytics 환경을 제공해 준다고...

이 말을 꼭 검증해 보고 싶었다. 사실 위가 사실이 아니라면, 나는 오늘 부로 Hadoop 데이타를 SAS 를 이용해서 핸들링하는 시도를 아예 접을 생각이었다.

결과는 우선 영업의 말이 사실이다는 점. SAS SQL 은 일단 Hadoop에게 Query 수행을 일임해준듯 한 결과가 나왔다. 이로써 느려 터진 SAS 는 Hadoop과 공존 할때, Heavy 한 업무는 Hadoop 에게 맞기고, 좀더 스마트한 계산만 SAS 로 하면 된다는 존재 이유가 생겼다.

수행시간은 무려 57초. (처음 21분에 비하면 무지 개선 되었다. Hadoop 의 힘을 빌은 결과이긴 하지만... 왠지 Hive 대신 Shark 를 Spark 위에 올리고, HiveQL을 Shark에게 날리면, 57초가 20초대 미만으로 줄어들것도 같은 생각이 들긴 한다.)


[4] Hive vs Spark vs SAS 오늘의 결론!
 
(1) Hive vs Spark vs SAS(with HiveQL)
15.45 s : 0.38 s : 57.2 s

(2) Hive vs Spark vs SAS(only SAS)
15.45 s : 0.38 s : 3m 8s

Spark Perfect Win!!!!!!!!!!!!!!!!!!!

댓글 없음:

댓글 쓰기