마크베이스(Machbase) 샘플 데이터 입력과 조회
설치와 서버 구동, 클라이언트 유틸리티로 서버에 접속하는 방법까지 아래의 포스팅으로 안내를 했다. 이제는 실제로 어떻게 Machbase를 사용해야 할지, 샘플 데이터와 쿼리를 통해 감을 잡아보도록 한다. Machbase는 초고속 입력을 경험할 수 있도록 ‘1분 안에 CSV 파일 로딩하기‘ 라는 1분 튜토리얼 예제를 제공하고 있다.
테스트 환경
- CPU : Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
- Memory : 8GB DDR4
- Disk : Samsung SSD 300G
- OS : Ubuntu 14.04
테스트 위치
$MACHBASE_HOME/tutorials/csvload
로 가면 쿼리와 쉘 스크립트 파일이 있는 것을 볼 수 있다.
$ ls -al total 127692 drwxrwxr-x. 2 machbase machbase 4096 Aug 18 17:14 . drwxrwxr-x. 11 machbase machbase 4096 Aug 18 17:14 .. -rw-rw-r--. 1 machbase machbase 246769 Aug 18 17:14 awards.csv -rw-rw-r--. 1 machbase machbase 259 Aug 18 17:14 create_sample2_table.sql -rw-rw-r--. 1 machbase machbase 231 Aug 18 17:14 create_sample_table.sql -rwxrwxr-x. 1 machbase machbase 60 Aug 18 17:14 load_awards.sh -rwxrwxr-x. 1 machbase machbase 474 Aug 18 17:14 load_sample2.sh -rwxrwxr-x. 1 machbase machbase 486 Aug 18 17:14 load_sample.sh -rw-rw-r--. 1 machbase machbase 130477124 Aug 18 17:14 sample_data.csv
sample_data.csv
를 열어보면 샘플 데이터 들어있는데, 웹 로그 형태의 데이터가 100만 줄인 것을 확인할 수 있다. 이걸 데이터베이스에 입력해 보도록 한다.
$ head sample_data.csv 2015-05-20 06:00:00,63.214.191.124,2296,122.195.164.32,5416,12,GET /twiki/bin/view/Main/TWikiGroups?rev=1.2 HTTP/1.1,200,5162 2015-05-20 06:00:07,212.237.153.79,6203,71.129.68.118,8859,67,GET /twiki/bin/view/Main/WebChanges HTTP/1.1,200,40520 2015-05-20 06:00:07,243.9.49.80,344,122.195.164.32,6203,46,GET /twiki/bin/view/Main/TWikiGroups?rev=1.2 HTTP/1.1,200,5162 2015-05-20 06:00:07,232.191.241.129,5377,174.47.129.59,1247,17,GET /mailman/listinfo/hsdivision HTTP/1.1,200,6291 2015-05-20 06:00:07,121.67.24.216,2296,212.237.153.79,6889,68,GET /twiki/bin/view/TWiki/WebTopicEditTemplate HTTP/1.1,200,3732 2015-05-20 06:00:07,31.224.72.52,450,100.46.183.122,10541,20,GET /twiki/bin/view/Main/WebChanges HTTP/1.1,200,40520 2015-05-20 06:00:07,210.174.159.227,6180,173.149.119.202,6927,2,GET /twiki/bin/rdiff/TWiki/AlWilliams?rev1=1.2&rev2=1.1 HTTP/1.1,200,5234 2015-05-20 06:00:07,210.174.159.227,10124,16.194.51.72,10512,69,GET /twiki/bin/rdiff/TWiki/AlWilliams?rev1=1.2&rev2=1.1 HTTP/1.1,200,5234 2015-05-20 06:00:07,60.48.99.15,12333,85.183.139.166,12020,64,GET /robots.txt HTTP/1.1,200,68 2015-05-20 06:00:07,81.227.25.139,5883,96.128.212.177,2042,56,GET /twiki/bin/oops/TWiki/TextFormattingRules?template=oopsmore¶m1=1.37¶m2=1.37 HTTP/1.1,200,11400
데이터 입력
이제 본격적으로 데이터를 로딩해 보기로 하자. 귀찮으니까 가장 빠른 방법으로 입력한다. 바로 load_sample.sh
를 실행하는 것이다. 쉘 스크립트의 내용은 아래와 같다. (중요 부분만 나타냈다)
$ cat load_sample.sh #!/bin/sh #----------------------------------------------------------------- # run csvimport command to load sample_data.csv into Machbase DB # use first field as _arrival_time column and # -F option for formatting datetime. # # Usage: sh load_sample.sh #----------------------------------------------------------------- set -x ## 테이블 스키마를 만드는 명령어 machsql -s 127.0.0.1 -u sys -p manager -f create_sample_table.sql ## 데이터를 로딩하는 명령어 csvimport -t sample_table -d sample_data.csv -a -F "_arrival_time YYYY-MM-DD HH24:MI:SS"
자, 수행해 보았다.
machbase@mb:/opt/machbase/current/tutorials/csvload$ sh load_sample.sh + machsql -s 127.0.0.1 -u sys -p manager -f create_sample_table.sql ================================================================= Machbase Client Query Utility Release Version 3.5.0.826b8f2.community Copyright 2014 InfiniFlux Corporation or its subsidiaries. All Rights Reserved. ================================================================= MACHBASE_CONNECT_MODE=INET, PORT=5656 Type 'help' to display a list of available commands. Mach> CREATE TABLE SAMPLE_TABLE ( srcip IPV4, srcport INTEGER, dstip IPV4, dstport INTEGER, protocol SHORT, eventlog VARCHAR(1204), eventcode SHORT, eventsize LONG ); Created successfully. Elapsed time: 0.094 + csvimport -t sample_table -d sample_data.csv -a -F _arrival_time YYYY-MM-DD HH24:MI:SS ----------------------------------------------------------------- Machbase Data Import/Export Utility. Release Version 3.5.0.826b8f2.community Copyright 2014, InfiniFlux Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- NLS : US7ASCII EXECUTE MODE : IMPORT TARGET TABLE : sample_table DATA FILE : sample_data.csv IMPORT_MODE : APPEND FILED TERM : , ROW TERM : \n ENCLOSURE : " ARRIVAL_TIME : TRUE ENCODING : NONE HEADER : FALSE CREATE TABLE : FALSE Progress bar Imported records Error records 1000000 0 Import time : 0 hour 0 min 2.892 sec Load success count : 1000000 Load fail count : 0 machbase@mb:/opt/machbase/current/tutorials/csvload$
아래에 있는 Import time 이 보이는가? 2.8초 만에 100만건이 로딩되었다.
쿼리 수행
입력한 데이터를 조회하는 쿼리를 수행해 보자. machsql
을 사용하면 되는데, 유저명과 패스워드는 SYS / MANAGER 이다. 먼저 테이블 목록을 조회해서, 입력한 데이터가 들어있는 테이블 이름을 확인한다.
Mach> show tables; USER_NAME TABLE_NAME TABLE_TYPE ------------------------------------------------------------------------------------------ SYS SAMPLE_TABLE LOG [1] row(s) selected. Elapsed time: 0.001
그 다음, 해당 테이블에 있는 데이터 개수를 세어 보았다.
Mach> select count(*) from sample_table; count(*) ----------------------- 1000000 [1] row(s) selected. Elapsed time: 0.001
100만건이 들어있다고 아주 빠르게 출력된다. 그럼, 좀 더 복잡한 연산을 시켜 봤다. GROUP BY 절을 이용해 각 그룹의 레코드 개수를 세는 쿼리이다.
Mach> select srcip, count(srcip) from sample_table group by srcip; srcip count(srcip) ---------------------------------------- 148.30.103.173 13389 31.224.72.52 13290 5.114.66.53 13315 118.179.107.47 13142 214.153.107.182 13219 105.9.103.49 13472 96.40.75.42 13380 60.48.99.15 13363 243.9.49.80 13355 152.67.188.171 13314 232.191.241.129 13258 233.8.84.203 13315 50.230.44.173 13252 81.227.25.139 13312 5.238.208.30 13184 157.54.162.47 13333 177.151.141.9 13274 100.195.159.235 13097 115.18.128.171 13468 239.81.105.222 13501 207.239.12.230 13174 63.214.191.124 13324 173.149.119.202 13546 228.109.100.138 13378 100.46.183.122 13196 129.55.140.243 13322 201.227.32.49 13279 122.195.164.32 13446 185.22.195.164 13451 16.0.123.104 13357 174.47.129.59 13389 7.234.88.67 13314 123.198.82.192 13342 32.98.52.241 13206 6.32.167.53 13375 86.45.186.17 13487 231.146.69.51 13483 77.59.213.51 13379 85.183.139.166 13174 46.201.48.18 13384 238.136.26.139 13031 162.80.44.96 13293 221.103.26.120 13402 107.32.71.99 13140 252.248.178.61 13422 161.28.150.105 13379 153.70.151.135 13320 98.25.97.158 13339 153.199.166.54 13448 98.228.223.202 13201 16.194.51.72 13424 212.237.153.79 13304 227.106.13.91 13265 96.128.212.177 13594 245.13.24.17 13196 66.114.157.127 13267 69.99.246.62 13511 183.103.50.46 13247 121.67.24.216 13409 178.90.167.178 13453 50.5.206.126 13408 28.197.127.42 13068 58.208.78.121 13303 166.218.230.17 13253 248.168.229.34 13472 137.232.56.93 13238 226.7.237.25 13271 20.137.26.161 13393 64.58.31.79 13404 71.129.68.118 13361 166.144.72.55 13323 219.229.142.218 13537 210.174.159.227 13401 220.192.100.45 13259 159.240.209.63 13425 [75] row(s) selected. Elapsed time: 0.224
100만건 그룹갯수가 75개이고, 수행시간은 0.22초.. 빠르다. 그러면, 더더욱 복잡하게 SRCIP 컬럼 값이 낮은 순서로 정렬한 다음 상위 10개만 출력하는 쿼리를 실행시켰다.
Mach> select srcip, count(srcip) from sample_table group by srcip order by 2 desc limit 10; srcip count(srcip) ---------------------------------------- 96.128.212.177 13594 173.149.119.202 13546 219.229.142.218 13537 69.99.246.62 13511 239.81.105.222 13501 86.45.186.17 13487 231.146.69.51 13483 248.168.229.34 13472 105.9.103.49 13472 115.18.128.171 13468 [10] row(s) selected. Elapsed time: 0.244 Mach>
정렬 후 상위 10개를 뽑는데 0.24초가 나온다. 이 역시 상당히 빠른 속도다.
조회수
320