2016년 6월 8일 수요일

Spark Streaming & FiloDB Test

FiloDB의 쿼리 처리 성능이 매우 좋다고 하여 Spark Streaming과 함께 사용하여 어느 정도의 성능을 내는 지를 확인해보기로 하였다.
FiloDB는 아래 url에서 다운로드 받아 빌드해서 사용해야 한다.

테스트를 위해 작성한 Spark 애플리케이션은 다음과 같은 방식으로 작업을 처리한다.
  1. Kafka로부터 Apache, NetScreen, Sniper 로그를 받는다.
  2. 로그 데이터를 파싱한다.
  3. 파싱한 데이터를 FiloDB에 저장한다.
  4. FiloDB에 쿼리를 실행하여 결과 값을 보여준다.

실행 쿼리

  1. Apache
    1. FiloDB에 저장된 전체 apache 로그 count
    2. status가 '200'인 로그들에서의 evt_size 필드 값들의 평균
    3. ext2 필드 값이 'GET'인 로그의 count
    4. evt_size 필드 값이 '18000' 보다 작은 로그의 count
    5. timestamp 필드로 group by하여 로그 개수 count
  2. NetScreen
    1. FiloDB에 저장된 전체 netscreen 로그 count
    2. ext4 필드 값이 '1360'인 로그들에서의 duration 필드 값들의 평균
    3. s_port 필드 값이 54690이고 s_info 필드 값이 '130.1.242.138'인 로그들의 count
    4. xstatus 필드 값이 'Permit'이고 duration 필드 값이 '60'을 초과하는 로그들의 count
    5. protocol 필드 값이 '17'이고 duration 필드 값이 '64'와 같은 로그들의 count
  3. Sniper
    1. FiloDB에 저장된 전체 sniper로그 count
    2. method 필드 값이 '(0015)IP Spoofing'인 로그들의 count
    3. d_info 필드 값이 '130.1.2.58'인 로그들의 count
    4. protocol 필드 값이 'tcp'인 로그들의 count
    5. risk 필드 값이 'High'인 로그들의 count

쿼리실행 결과

Spark 애플리케이션을 본인의 노트북에서 "local[6]"으로 실행하여 테스트하였다. (메모리는 따로 설정을 하지 않아 디폴트 1G로 주어졌다.)
쿼리를 실행 할 때 걸리는 시간을 알아보기 위하여 아래와 같이 쿼리 실행 결과 사이사이에 시간을 남겨두었다.

**************************************apache 1: Wed Jun 08 15:01:31 KST 2016
+-----------+
|count(uuid)|
+-----------+
| 2270000|
+-----------+
**************************************apache 2: Wed Jun 08 15:01:32 KST 2016
+----------------+
| avg(evt_size)|
+----------------+
|7809.38996780936|
+----------------+
**************************************apache 3: Wed Jun 08 15:01:32 KST 2016
+-------------+
|count(method)|
+-------------+
| 2270000|
+-------------+
**************************************apache 4: Wed Jun 08 15:01:34 KST 2016
+-------------+
|count(method)|
+-------------+
| 1646548|
+-------------+
**************************************apache 5: Wed Jun 08 15:01:34 KST 2016
+-------------+----------------+
| timestamp|count(timestamp)|
+-------------+----------------+
|1465364070000| 20200|
|1465364086000| 18100|
|1465364114000| 17300|
|1465364135000| 15600|
|1465364171000| 17100|
|1465364151000| 15800|
|1465364178000| 14500|
|1465364134000| 16100|
|1465364066000| 20000|
|1465364155000| 17000|
|1465364150000| 14700|
|1465364071000| 17000|
|1465364107000| 16700|
|1465364130000| 15000|
|1465364091000| 17600|
|1465364087000| 17100|
|1465364062000| 18400|
|1465364063000| 17400|
|1465364143000| 14400|
|1465364147000| 16600|
+-------------+----------------+
only showing top 20 rows
**************************************apache finished: Wed Jun 08 15:01:35 KST 2016
**************************************netscreen 1: Wed Jun 08 15:01:35 KST 2016
+-----------+
|count(uuid)|
+-----------+
| 129900|
+-----------+
**************************************netscreen 2: Wed Jun 08 15:01:36 KST 2016
+------------------+
| avg(duration)|
+------------------+
|32.124710799313384|
+------------------+
**************************************netscreen 3: Wed Jun 08 15:01:36 KST 2016
+--------+
|count(1)|
+--------+
| 0|
+--------+
**************************************netscreen 4: Wed Jun 08 15:01:36 KST 2016
+--------+
|count(1)|
+--------+
| 28420|
+--------+
**************************************netscreen 5: Wed Jun 08 15:01:36 KST 2016
+--------+
|count(1)|
+--------+
| 24372|
+--------+
**************************************netscreen finished: Wed Jun 08 15:01:36 KST 2016
**************************************sniper 1: Wed Jun 08 15:01:36 KST 2016
+-----------+
|count(uuid)|
+-----------+
| 132900|
+-----------+
**************************************sniper 2: Wed Jun 08 15:01:36 KST 2016
+-----------+
|count(risk)|
+-----------+
| 27605|
+-----------+
**************************************sniper 3: Wed Jun 08 15:01:36 KST 2016
+-----------+
|count(risk)|
+-----------+
| 0|
+-----------+
**************************************sniper 4: Wed Jun 08 15:01:36 KST 2016
+-----------+
|count(risk)|
+-----------+
| 36648|
+-----------+
**************************************sniper 5: Wed Jun 08 15:01:36 KST 2016
+-----------+
|count(risk)|
+-----------+
| 66690|
+-----------+
**************************************sniper finished: Wed Jun 08 15:01:36 KST 2016
**************************************apache saved
**************************************netscreen saved
Process finished with exit code -1


위의 결과는 프로그램 마지막에 실행된 쿼리 결과이다. 대체적으로 로그당 5개의 쿼리들 처리되는데 1초가 채 걸리지 않는다.
다만 apache 로그에서 group by를 사용하는 쿼리 포함 2개 정도의 쿼리들의 실행 시간이 1초 정도 걸리는 경우가 좀 빈번하게 발생하였었다.
아무래도 group by 자체가 비용이 큰 쿼리라 좀 더 시간이 걸리는 것으로 보인다.
그러나 대체적으로 쿼리 처리를 빠르게 수행함을 알 수 있었다.
아마도 각각의 쿼리를 실행 및 FiloDB에 데이터를 저장하는 부분을 akka actor로 하여 병렬처리할 수 있게 하고 FiloDB의 튜닝을 통해 더욱 빠르게 처리할 수도 있을 거라고 보여진다.

Spark 애플리케이션 EPS

그리고 spark에서 처리하는  event 개수는 다음과 같다. 대체적으로 초당 2만 EPS 내외를 오간다.

10~20분 정도 실행시켜 보았을 때, 위와 같은 EPS를 처리하면서도 spark 애플리케이션은 안정적으로 실행이 되었었다.

결론 및 향후 진행

위와 같은 테스트 결과를 보았을 때, Spark Streaming과 FiloDB를 함께 사용하였을 때의 성능이 매우 좋다고 볼 수 있다. 
노트북에 올려서 저 정도의 성능을 보인다고 하면 서버에 클러스터 모드로 실행했을 경우의 성능이 더 나아지는 거야 건 불보듯 뻔한 일이다. 
앞으로는 쿼리를 개수를 좀 더 더하고 장비에 올려서 테스트를 해보도록 할려고 한다.
또한 계속적으로 Spark Streaming과 FiloDB를 적절히 사용하여 Rule 분석 엔진을 개발할 수 있는 방법들을 마련해가고자 한다.

댓글 없음:

댓글 쓰기