Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 기초] TAG TABLE 01

1. 개요

이번 포스트에서는 실제 센서 데이터를 로딩하고, Tag Analyzer로 데이터를 시각화하는 과정을 보여드리겠습니다. 예제에 사용된 모든 데이터와 자료는 마크베이스 공식 github (https://github.com/MACHBASE)에서 다운로드 하실 수 있습니다.

2. 환경 설정

모든 실습은 리눅스 운영체제에서 실행되었습니다. 마크베이스는 5.0 버전 이상이 설치되어야 합니다. 설치에 대해 궁금하신 부분은 마크베이스 블로그와 메뉴얼을 참고해 주세요.

2-1. 데이터베이스 생성

우선 “machadmin -c”명령어로 마크베이스 데이터베이스를 생성해 주세요.

Host:~$ machadmin -c
-----------------------------------------------------------------
Machbase Administration Tool
Release Version - 5.0.2.community
Copyright 2014, MACHBASE Corp. or its subsidiaries
All Rights Reserved
-----------------------------------------------------------------
Database created successfully.
sjkim2@andrew-Precision-T1700:~$ machadmin -u
-----------------------------------------------------------------
Machbase Administration Tool
Release Version - 5.0.2.community
Copyright 2014, MACHBASE Corp. or its subsidiaries
All Rights Reserved
-----------------------------------------------------------------
Waiting for Machbase server start.
Machbase server started successfully.

그리고 MWA 프로세스도 구동시켜 주세요.

Host:~$ MWAserver start
SERVER STARTED, PID : 26385
Connection URL : http://192.168.0.148:5001

2-2. 실습 데이터 다운로드

아래의 사이트에서 실습에 사용될 데이터를 다운로드해 주세요. 데이터 파일 크기가 꽤 커서 시간이 조금 걸리니 유의해 주세요.

Host:~/work$ git clone https://www.github.com/MACHBASE/TagTutorial.git MyTutorial
'MyTutorial'에 복제합니다...
warning: https://github.com/MACHBASE/TagTutorial.git/(으)로 리다이렉트
remote: Counting objects: 22, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 22 (delta 2), reused 19 (delta 2), pack-reused 0
오브젝트 묶음 푸는 중: 100% (22/22), 완료.
Host:~/work$

2-3. 데이터 확인

데이터를 성공적으로 다운 받았다면 [MyTutorial] 디렉토리를 확인하실 수 있습니다.

Host:~/work$ cd MyTutorial/

[MyTutorial]에는 실습에 사용될 데이터들이 포함되어 있습니다.

Host:~/work/MyTutorial$ ls -al
합계 28
drwxrwxr-x 6 sjkim2 sjkim2 4096 8월 14 18:35 .
drwxr-xr-x 10 sjkim2 sjkim2 4096 8월 14 18:34 ..
drwxrwxr-x 8 sjkim2 sjkim2 4096 8월 14 18:35 .git
-rw-rw-r-- 1 sjkim2 sjkim2 13 8월 14 18:35 README.md
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 14 18:35 edu_1_basic
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 14 18:35 edu_2_plc
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 14 18:35 edu_3_plc_stream

마지막으로 모든 압축파일을 풀어 주면 모든 테스트 준비는 완성되었습니다.

Host:~/work/MyTutorial$ gunzip ./*/*.gz

3. 튜토리얼 수행

3-1. 테스트 디렉토리 확인

[MyTutorial]에 있는 [edu_1_basic] 에는 마크베이스에서 지원하는 Tag Table, Rollup Table 및 Tag Analyzer를 간단하게 테스트해 볼 수 있는 최소한의 테스트 셋이 들어 있습니다. 파일의 앞부분에 표기된 숫자는 테스트 수행 순서를 의미합니다.

Host:~/work/MyTutorial$ cd edu_1_basic/
Host:~/work/MyTutorial/edu_1_basic$ ls -al
합계 407276
drwxrwxr-x 2 sjkim2 sjkim2 4096 8월 14 18:37 .
drwxrwxr-x 6 sjkim2 sjkim2 4096 8월 14 18:35 ..
-rw-rw-r-- 1 sjkim2 sjkim2 107 8월 14 18:35 1_create_tag.sql
-rw-rw-r-- 1 sjkim2 sjkim2 92 8월 14 18:35 2_insert_meta.sql
-rw-rw-r-- 1 sjkim2 sjkim2 208509589 8월 14 18:35 3_MTAG_C00.csv
-rw-rw-r-- 1 sjkim2 sjkim2 208510104 8월 14 18:35 3_MTAG_C01.csv
-rw-rw-r-- 1 sjkim2 sjkim2 184 8월 14 18:35 3_load.sh

3-2. Tag 테이블 생성

Tag Table을 사용하기 위해서는 먼저 Tag Table을 생성해야 합니다.

Mach> select count(*) from tag;
[ERR-02025 : Table TAG does not exist.]

Tag Table은 아래 스크립트를 수행하면 자동 생성됩니다. 혹은 1_create_tag.sql 파일을 실행해 주세요.

create tagdata table tag (name varchar(32) primary key, time datetime basetime, value double summarized);

수행 결과는 다음과 같습니다.

Mach> create tagdata table tag (name varchar(32) primary key, time datetime basetime, value double summarized);
Executed successfully.
Elapsed time: 3.085

드디어 TAG 라는 테이블이 생성되었습니다. 아직 데이터가 들어있지 않은 것을 확인할 수 있습니다.

Mach> select count(*) from tag;
count(*)
-----------------------
0
[1] row(s) selected.
Elapsed time: 0.001

3-3. 내부 테이블 확인

Tag Table은 가상 테이블로서 내부적으로 많은 프로세스들을 수행합니다.  Tag Meta 데이터를 저장하는 테이블이 생성되고, 자동으로 통계 자료를 만들어주는 Rollup Table도 생성됩니다. 정말로 생성되었는지, show tables 명령어를 통해 확인해 보겠습니다.

Mach> show tables;
NAME TYPE
----------------------------------------------
TAG TAGDATA # 태그 테이블 생성
_TAG_DATA_0 KEYVALUE # 내부 태그 데이터 저장소
_TAG_DATA_1 KEYVALUE # 내부 태그 데이터 저장소
_TAG_DATA_2 KEYVALUE # 내부 태그 데이터 저장소
_TAG_DATA_3 KEYVALUE # 내부 태그 데이터 저장소
_TAG_META LOOKUP # 태그 메타 데이터 저장소
_TAG_ROLLUP_HOUR_0 LOG # 시간 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_HOUR_1 LOG # 시간 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_HOUR_2 LOG # 시간 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_HOUR_3 LOG # 시간 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_MIN_0 LOG # 분 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_MIN_1 LOG # 분 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_MIN_2 LOG # 분 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_MIN_3 LOG # 분 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_SEC_0 LOG # 초 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_SEC_1 LOG # 초 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_SEC_2 LOG # 초 단위 통계를 위한 Rollup 테이블
_TAG_ROLLUP_SEC_3 LOG # 초 단위 통계를 위한 Rollup 테이블
[18] row(s) selected.
Elapsed time: 0.001

이렇게  Tag Table, Meta Table, Rollup Table이 생성되면 Tag 데이터 분석을 위한 기반 준비가 완료된 것입니다. 모든 테이블 삭제는 DROP TABLE TAG; 명령어로 수행할 수 있습니다. 다만, 경고 메시지가 없으니 주의해 주세요.

3-4. 태그 메타 데이터 등록

태그 메타란에는 센서의 이름과 부가 정보가 등록됩니다. 사용자가 각자의 센서를 관리할 때, Tag Meta에 기록된 센서 이름과 정보를 참고하여 수많은 Tag 데이터를 간편하게 사용할 수 있습니다.내부적으로는 각 센서가 고유한 숫자 값을 가지게 되며, 이 값들이 지정된 센서명과 1:1 맵핑됩니다. 태그 메타 정보는 INSERT 구문으로 입력할 수 있습니다. (2_insert_meta.sql 를 참고해 주세요)

insert into tag metadata values ('MTAG_C00');
insert into tag metadata values ('MTAG_C01');

INSERT질의가 수행되면, MTAG_C00이라는 이름과 내부 숫자가 맵핑됩니다. 사용자는 이 이름으로 해당 Tag를 명시적으로 관리할 수 있게 되비다. INSERT의 수행 결과는 다음과 같습니다.

Mach> insert into tag metadata values ('MTAG_C00');
1 row(s) inserted.
Elapsed time: 0.001
Mach> insert into tag metadata values ('MTAG_C01');
1 row(s) inserted.
Elapsed time: 0.000

이번에는 태그 메타 테이블의 내부를 살펴보겠습니다.

Mach> select * from _TAG_META;
ID NAME
----------------------------------------------------------
1 MTAG_C00
2 MTAG_C01
[2] row(s) selected.
Elapsed time: 0.001

참고로 _TAG_META 테이블에 대한 직접적인 Insert 혹은 Update는 불가능합니다. 태그 메타 정보는 마크베이스의 내부 시스템에 의해서 아이디와 부가 정보가 관리되기 때문입니다. 반드시 insert into tag metadata values(…)구문을 사용해서 입력해야 합니다.

만약 조작이 반드시 필요한 경우에는 내부 ID 정보와 실제 이름 정보가 틀려지지 않도록 조심해야 합니다.

3-5. Tag 테이블 속성 테스트 

이제 데이터 입력을 위한 모든 준비 작업이 끝났습니다.

Mach> desc tag;
[ COLUMN ]
----------------------------------------------------------------
NAME TYPE LENGTH
----------------------------------------------------------------
NAME varchar 32
TIME datetime 31
VALUE double 17

이제 실제로 TAG 테이블에 데이터가 있는지 살펴보겠습니다.

Mach> select * from TAG;
[ERR-02265 : Reading TAGDATA table without primary key condition is not allowed.]

그러나 위와 같이 조건절 없이 TAG에 대한 직접적인 접근은 허용되지 않습니다.  반드시 TAG의 이름 칼럼 (NAME)을 지정해야 해당 TAG의 데이터가 연속적으로 출력됩니다. 다만, 사용상의 편의를 위해 1) 전체 Tag 레코드의 개수를 얻는 경우와 2) 최소, 최대 시간을 얻는 경우는 예외로 허용하고 있습니다.

Mach> select count(*) from tag; # 전체 0건이 입력되었다.
count(*)
-----------------------
0
[1] row(s) selected.
Mach> select min(time), max(time) from tag; # 아직 입력된 레코드가 없으므로 NULL로 출력
min(time) max(time)
-------------------------------------------------------------------
NULL NULL
[1] row(s) selected.

이번에는 직접 이름을 지정하여, Tag 데이터를 불러오겠습니다.

Mach> select * from tag where name = 'MTAG_C00';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
[0] row(s) selected.
Elapsed time: 0.001
Mach> select * from tag where name = 'MTAG_C01';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
[0] row(s) selected.
Elapsed time: 0.001

3-6. Tag 테이블 데이터 로딩

이제 실제 Tag 데이터를 로딩하여 데이터를 확인해 보겠습니다. 이 데이터들은 약 12시간 동안의 센서 데이터를 모아 놓은 것입니다. 사용된 센서는 다음과 같은 특징을 가지고 있습니다.

  • 매초 마다 한 번씩 동작
  • 1 밀리 세컨드 단위로 100번 데이터 후, 다음 초까지 대기
파일명3_MTAG_C00.csv3_MTAG_C01.csv
레코드 개수4178504 건4178504 건
데이터 종류실수형 압력 센서 데이터실수형 압력 센서 데이터
수집 형태매초1ms 간격으로 100회 센싱매초1ms 간격으로 100회 센싱


아래와 같이 csvimport를 사용하면 csv의 데이터를 빨리 로딩할 수 있습니다.

csvimport -t TAG -d 3_MTAG_C00.csv -F "time YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" -l error.log
csvimport -t TAG -d 3_MTAG_C01.csv -F "time YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" -l error.log

실행 결과는 다음과 같습니다.

Host:~/work/MyTutorial/edu_1_basic$ sh 3_load.sh
-----------------------------------------------------------------
Machbase Data Import/Export Utility.
Release Version 5.0.2.community
Copyright 2014, MACHBASE Corporation or its subsidiaries.
All Rights Reserved.
-----------------------------------------------------------------
NLS : US7ASCII EXECUTE MODE : IMPORT
TARGET TABLE : TAG DATA FILE : 3_MTAG_C00.csv
LOG FILE : error.log IMPORT_MODE : APPEND
FILED TERM : , ROW TERM :

ENCLOSURE : " ESCAPE : "
ARRIVAL_TIME : FALSE ENCODING : NONE
HEADER : FALSE CREATE TABLE : FALSE
Progress bar Imported records Error records
4178504 0
Import time : 0 hour 0 min 9.831 sec
Load success count : 4178504
Load fail count : 0
-----------------------------------------------------------------
Machbase Data Import/Export Utility.
Release Version 5.0.2.community
Copyright 2014, MACHBASE Corporation or its subsidiaries.
All Rights Reserved.
-----------------------------------------------------------------
NLS : US7ASCII EXECUTE MODE : IMPORT
TARGET TABLE : TAG DATA FILE : 3_MTAG_C01.csv
LOG FILE : error.log IMPORT_MODE : APPEND
FILED TERM : , ROW TERM :

ENCLOSURE : " ESCAPE : "
ARRIVAL_TIME : FALSE ENCODING : NONE
HEADER : FALSE CREATE TABLE : FALSE
Progress bar Imported records Error records
4178504 0
Import time : 0 hour 0 min 10.58 sec
Load success count : 4178504
Load fail count : 0

3-7. Tag 테이블 확인

이제 데이터를 입력하였으니 잘 동작하는지 콘솔로 Tag 테이블  확인해 보겠습니다.

Mach> select count(*) from TAG;
count(*)
-----------------------
8357008 <====== 입력된 태그 레코드 건수
[1] row(s) selected.
Elapsed time: 0.000
Mach> select min(time), max(time) from TAG;
min(time) max(time)
-------------------------------------------------------------------
2009-01-28 07:03:34 000:000:000 2009-01-28 18:40:04 019:000:000 <== 최소, 최대 시간 범위
[1] row(s) selected.
Elapsed time: 0.007

MTAG_C00 이름의 태그에 데이터가 있는지 확인해 보겠습니다.

Mach> select count(*) from TAG where name = 'MTAG_C00';
count(*)
-----------------------
4178504
[1] row(s) selected.
Elapsed time: 1.128

4178504개의 데이터가 있어, 10개의 데이터만 보겠습니다.

Mach> select * from TAG where name = 'MTAG_C00' limit 10;
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
MTAG_C00 2009-01-28 07:03:34 000:000:000 -41.98
MTAG_C00 2009-01-28 07:03:34 001:000:000 -46.5
MTAG_C00 2009-01-28 07:03:34 002:000:000 -36.16
MTAG_C00 2009-01-28 07:03:34 003:000:000 -50.36
MTAG_C00 2009-01-28 07:03:34 004:000:000 -37.3
MTAG_C00 2009-01-28 07:03:34 005:000:000 -48.43
MTAG_C00 2009-01-28 07:03:34 006:000:000 -46.17
MTAG_C00 2009-01-28 07:03:34 007:000:000 -42.78
MTAG_C00 2009-01-28 07:03:34 008:000:000 -40.85
MTAG_C00 2009-01-28 07:03:34 009:000:000 -55.68
[10] row(s) selected.
Elapsed time: 0.029

3-8. 시간 범위 검색

시계열 데이터베이스인 만큼 시간 범위 검색을 해보겠습니다. 먼저 그날 12시에서 13시 까지의 데이터 수를 알아보겠습니다.

Mach> select count(*) from TAG where name = 'MTAG_C00' and TIME between TO_DATE('2009-01-28 12:00:00') and TO_DATE('2009-01-28 13:00:00') limit 10;
count(*)
-----------------------
360005
[1] row(s) selected.
Elapsed time: 0.106

다음으로 10개의 데이터만 검색하는 모습입니다.

Mach> select * from TAG where name = 'MTAG_C00' and TIME between TO_DATE('2009-01-28 12:00:00') and TO_DATE('2009-01-28 13:00:00') limit 10;
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
MTAG_C00 2009-01-28 12:00:00 000:000:000 2636.77
MTAG_C00 2009-01-28 12:00:00 001:000:000 2634.44
MTAG_C00 2009-01-28 12:00:00 002:000:000 2627.94
MTAG_C00 2009-01-28 12:00:00 003:000:000 2624.83
MTAG_C00 2009-01-28 12:00:00 004:000:000 2627.68
MTAG_C00 2009-01-28 12:00:00 005:000:000 2626.39
MTAG_C00 2009-01-28 12:00:00 006:000:000 2633.4
MTAG_C00 2009-01-28 12:00:00 007:000:000 2630.28
MTAG_C00 2009-01-28 12:00:00 008:000:000 2630.8
MTAG_C00 2009-01-28 12:00:00 009:000:000 2634.7
[10] row(s) selected.
Elapsed time: 0.032

4. 데이터 시각화

이렇게 입력된 데이터에 대해 Rollup Table이 내부적으로 생성됩니다. 이것은 MWA의 Tag Analyzer 메뉴를 통해서 바로 확인할 수 있다. 웹을 통해 포트 5001로 접속해 주세요.

  • ID : admin
  • PW : machbase

Tag Analyzer로 다음과 같은 차트를 만들 수 있습니다.

(Tag Analyzer 영상 : https://youtu.be/vobLvDLJ0fU)

5. 마치며

이상으로 간단하게 Tag 데이터를 로딩하고 Tag Analyzer로 시각화한 것을 보여드렸습니다. 마크베이스의 센서 데이터 처리에 대한 개념과 방법을 이해하고 적극 활용해 보시기 바랍니다.

Contact the Machbase team with your questions!
info@machbase.com

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을