# DevOps, # Spark-Kafka-Streaming-SQL
Spark 에서 Python 을 이용한 개발은 자바, 스칼라 언어보다 속도면에서 조금 떨어질 수 있다.
RDD 개념에서 생각해보면, 자바 패키지를 이용한 데이터 프로세싱 과정에서 생기는 오버헤드 정도로 여길 수 있다.
하지만, 데이터프레임 개념으로 접근하면 이런 차이점(?)을 없앨 수 있다.
바로 spark-kafka-sql 을 사용하여 데이터를 가공하는 방법이다. 나도 pyspark 관련 서적을 읽으면서 이 부분을 알게 되었다.
이를 운영상태로 녹이기 위해서는 코딩이 어렵다거나 구성이 복잡하다라는 Excuse 는 더이상 문제로 삼지 못한다.
이유는! Spark, Kafka 가 자바기반으로 움직이고, Pyspark 를 쓰려고 하여도 Py4j 를 통해 자바 패키지를 사용하기 때문에이다. 즉, Dependencies 맞추는 부분이 가장 신경써야 할 부분이다.
Version Check 를 꼭 기록해 두어야 한다.
예를 들어서,
Spark 버젼은 2.3.1 / Kafka 버젼은 1.0.0 / Java 1.8 / Python 3.5.x / Scala 2.11.x 등등...
신경써야 할 부분이 굉장히 많다.
spark-sumit CLI 를 통해서 작성한 파이썬 파일을 실행시킨다.
이때, --packages 옵션에 자신의 버전에 맞는 spark-kafka 관련 패키지를 파라미터로 넘겨주어야 한다.
이를 해결하기 위해서 처음에는 많은 시행착오를 거쳤다.
이 글을 보는 사람은 부디 그런 시행착오에서 빨리 빠져 나와서 재미있는 프로그래밍을 했으면 좋겠다.
예를 들어,
내가 지금 spark-sql 을 통해서 streaming 서비스를 구현하려고 한다면,
${SPARK_HOME}/bin/spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.1
이라는 명령을 사용한다.
좀 더 자세히 보면,
spark-sql-kafka-0-10_2.11 에서 0-10 을 보면 카프카의 버젼을 나타낸다.
2.11 을 보면 스칼라 버젼을 나타낸다. 마지막 :2.3.1 은 지금 사용하는 스파크의 버젼을 뜻한다.
다은 예를 들어,
내가 지금 spark-streaming 을 통해서 데이터를 가공하려고 한다면,
${SPARK_HOME}/bin/spark-submit --packages org.apache.spark:spark-streaming-kafka-0-8-assembly_2.11:2.3.1
이라는 명령을 사용한다.
참고로 spark-streaming-kafka 는 스파크2 에서는 Deprecated 상태다.
그래서 0-8-assembly 라는 패키지를 사용한다. 뒤의 버젼은 동일하다.
함께 혼용해서 쓸 수 없다는 것은 직접 실행을 통해서 알게 되었다.
spark-sql 의 강력함을 보여주기에 글로써는 부족하다. SQL 을 조금이라도 사용해 보았다면, NoSQL 에서의 불편함에 기존의 RDBMS 를 추억(?)해 보았음직 하다.
spark-sql 은 이를 가능하게 해준다. RDBMS 에서 사용한 방식처럼 데이터를 select 하고 where 를 통해 필터를 주고, group, order 등등의 기능이 가능하다. JSON 데이터 위에서.
다음 글에서는 spark-sql 을 어떻게 실제 프로젝트에 접목하여 사용하는지 간단히 소개해 보려고 한다.