사내에서 출입관리시스템으로 세콤을 사용하고 있다. 

세콤에서 지급한 카드를 태그하면 출입문이 열리는 식이다. 

출입문 옆에는 세콤의 단말기가 있고 여기에 카드를 태그하면 사내에 있는 세콤 서버에 태그정보가 저장이 된다.

세콤에서 제공하는 전용프로그램으로 이 세콤 서버에 접속을 하면 출입기록을 조회할 수 있다.

 

이 태그 기록을 이용하면 직원들의 근태기록을 관리할 수 없을까 하는 생각을 했다.

그래서 다른곳에서는 어떻게 사용하는지 검색해보았다.

 

찾아보니 유료로 제공되는 솔루션들이 많았다.

상용 그룹웨어 대부분에서 세콤의 출입기록과 근태관리 시스템의 연동을 지원하고 있었다.

 

하지만 여러가지 이유로 연동을 직접 구축 하기로 정하였다.

 

 

근태정보 파일 가져오기

세콤에서는 출입기록을 어디에 남기는지 찾아보았다. 

  1. 세콤 서버에 접속하는 방법 : 접속 방법 자체를 알기 힘들어서 포기.

  2. 세콤 전용프로그램 : 전용프로그램에서 기록을 남기는 폴더가 따로 있었다. 이곳의 파일을 가져오기로 결정!

세콤 전용프로그램에서 남기는 파일 중 아래 위치에서 출입기록이 담겨있었다.

세콤설치폴더/DataBase/MainDB/Alarm/ALARM_YYYYMMDD.VMD

 

이곳에 있는 VMD 파일은 MdbPlus 라는 프로그램을 이용하여 오픈하였다.

http://www.alexnolan.net/software/mdb_viewer_plus.htm

 

이 VMD 파일은 MS Access 형식으로 되어있다. 

 

JAVA에서 JDBC를 이용해 MS Access 형식의 파일DB 에 접속하여 데이터를 가져가기 위해서 ucanaccess 라는 라이브러리를 이용하였다.

아래는 ucanaccess 라이브러리를 메이븐에서 추가하기 위한 코드이다.

<dependency>
  <groupId>net.sf.ucanaccess</groupId>
  <artifactId>ucanaccess</artifactId>
  <version>4.0.2</version>
</dependency>

 

VMD 데이터 사용하기

vmd 파일을 열어보면 다양한 컬럼들이 있다. 

이중에 시간, 카드번호, 고유값 정도의 정보를 확인하여서 사용중이다.

단말기 이름 등 정보가 다양하게 들어가 있으니 필요에 따라 더 가져다가 사용해도 좋을것이다.

 

id : 고유값. 1개의 VMD 파일 안에서만 고유한듯.

atime : 태그한 시간

cardnum : 카드 고유번호

 

결론으로 다가가자.

파일DB에 접속해서 쿼리를 보내고 결과를 받아오는 코드이다.

try {

  String secomQuery = "SELECT [ID],[ATime],[CardNum],[EqCode],[Master],[Param],[Ack],[AckUser],[AckTime]," +

       "[AckContent],[Transfer],[State]FROM [Alarm] ORDER BY [ATime]";

  String conUrl = "jdbc:ucanaccess://C:\[세콤설치위치]\DataBase\MainDB\Alarm\ALARM_날짜.VMD";

  Connection conn = DriverManager.getConnection(conUrl);

  Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

          ResultSet.CONCUR_READ_ONLY);

  ResultSet rs = s.executeQuery(secomQuery);

  while (rs.next()) {

    //가져온 결과를 처리하는 로직..

  }

} catch (UcanaccessSQLException ex) {
  //파일DB 연결 및 쿼리 관련 Exception 처리
} catch (Exception ex) {
  //일반 Exception 처리
}

rs 에 받아온 결과를 가져다가 처리하면 된다. 

나의 경우는 이걸 30초에 한번씩 호출하고 있다.

 

가져온 정보는 별도 DB에 저장하고, 저장한 내역을 토대로 새로 들어온 데이터만 쌓고 있다.

[ID] 컬럼은 파일(1일치)안에서 고유한 값이니, 날짜 정보와 함께 저장해 두었다가 중복검사 할 때 활용하면 좋다.

Posted by panpid

댓글을 달아 주세요

  1. 2020.09.10 17:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2020.10.28 14:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 2020.12.15 15:52  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

최근접 이웃법은 새로운 데이터를 입력받았을 때 가장 가까이 있는 것이 무엇이냐를 중심으로 새로운 데이터의 종류를 정해주는 알고리즘이다.

그림에서 보는것 처럼 기존 데이터가 파랑색과 주황색으로 데이터가 분류되었다고 한다면 물음표 데이터가 들어왔을때 이 데이터는 어떤 색상으로 분류가 되어야 할까?

 

최근접 이웃법 말그대로 가까운 것에 따른 분류이기 때문에 주황색으로 분류 할 것이다 . 정말 간단하고 직관적인 알고리즘 이다. 하지만 단순히 가장 가까이에 있는 것으로 분류를 하는것이 문제가 되는 경우도 있다.

 

다음의 경우를 살펴 보자.

 

knn

이번에는 문제가 약간 복잡해 진다. 이론대로 라면 가장 가까운 것은 파란색이기 때문에 파란색으로 분류를 해야 할것 같지만, 주변을 보면 대부분 주황색이 보인다. 왠지.. 파랑색으로 분류하면 안될 것 같다는 생각이 든다....

 

따라서 단순히 가까운것에 따른 분류에서 주변에 있는 몇개의 것들중에 많은 것으로 분류하게 되면 이 문제는 어느정도 해결이 된다.

 

물음표 주변(큰원)에는 4개의 데이터가 있는데 그중 세개가 주황색, 한개가 파랑색 이다. 가장 많은 색인 주황색으로 물음표는 분류가 된다.

 

그렇다면 주변의 범위 즉 주변 데이터의 갯수에 대한 기준이 있어야 할 것 같은데.. 위에서는 4개로 정하였다. 즉 K=4가 되는 최근접 이웃법이 된다. 그래서 KNN 알고리즘 이라고 하는 것이다.

knn

만약 K=1로 한다면 처음 정의했던 것처럼 물음표는 가장 가까운 한개의 요소만 바라보게 될 테니 파랑색으로 분류를 하게 될 것이다. 즉, K의 값에 따라 물음표가 어느 범주로 분류 될 것인지가 결정 된다.

 

그럼 과연 K는 몇이어야 좋은 것일까? 최선의 K값을 선택하는 것은 데이터마다 다르게 접근해야 한다.

실습

간단하게 mglearn 라이브러리에 있는 데이터셋을 이용하여 실습해 보자.

(mglearn : 그래프와 데이터셋을 손쉽게 다루기 위한 샘플데이터 라이브러리)

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import mglearn

mglearn.plots.plot_knn_classification(n_neighbors=3)

결과

knn

n_neighbors=3 즉 K=3으로 할 경우 테스트 데이터가 어느 분류로 될지를 보여주는 그래프이다.

앞에서 설명했듯이 가장 가까운 3개의 점들에 의해 분류가 결정이 된다.

여기서는 세개의 별이 테스트로 들어온 데이터고 결과적으로는 두개는 주황색, 한개는 파랑색으로 분류가 되었다.

mglearn.plots.plot_knn_classification(n_neighbors=3)

결과

knn

만약 n_neighbors=1 즉 K=1으로 할 경우 다른 결과를 얻게 된다.

mglearn의 make_forge 함수를 이용하여서 data와 target을 x와 y에 대입하여 해당 데이터로 모델을 만들고 검증해보자.

from sklearn.model_selection import train_test_split
x, y = mglearn.datasets.make_forge()

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

mglearn.discrete_scatter(x[:, 0], x[:, 1], y)

결과

knn

from sklearn.neighbors import KNeighborsClassifier
knn_classifier = KNeighborsClassifier(n_neighbors=3)

knn_classifier.fit(x_train, y_train)

print("테스트 데이터 예측 : {}".format(knn_classifier.predict(x_test)))
print("테스트 데이터 정확도 : {}".format(knn_classifier.score(x_test, y_test)))
테스트 데이터 예측 : [1 0 1 0 1 0 0]
테스트 데이터 정확도 : 0.8571428571428571

정확도는 약 86%

이 말은 모델이 테스트 데이터셋에 있는 데이터들중 86%를 제대로 맞췄다는 의미이다.

실제 핵심 로직은 sklearn에서 제공해 주고 있기 때문에 코드는 굉장히 간단해 보일 것이다.

K-NN알고리즘은 지도학습의 분류 알고리즘의 하나로 로직이 간단하여 구현하기 쉽다. 하지만 학습 모델이 따로 없고, 전체 데이터를 스캔하여 데이터를 분류하기 때문에 데이터의 양이 많아지면 분류 속도가 현저하게 느려진다. 그래서 K-NN알고리즘을 게으른 알고리즘 이라고도 한다.

Posted by @위너스

댓글을 달아 주세요

[스파크(Spark)] #1. 개요

[스파크(Spark)] #2. 용어 및 개념

[스파크(Spark)] #3. 구조적 API 개요 및 기본 연산

 

빅데이터 처리 분야에서 아파치 스파크(Spark)가 빠르게 확장되고 거의 표준이 되어가고 있다. 

앞으로 대용량 데이터의 가공이나 실시간 처리 및 분석에 필요하다고 판단되어 알아보게 되었다. 

스파크 관련 책 및 공식 문서를 보고 진행하기로 한다. 

등장배경

이전에 CPU 등 하드웨어 성능은 해를 거듭할수록 수치적으로나 체감으로도 눈에 띄게 발전하였다. 보통 2년마다 데스크탑을 조립해서 바꿨을 정도였다. 하지만 2005년쯤부터는 물리적인 한계로 인하여 성능향상은 점점 둔화하게 된다. 이때부터 하드웨어 엔지니어들은 모든 코어가 같은 속도로 동작하는 병렬 CPU 코어를 추가하는 방향으로 선회하였다. 

반면 데이터를 저장하는 비용은 1년마다 약 절반씩 줄고 있고, 웹캠이나 센서 등등 데이터 수집하는 장비 비용도 점점 저렴해지고 있다. 결과적으로 데이터 수집 및 저장 비용은 극히 저렴해졌지만, 데이터를 처리해야 하는 양은 점점 거대화되어 간다.

전통적인 처리 방법으로는 처리가 늦어지고 점점 불가능해짐으로써 새로운 처리 엔진과 프로그래밍 모델이 필요했다. 

이런 문제를 해결하기 위하여 아파치 스파크가 탄생하게 되었다. 

아파치 스파크란?

여러가지 명칭이 있지만 통합 컴퓨팅 엔진으로 정리하면 될 듯 하다. 

  • 클러스터 환경에서 데이터를 병렬 처리하는 라이브러리 집합
  • 분산 클러스터 컴퓨팅 프레임웍
  • 대용량 데이터를 처리하는 인메모리 기반 고속 처리 엔진

철학

철학은 통합과 컴퓨팅 엔진으로 구분된다. 

통합

 

"빅데이터 애플리케이션 개발에 필요한 통합 플랫폼을 제공하자." 가 핵심 목표이다. 

데이터 읽기, SQL 처리, 스트림 처리, 머신러닝까지 다양한 작업을 같은 연산 엔진과 일관성 있는 API로 수행할 수 있도록 설계되었다. 

즉  "스파크 하나로 모든 처리를 마무리하자!" 이런 철학이 스파크의 큰 장점이다.

컴퓨팅 엔진

 

스파크는 영구 저장소 역활은 수행하지 않고 데이터를 연산하는 역활 수행한다. 

즉 "처리에만 집중하자!"

대신 클라우드 스토리지 및 파일시스템(HDFS), Key-Value Store(카산드라), 메시징 서비스(Kafka) 등 다양한 스토리지를 지원한다. 

 

역사

2009년 UC버클리 대학교에서 Spark : Cluster Computing with Working Sets 내용으로 연구가 시작되었고, 2010년 논문 발표로 알려진다. 

  • 2013년 스파크 1.0 발표, 아파치 프로젝트 선정
  • 2014년 스파크 2.0 발표, 아파치 최상위 프로젝트 선정
  • 2019년 스파크 2.3.3 released

1.0 과 2.0 사이에서는 연산처리 성능 개선과 DataSet과 DataFrame API 병합으로 인한 ETL이 주요 초점이었다.

라이브러리

오픈소스 기반이기 때문에 자체 라이브러리 포함 외부라이브러리 지원한다. 

아래 4종류의 자체 라이브러리를 가지고 있고, 자세한 부분은 차차 알아보도록 한다. 

  • Spark SQL
  • Spark Streaming
  • MLlib
  • GraphX 

지원언어

프로그래밍을 지원하는 언어는 Scala, Java, Python, R이다. 

익숙한 Java로 스파크 공부를 진행하려 했으나 코드가 다른 언어보다 길어 Python으로 진행하기로 한다. 

실행환경

실행할 수 있는 환경은 하나의 노드부터, 수천 대의 서버 클러스터까지 가능하다. 

스파크는 인 메모리 기반의 병렬 처리가 특기이므로 클러스터 환경에서 실행하는 것이 유리하다. 

 

아키텍처

 

스파크 아키텍처를 논리적으로 도식화 해보았다. 

  • Storage : 스파크가 연산을 실행해야 할 데이터 저장소 연결
  • Management : 클러스터 실행 환경 관리
  • Engine : RDD, DataFrame, DataSet에 연산을 명령하여 데이터를 처리하는 작업을 수행
  • Library : 스파크 자체 라이브러리
  • Programing : 지원언어

사례

넷플릭스 (Netflix), 야후 (Yahoo), 이베이 (eBay)와 같은 회사에서 8,000개 이상의 노드 클러스터에서 여러 페타바이트의 데이터를 종합적으로 처리하면서 대규모로 스파크를 사용하고 있다. 

마치며

스파크의 기본적인 개요에 대해서 알아보았다. 

다음에는 스파크가 기본 기능에 대해서 살펴본다. 

 

 

Posted by 사용자 피랑이
TAG Spark

댓글을 달아 주세요

변화경영연구소의 소장이셨던 고 구본형 선생의 유명한 책인 '익숙한 것과의 결별'에서는 다음과 같은 내용이 있다.



비전을 제대로 이해하기 위해서는 건축물을 연상하는 것이 가장 완벽한 동질성을 부여한다.

 

비전은 '미래의 설계도'라고 말하는 사람들이 많다.

그러나 나는 그 생각에 강하게 반대한다.

그것을 설계도라고 해석하는 데서부터 많은 오류가 발생한다는 것을 알고 있기 때문이다.

 

설계도는 전문가들을 위한 것이다.

보통 사람은 설계도를 보고 그 건물의 전체적 모습을 떠올릴 수 없다.

그것은 판독하기 어려운 수치와 기호일 뿐이다.

 

비전은 이해관계자 모두가 쉽게 그 모습을 머릿속에 떠올릴 수 있어야 하며,

그 모습의 아름다움 때문에 마음이 설레야 한다. 따라서 비전은 오히려 건물의 조감도와 흡사하다.

 

건물의 유려한 자태와 자재의 질감이 느껴져야 한다.

그리고 그 건물 속의 한 부분을 줌업시키면 그 속에 앞으로 자신이 거주하고 생활할 새로운 공간이 보인다.

 

이 건물이 만들어지면 이 아름다운 곳으로 이사올 것이다.

어둡고 추운 지금의 공간을 떠나 밝고 넓고 전망이 좋은 공간에서 생활하게 될 것이다. 



비전에 대해 설명하는 내용이지만, 문득 아키텍처의 출발점이 이와 같지 않을까 하는 생각이 든다.

 

IT 시스템을 위한 아키텍처의 1차적 목표 역시, 대형의 복잡한 시스템에 대한 합리적으로 이해가능한 청사진을 제공하는데 있다.

 

여기서 '이해가능한'의 대상은 시스템 구축에 참여하는 모든 이해관계자로 볼 수 있으며, 이 중 핵심 이해관계자는 바로 고객이 되므로 고객이 이해가능한 시스템의 청사진이어야 한다.

 

고객이 이해한다는 것은, 고객의 요구사항을 합리적으로 해결하는 청사진을 제공하는 것이며, 아키텍처 드라이버라는 용어로 불리우는 아키텍처 결정요인 중 비기능 요구사항에 해당하는 품질속성을 만족시키는 아키텍처가 훌륭한 아키텍처인 것이다.

 

품질속성이라는 것도 가용성/성능/보안/유지보수성과 같은 시스템적인 부분도 있지만, TimetoMarket/시스템수명/가격 등 비지니스적인 부분도 고려되어야 한다.

 

따라서 고객의 관점에서 비기능요구사항에 대한 만족스러운 청사진을 제공하는 것은 IT전문가들만 이해가능한 복잡한 설계도가 아닌 전체 조감도가 더 아키텍처에 근접한 것이 아닐까 한다.

 


다음 그림은 아파트 건축물의 조감도이다.

 

아파트는 주거공간이라는 가장 기본적인 기능적 요구사항 외에도 고객의 선택에 더욱 중요한 변수인 주변생활여건, 녹지공간, 전망, 해가 들어오는 방향, 역세권 등의 품질속성이 매우 중요한 축을 차지한다. 이런 요건은 전문 설계도 보다는 아래 그람과 같은 조감도가 더욱 많은 얘기를 해 준다.

 


물론 이해관계자 모두가 제시된 청사진을 기반으로 작업을 진행해야 하기에 설계자, 개발자, 유지보수자와 같은 IT전문가들이 아키텍처가 설계한 원칙을 준수하는데 동참시키기 위해서는 다양한 설계의 측면을 고려해야 한다. 그래서 아키텍처 뷰의 가이드로써 OMG의 4+1View, CMUSEI의 3View, 지멘스의 4View 같은 참조모델이 존재한다.

 

 


다음 그림은 아파트의 특정 가구에 대한 설계도이다.

이 설계도는 개별 세대의 방구조와 배치, 동선 등을 표현하는 좀더 세부적인 아키텍처에 해당한다. 또한 전문적인 기호와 수치는 또 다른 이해관계자(설계자, 시공업자 등)를 위해 제공되는 정보 상세한 설계 기준으로 사용된다.

 


현대 건축의 아버지라 불리우는, '르 코르뷔지에'는 다음과 같은 말을 했다고 한다.


 

우리는 돌, 나무, 시멘트를 사용하여 집을 짓고 건물을 만든다.

이것은 건축이다.

 

그런데 문득 그것이 내 마음을 사로잡고, 나를 감동시킨다.

그 순간 행복한 나는 이렇게 말한다.

 

"아~ 아름답군!". 아키텍처(Architecture)란 그런 것이다.

 

- 르 코르뷔지에, 19123 "Architecutre: From Prehistory to Post-Modernism"


 

IT 개발의 많은 요소들이 건축의 그것에서 차용되어왔다. IT 아키텍처 역시 건축물의 아키텍처 사상에 근원하고 있으며, 아키텍트라면 르 코르뷔지에와 같은 마인드를 가져야 하지 않을까 한다.

 

마지막으로 앞의 구본형 소장의 글을 SW아키텍처에 비유해 다음과 같이 무단 변경해 본다. 

 



SW아키텍처를 제대로 이해하기 위해서는 건축물을 연상하는 것이 가장 완벽한 동질성을 부여한다.

 

SW아키텍처는 '시스템의 설계도'라고 말하는 사람들이 많다.

그러나 나는 그 생각에 강하게 반대한다.

 

그것을 설계도라고 해석하는 데서부터 많은 오류가 발생한다는 것을 알고 있기 때문이다.

설계도는 전문가들을 위한 것이다.

 

보통 사람은 설계도를 보고 그 건물의 전체적 모습을 떠올릴 수 없다.

그것은 판독하기 어려운 수치와 기호일 뿐이다.

 

SW아키텍처는 이해관계자 모두가 쉽게 그 모습을 머릿속에 떠올릴 수 있어야 하며,

그 모습의 아름다움 때문에 마음이 설레야 한다.

 

따라서 SW아키텍처는 오히려 건물의 조감도와 흡사하다.

소프트웨어의 유려한 자태와 추상화된 고품질의 질감이 느껴져야 한다.

 

그리고 그 시스템 속의 한 부분을 줌업시키면 그 속에 서브 시스템이 생활할 새로운 공간이 보인다.

 

이 시스템이 만들어지면 이 아름다운 것을 사용할 것이다.

어둡고 추운 지금의 시스템을 떠나 밝고 넓고 전망이 좋은 시스템을 활용하게 될 것이다.



 

'프로젝트 관리' 카테고리의 다른 글

아키텍처의 출발점  (0) 2019.04.04
Core/Context 모델  (0) 2019.03.22
Tuckman의 팀 발달 모델  (0) 2019.03.08
Posted by 사용자 박종명

댓글을 달아 주세요