티스토리 뷰

마침 빅데이터 강의 과제를 하는 도중에 재미있는 주제가 있어서 한번 소개해보고자 한다.

미국 Florida에 보면 흔히 잘 알고 있는 NASA 우주센터가 있다. 그런데 사실 여기는 우주에 관해서만 연구하는 장소만 있는게 아니라 WWW 서버가 있는 곳이기도 하다. 다시 말해 미국에서 인터넷 연결을 되어 있는 곳이라면 이 서버를 거쳐서 원하는 정보를 주고 받게 되는 것이다. 당연히 이 서버로 들어오는 정보는 사용자가 어디로 request를 하는지, 최종적인 목적지(endpoint), 그리고 그 페이지를 접속했을 때 받은 request code 등이 있겠다. (이 모든게 HTTP 프로토콜 안에 정의되어 있다.) 물론 이 정보를 활용하게 된다면 사람들이 어떤 페이지에 많이 접속하는지, 혹은 어떤 페이지에 접근했을 때 연결성이 좋은지, 또는 어떤 페이지에 스파이웨어가 있다던지 같은 새로운 정보로 가공할 수 있게 될 것이다.

 문제는 이렇게 가공하고자 하는 데이터를 만들기 위해서는 그만큼 많은 데이터가 필요하고, 이걸 개인용 데스크탑으로 처리하기에는 한계가 있다는 것이다. 그래서 이런 정보를 처리하는데 Apache Spark와 같은 분산 처리 시스템을 쓸 수 있다는 것을 보여주는게 이번 강의 과제의 목표였다. 참고로 예제로 사용한 데이터는 NASA-HTTP라고 이름 붙여진 정보를 사용했고, 여기에는 1995년 8월 한달동안 수집된 정보를 담고 있었다. 이 데이터에 관심있는 사람은 한번 여기에 들어가보길..


 아무튼 내부적으로는 Scala나 Python을 쓸 수 있는데, 강의에서는 주로 python을 쓰면서 pySpark에서 제공하는 API를 이용해서 진행한다. 물론 scala도 하려면 할 수 있겠지만, python이 조금더 모르는 사람이 배우기엔 쉽고, 적용하는 면에서의 이점에서 선택한게 아닌가 싶다. 사실 내가 생각하기에 이런 언어들이 분산처리에 쓸수 있었던 이유는 바로 lambda expression을 지원해서가 아닐까 싶다. 거창하게 말하기는 좀 뭐하지만, python이나 scala는 lambda expression을 통해서 쉽게 pattern matching을 하고 그 데이터를 map()같은 걸 써서 데이터를 정리할 수 있다. 잠깐 예를 들면 다음과 같은게 있다.

 

이 코드르 만드는 사람이 Spark를 통해서 수집하는 데이터의 타입만 알고 있으면 그 데이터를 다시 정리해서 또 처리할 수 있다는 것이다. 첫번째로 나온 코드는 수집되는 데이터가 (key, value)의 형태로 들어오는 일종의 tuple인 것을 알고 있고, 그 중에서 key 값만 따로 빼서 list로 만드는 코드가 되겠다. 두번째로 나온 코드 역시 첫번째와 같이 받은 데이터 중 y값을 이용해서 다시 list로 정리하는 게 되는데, 이걸 C로 하려면 일일이 데이터가 어떤 타입인지 분석하고, 이걸 for loop를 돌리던지 MPI를 써서 병렬로 처리하던지 해서 패턴 매칭을 하는 등 조금 복잡한 과정을 거쳐야 한다. 하지만 이런식으로 쓰게되면 그냥 딱 한줄만 가지고 이런 정보 처리를 병렬적으로 쉽게 할 수 있다는 것이다.


 이런게 실제로 돌아가는지를 확인해보려면 sparkshell이라는 것을 확인하면 된다. 이걸 통해서 어떤 task가 얼마나 돌았고, 왜 실패했는지에 대한 이유도 알 수 있다.



 아무튼 이런 기능들을 잘 활용하면 다음과 같은 것을 처리할 수 있다.



어차피 이 모든게 하나의 텍스트 형식으로 전달되다보니 parsing을 통해서 fail이 나는 부분도 찾을 수 있고,


이런식으로 전체 request 중 어떤 code를 나왔는지의 분포도 알 수 있다. 참고로 ipython notebook 내에서는 위와 같이 matplotlib을 사용해서 데이터도 시각화 할 수 있다. 이 부분이 분산처리와 관련이 있는건 아니지만 그래도 일반 사람에게 데이터 정보를 전달할때 있어서 이런 시각화 요소도 중요하다는 건 말할 필요가 없다.


 앞에서 말했던 것처럼 access fail이 발생하는 웹 페이지 중 상위 10개만도 추출 할수 있고, 


매일 접근하는 Host의 수, 시간당 평균 접속수, 404 Error가 발생하는 페이지 수도 정보를 가공해서 위와 같이 그래프로 출력할 수 있다.


 이제 이 툴을 써본지 딱 2주가 지났고, 아직도 apache spark의 동작원리가 확실하게 잡힌 건 아니지만, 하나씩 써보면서 "우와 이런것도 되는구나" 하면서 하나씩 배워나가고 있다. 특히 python을 이용해서 과제를 하다보니까 그만큼 언어 접근에 대한 어려움도 없고, 그만큼 시간도 절약할 수 있는 듯하다. 주변에서도 이 강의를 듣는 사람도 있고, 블로그 중에도 spark와 관련해서 개발 이야기를 하는 곳이 있는데, 잘 찾아보고 좀 더 다른 영역으로 활용해보면 좋을 거 같다.

'Study > AI' 카테고리의 다른 글

[R] Basic DataType  (0) 2015.08.06
[ML] Million Song Dataset  (0) 2015.07.26
[Big Data] Data Cleaning & Integration  (0) 2015.07.26
[Big Data] Apache Spark를 이용한 과제 수행  (0) 2015.06.06
[R] Generate Heatmap using ggmap  (0) 2015.05.24
[MOOC] Tackling the challenges of Big data  (0) 2015.05.07
[Machine Learning] Watson in Jeopardy  (0) 2015.04.11
댓글