[Spark] Streaming에서 DataFrame Tip

 이번 시간에는 Spark Streaming을 사용할 때 데이터를 처리하고 모으는 부분에서의 팁을 공개하려고 합니다. Spark Streaming으로 프로그램을 하면 보통 sql을 사용하기 위하여 DataFrame에 많이 넣으실 텐데요. 오늘은 그 부분에 대한 Tip을 공개합니다.


한줄로 팁을 요약하면, "DataFrame에 테이블의 데이터를 유지시키고, 추가 시키자!" 입니다. 


보통 Dataframe의 createOrReplaceTempView 함수를 쓰면, 기존의 내용은 날라가고, 현재의 내용만 남게 됩니다. 그걸 방지하고자 다음과 같은 함수를 미리 선언합니다. 

 사실상 이 함수가 첫번째 핵심입니다. 2개의 DataFrame을 하나로 합쳐줍니다. 


 그리고 또 하나의 변수가 있습니다. "Broadcast"라는 변수 입니다.  

https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#broadcast-variables 

여기의 설명에는 이렇게 나와있습니다.


Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks.

즉, Broadcast 변수를 사용하면, 읽기전용 데이터를 각각의 머신에 효과적으로 복사할 수 있습니다. 한마디로 분산되서 돌아가고 있는 작업서버들에게 공용변수를 넣어주는 것 같은 효과를 내는것입니다. 


 이제 예를 들겠습니다. 저는 Record라는 case class를 선언했습니다.

 시간과 double형 결과값을 저장하기 위해서 사용합니다. 그리고, DataFrame에 계속 이 데이터를 append해서 저장할 것 입니다.  


 간단한 Spark Streaming을 만드는 프로그램을 예제를 찾아서 이미 알 것 이라고 생각하고, 저희 소스의 일부분만 캡쳐해서 보여 드리도록 하겠습니다. 

 여기가 output_df 라는 DataFrame을 처음에 생성하고, broadcast 변수로 선언하고, View를 만드는 코드 입니다. 

 

 그리고 Streaming을 돌면서 처리되는 안에서 위와 같이 정의하였습니다. finalValue는 Double형 최종 값이고, 아까 위에서 broadcast에서 정의했던 output_df 라는 DataFrame에 unionByName이라는 함수를 써서 append 시켰습니다. 


이제 메인코드는 다 끝났습니다. 실제 돌려진 결과물을 확인하겠습니다.  


첫번째 사진은 시작하자마자 아직 2초가 가기전, 빈데이터가 있을때 입니다. 


2,3번째 화면은 시간이 지남에 따라 계속 Table에 데이터가 추가되는 모습입니다. 





Storm + Kafka 연동하기

Spark 개발환경 구축 - Zeppelin Spark Interpreter에 HBase 연결하기  

Spark 개발환경 구축 - Scala, Intelij, Maven



 

New Multi-Channel Dynamic CMS