분류

레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시
레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시

2022년 5월 2일 월요일

DA# MARIADB, MYSQL 한글 깨짐 해결

개요 

개인적으로 공모전 준비나 DAP 시험 준비를 위해 'ENCORE-DA#'을 사용 하던 중 UTF-8 인코딩 타입의 한글이 깨지는 현상이 발견되었고, 이에 관한 기술 지원을 받기 위해 문의했으나, 상당한 시일이 걸리기도 하고, 자료를 찾는데 애먹기도 해서 정리를 해 보았습니다. 

먼저 mysql 이나 mariadb의 데이터베이스와 테이블에서 모두 utf-8로 설정이 되어있는지 확인 하신 이후에도 안될 경우에 대한 이야기 입니다. 해당 부분이 설정되지 않은 분들은 타 블로거의 글을 참조 하시기 바랍니다. 

저의 경우 utf-8을 모두 맞췄으나 da#에서 한글이 깨지는 케이스에 대한 설명 입니다. 설정이 잘 되어있기에 dbeaver 나 콘솔에선 한글이 정상으로 보이지만 da#만 깨집니다. 

utf-8 설정 참조 블로그 글


1. DA#에서 필요한 MARIADB(MYSQL) DRIVER 

WINDOWS 기반의 DA#에서 MYSQL이나 MARIADB에 접속하려면 우선 ODBC 드라이버를 설치해야 합니다. 설치하지 않은 경우 다음과 같이 데이터베이스를 선택하는 항목이 비어져 있습니다. 

DA# 리버스> DB리버스 > 데이터베이스 접속 화면

1) odbc 드라이버 선택

직접 테스트를 수행해본 결과 mysql 5.3.14(32bit) 이상의 버전이 설치 되어있어야 합니다. 처음 3.x 버전을 사용했을 경우 UTF-8 인코딩으로 테이블과 데이터베이스가 모두 설정이 되어 있어도 한글이 깨지는 현상이 발생 합니다. 또한 os가 64bit 버전이어도 da#프로그램이 32bit 버전이므로 32bit버전을 받는 것을 추천합니다. 

드라이버 다운로드 버전

MYSQL DRIVER DOWNLOAD 링크  <--- 이 부분을 클릭하셔서 정식 MYSQL ODBC 드라이버를 다운로드 받습니다. 

2) 드라이버 설치 

8. 대역의 32bit 드라이버 설치는 별다른 선택이나 옵션 없이 이루어집니다. 하지만 5.x버전 드라이버는 visual studio 패치가 이루어져야 합니다. 
visual studio 2013 x86 redistributable 설치 안내
visual studio 2013 x86 다운로드 페이지


visual-studio 다운로드 사이트
2013 x86을 선택하고 다운로드 후 설치는 그냥 다음만 누르면 되므로, 드라이버와 visual studio를 모두 설치해줍니다. 

3) odbc 설정하기 

windows 시작 버튼을 누르고 odbc를 입력하면 odbc 드라이버 설정을 수행하는 화면이 등장 합니다.  DA#에서는 32bit 버전이 필요하기에 32bit 환경 설정을 수행해 주세요 
odbc 드라이버 연결 창
ODBC 드라이버 설치 시 3.x 버전에서는 한글이 깨지는 이유는 딱 봐도 알 수 있습니다. 5.x버전 드라이버에서는 ANSI와 UNICODE 형식의 드라이버를 구분해서 지원하는 반면 3.x버전 드라이버에서는 구분이 없는 것으로 보아 둘 중 하나의 형식만을 지원 합니다. 

DA#에서는 Unicode 드라이버 형식만을 지원하는 것 같습니다? 그렇다면 3.x 버전은 ansi 만 지원 하겠네요 . 테스트를 해보면 알 일입니다. 


본인의 프로젝트 정보에 맞춰 접속 정보를 입력합니다. 여기서 Data Soruce Name 이라는 부분이 있는데 이 부분은 사용자가 사용하기 위한 명칭을 정의하는 부분입니다. 실제 db와 달라도 괜찮습니다.  IP, PORT, USER, PASSWORD를 넣고 TEST를 누르면 DATABASE 목록이 조회 됩니다. 여기서 접속할 데이터베이스를 선택하고 ok를 누르시면 환경이 저장 됩니다. 

4) da#에서 테스트 


da# 모델러를 실행 후 리버스 -> db리버스 를 누르면 생성되는 팝업창에서 mysql과 접속정보를 입력해줍니다. 데이터 소스는 사전에 odbc를 등록한 목록의 명칭이 선택창으로 나타나게 됩니다. oracle 을 리버스 할 경우 테이블을 선택하는 기능이 있는데 mysql은 이상하게 해당 기능이 보이질 않습니다. 


3.x 버전 odbc설치시 한글 깨짐 상태


mariadb odbc 5.3 windows 32bit 설치시 정상


결론 

mysql odbc는 3.x 버전에서는 한글 깨짐,

5.x 이상 버전의 windows 64bit 용 드라이버는 da#에서 인식되지 않음.

5.x 버전의 windows 32bit 용 드라이버는 unicode와 ansi 모두 한글 정상 지원 

이상입니다. 읽어주셔서 감사합니다. 


2021년 10월 17일 일요일

첫 nas 구매 6. nas4dual의 feed 다운로드 시간을 직접 정해보자.

개요

nas4dual을 사용하면서 원하는 것들에 대한 직접적인 설정 방법을 계속해서 포스팅하고 있습니다. 이번이 6회 째네요 이번에는 rssfeed에 대한 다운로드 시간을 직접 정하는 방법에 대해 기술해보겠습니다. 

feed 다운로드 시간을 직접 정해보자 

flexget 프로그램은 linux 자체의 crontab 이라는 스케줄러를 통해서 실행됩니다. 하지만 nas4dual에서는 이 crontab에 대한 지원이 너무도 적습니다. 

4개의 설정밖에 없는 rssfeed 검색 크론탭 설정

linux의 크론탭은 5개의 자리수로 구성됩니다.

                        월        요일

이런 형태의 자리수에 채워진 숫자대로 반복이 정해지는 겁니다. 따라서 목요 드라마만 다운받고 싶은데 매일 다운로드를 수행한다는 것도 자원 낭비이고, 혹은 매일 오후 3시에 돌았으면 하는데 그 시간을 설정할 수 없는 현행의 프로그램으로는 약간의 개선이 필요한 상태입니다. 

현재의 crontab은 아래와 같은 형태로 구성되어있습니다. 

명령어 : crontab -l 

결과 : 

0       *       *       *       *       /etc/rss.sh exec > /dev/null 2>&1 &
26      19      *       *       *       /sbin/hwclock -w
26      19      *       *       *       /sbin/ntpdate clock.iptime.co.kr
26      19      *       *       5       /sbin/ez-ipupdate -a 192.168.219.104 -u
이 명령줄을 각각 해석해보자면 이렇습니다. 
0       *       *       *       *      
0분   매시  매일 매월   모든요일

26      19      *       *       *  
26분  19시   매일  매월  모든요일 

26      19      *       *       5  

26분  19시  매일  매월   금요일 요일은 0-7 월-일 요일입니다. 

3시간 마다 옵션을 선택했다면 시간 부분이  */3 으로 되어있을것입니다.

저는 집에 가기 전에 오늘 볼 에니메이션을 다운받아놓고 컴퓨터가 대기했으면 좋겠습니다. 따라서 매일 오후 1시경에 시작해서 제가 보고싶은 것들을 모두 다운로드하고 영상이 기다렸으면 좋겠습니다. 하지만 이런 생각은 인터페이스에 반영되지 않았습니다. 

크론 스케줄러 파일의 위치는  /var/spool/cron/crontabs/root 파일입니다. 따라서 vi 편집기를 통해 이 녀석을 고칩니다. (원래는 crontab -e명령을 통해서 할 수 있지만 명령이 안됩니다.) 

telnete 접속후 다음 명령을 수행합니다. 

명령어 :  vi /var/spool/cron/crontabs/root 

crontab 편집화면

vi 편집기에서는 키보드의 i키나 insert키를 눌러 화면 하단에 --insert--라는 마크가 나와야 수치를 변화 시킬 수 있습니다. 또한 녹색 커서가 나오는데 이 커서의 앞 부분을 수정할 수 있습니다. 뒤쪽이 아닌 앞입니다. 보통의 편집 모드와 약간 다릅니다. 

저는 새벽에 방영한 녀석들과 낮부터 초저녁까지 방영하는 녀석들을 매일 2번 찾아보고 싶습니다. 따라서 다음과 같이 설정 하였습니다. 

저 앞의 숫자에 대한 편집이 완료 되었다면 키보드의 esc 키를 한번 누른 후  : 를 입력하고 x를 입력하고 엔터를 입력하면 저장 됩니다. 
크론 편집 화면 탈출
esc 키를 누르면 하단의 --Insert--마크가 사라집니다.  그상태에서 : 누르고 x 누르고 엔터 

크론탭에서 지원하는 문법은 쉽습니다. 다중 지정은 , 를 통해서 반복은 / 를통해서 지정할 수 있습니다. 

예를 들자면 다음과 같습니다.  
30분 마다 반복은 */30 * * * * 
10분 30분 반복은 10,30 같은 식입니다. 

제타위키를 보셔도 도움이 될 것 같습니다. 

2021년 10월 15일 금요일

첫 nas 구매 5. nas4dual의 rss 설정 제대로 알아보자.

 개요 

nas4dual의 설정 중 rss 피드를 설정하는데 정확한 정보를 찾는것이 너무 어려워 문서를 또 한장 쓰게 되었습니다. 개인적으로 이번 nas 구매에서 가장 큰 역할로 꼽은 것이 rss 다운로드 기능이기에 이것에 대한 설정을 정확히 할 수 없을 경우 여러 불편함이 발생하기 때문입니다. 


RSS 추가 및 설정 방법

일단 RSS라는 것은 토랜트의 목록을 관리하는 서버입니다. 한국 방송보다는 일본 에니메이션을 다운로드 받아 보는 것을 좋아하기에 RSS는 필수이며 관리가 필요없이 한 번 등록하고 반 영구적으로 (해당 RSS가 사라질 때 까지) 사용하는 항목입니다. 관리가 필요 없다는 것이 가장 큰 장점이기에 한번의 설정으로 가장 큰 효과를 봐야 합니다. 

가. RSS 피드 등록 

IPTIME 자체 UI의 FEED 목록
RSS 피드는 TORRENT 관리의 RSS FEED 설정을 통해서 수행할 수 있습니다. 이 RSS FEED를 관리하는 프로세스는 FLEXGET이라는 LINUX용 프로그램으로 구성되어있습니다. 인터넷에 본인이 원하는 RSS를 검색해서 추가 또는 삭제할 수 있는 인터페이스가 되어있습니다. 간단하게 주소를 추가하면 되므로 입력항에 대한 설명은 하지 않겠습니다. 또한 제목도 필요가 없습니다. 

나. FEED 필터 등록 

피드는 하루에도 수십,백 건의 자료가 올라오는데 RSS 피드만 추가 할 경우 해당 자료 전체 가 다운로드 됩니다. 방영되는 에니를 전부 보는 저로서는 피드만 추가하면 되지만 FEED 필터를 추가하는 설명도 진행하도록 하겠습니다. 

FEED 필터는 FEED에 올라오는 수많은 자료 목록 중 본인이 원하는 자료만 검색할 수 있는 포함 단어, 그리고 본인이 원하지 않는 단어를 제외하는 제외 단어 등을 여러개 등록할 수 있습니다. 파일 하나마다 허용되는 단어와 허용되지 않는 단어를 목록으로 화 해서 관리합니다. 등록된 단어는 하나 하나마다 허용 , 거부 권한을 갖는 목록으로 작성되어 TORRENT 하나당 그 내용과 제목을 기준으로 검색을 수행하게 됩니다. 

예를 들어보면 다음과 같습니다. 
포함단어 '바보', '멍청이'
제외단어 '똥개' 
라고 작성 한 경우 TORRENT의 제목이나 내용에 '바보나 멍청이'가 TORRENT는 자동으로 추가 되지만, '멍청이 똥개' 는 다운로드 되지 않습니다. 똥개가 들어가있기 때문이죠. 

뭐 RSS라는 것을 이미 알고 계신분이 FEED 등록을 하기에 불필요한 설명 이라고 생각이 되지만 처음이신 분들은 아셔야 합니다. 그리고 전 RSS를 이미 사용하고 있었음에도 불구하고 FLEXGET을 처음 써보기에 필터링 되는 방식을 알아내는데 상당한 시간을 소요했습니다. 일단 FLEXTGET이 필터링을 담당한다는 것을 알아내는 것 까지만 해도 3시간이 걸렸습니다. 

이러한 피드 필터를 등록하면 RSS 내에서 자신의 취향에 맞는 파일만 받을 수 있으므로 한번의 설정으로 필요한 파일을 지속적으로 공급 받는데 도움이 됩니다. 

feed filter 등록시 유의사항

feed filter는 매우 유용하지만 종종 오탐을 하기도 합니다. 완성된 단어를 꼭 사용해야 합니다. 영문 단어의 약어를 합친 경우 마그넷 링크를 오탐하여 원치 않는 자료가 다운로드 됩니다. 예를 들자면 나혼자 산다를 영문 약자로 'AL'이라고 했을 경우 같은 거죠. 사람도 이해하기 힘든 약어는 컴퓨터도 이해하지 못합니다. 

torrent의 설명 부분에 마그넷 링크가 있는 경우가 있기 때문입니다. 마그넷 링크는 임의 영문 숫자의 조합으로 만들어지기에 약어와 겹치는 경우가 매우 많습니다. 

다. FEED필터가 작동하는지 확인하기 

FEED 필터는 또다시 TELNET을 통해 nas4dual에 들어가야 확인할 수 있습니다. 또한 시간 단위로 crontab이라는 리눅스 자체의 스케쥴링을 통해서 작동하기 때문에 해당 시간 외엔 프로세스에서 조회할 수 없습니다. 
telnet의 사용법을 모르시는 분은 이전 게시물을 확인하시면 되겠습니다. 


따라서 크론탭에 예약되어있는 정보를 확인합니다. 

명령어 : crontab -l 

결과 : 

0       *       *       *       *       /etc/rss.sh exec > /dev/null 2>&1 &
26      19      *       *       *       /sbin/hwclock -w
26      19      *       *       *       /sbin/ntpdate clock.iptime.co.kr
26      19      *       *       5       /sbin/ez-ipupdate -a 192.168.219.104 -u

위에 보이는 결과 목록 중 /etc/rss.sh exec 가 nas4dual에서 rss 피드를 호출하는 녀석입니다. 뒤에 따라 붙은 > /dev/null 2>&1 &는 프로세스에 대한 호출 로그를 남기지 않겠다. 그리고 백그라운드 서비스로 부르겠다 라는 명령입니다. 

따라서 /etc/rss.sh exec명령을 통해 호출해보겠습니다.  

2021-10-15 21:06:03 VERBOSE  task          rss340409313    ACCEPTED: `바보 똥개.mp4` by regexp plugin because regexp '바보' matched field 'description'
2021-10-15 21:06:03 VERBOSE  task          rss340409313    REJECTED: `바보 똥개.mp4` by regexp plugin because regexp '똥개' matched field 'description'
명령을 수행하면 위와같이 목록에 있는 명령으로 각각 필터링이 이루어지는 것을 알 수 있습니다. 명령어에 보면 regexp 라는 것이 있는 것으로 보아 정규식도 활용 가능 한 것으로 보입니다. 

라. RSS 파일 및 필터 위치 

RSSFEED 파일은 torrent다운로드 폴더로 설정한 디스크의 한단계 위에 존재합니다. 저는 HDD1의 torrent라는 폴더에 다운로드 위치를 설정했는데 그 바로 위인 /mnt/HDD1/.rss_cfg/폴더에 해당 파일들이 있습니다. 
명령어 : /mnt/HDD1/.rss_cfg/
 ls
결과 :
rss340409313.yml  rss340407888.yml  received          flexget.log       db-config.sqlite  config.yml

이렇게 여러개의 파일이 있는데 db-config.sqlite는 아마도 저장이력이나 환경정보를 갖고있는 데이터 파일인것 같습니다. 

config.yml은 등록된 rss-feed 목록을 관리하는 환경 파일입니다. 등록된 rss-feed 주소 만큼 늘어나니 건들지 않는게 좋습니다. 

rss와 숫자로 이루어진 yml 파일이 필터링이 포함된 피드 파일입니다. 그중 하나를 열어보자면 내용은 이렇게 구성됩니다. 

명령어 : vi rss340409313.yml 
결과 : 
rss: https://토랜트 rss 주소/
verify_ssl_certificates: no
regexp:
accept:
- '바보'
- '멍청이'
reject:
- '똥개'
magnets: yes
exec:
auto_escape: yes
on_output:
for_failed: "/usr/python3/bin/magnet_location.sh '{{url}}' '{{task}}'"

여러 단어를 등록해야 하는경우 엑셀이나 단어장에 - '검색어' 형태의 목록을 만들어두셨다가 vi 편집기를 통해 일괄 등록하는 것도 가능합니다. 

참고 

web 인터페이스에서 보는 원본 rss 설정 파일은 이곳에 있습니다. 두곳을 모두 변경해야 합니다. 
 cd /etc/property/RSS/

마. upnp가 지원되지 않는다면 재부팅은 되도록 삼가하자 

torrent 의 자료를 제공하는 측 (peer) 가 접속하는 포트는 nas4dual이 재실행 될 때 마다 무작위로 선정됩니다. 공유기에 DMZ 설정을 해놓게 되면 보안에 취약한 nas4dual을 통해 별별 놈들이 다 들어올 수 있으므로 저는 nas를 DMZ으로 설정해놓지 않았습니다. 특정 포트만 인터넷에 공유해놓고 그마저도 포트포워딩을 통해 원본 포트와 다르게 변경을 해놓았는데 재부팅을 할 경우 해당 포트가 변경됩니다. 

포트가 변경되면 다운로드 속도가 줄어듭니다. 
upnp를 설정한 경우는 문제가 없습니다.  


transmission 시작시 무작위 포트 선택이라는 옵션은 해제할 수 없기 때문입니다. 그리고 재부팅을 하면 한번에 다운로드 받는 파일 수도 변경되므로 torrent에 대한 설정 변경을 최소화 하기위해 재부팅을 저는 안하고 있습니다. 재부팅시마다 연결 포트를 매번 변경해준다는 선택지도 있습니다. 하지만 귀찮습니다. 
2023transmission qt pc버전을 통해 무작위 포트가 해제 됩니다. 

기타 주의사항 

windows에서 토랜트의 다운로드 상태를 보려면 transmission-remote gui라는게 필요해집니다. 여기에서 토랜트에 대한 환경설정을 할 경우 대부분 무시되거나, 환경 설정이 꼬이는 경우가 발생합니다. 따라서 안드로이드나 windows 상에서 환경을 변경하시면 아니되옵니다. rss가 다운로드 되지 않을 경우 torrent다운로드 폴더를 다른 디스크 상으로 바꾸면 다시 정상 작동할 것으로 생각 됩니다. (안에 들어있는 .session 폴더나 .python 폴더 .rss_cfg 폴더의 설정이 어딘가에 중복되서 발생하는 것 같습니다. ) 

디스크 경로를 바꿀 수 없을경우 torrent 서비스를 중지하시고 .session .python .rss_cfg 3개의 폴더를 제대로 지우시고 토랜트 서비스를 재실행 하셔야 합니다. 

참고로 한 가지 설정만큼은 잘 되는 앱이 있네요 windows 10에서 torrent 다운로드 개수를 변경 할 수 있는 앱입니다. 트랜스미션bt <--한번에 다운로드 되는 개수만 늘려줍니다. 다른건 다 적용안되요. 
다만 이 다운로드 개수는 재부팅하면 다시 초기화가 됩니다. 

저는 지난번 설정에서 다운로드 속도에 대한 상향을 통해 18메가 언저리는 꾸준히 나오는데 그 이상은 잘 안나옵니다. 26메가는 아주 가뭄에 콩나는 수준으로 나와요. 회선은 500Mbps 니까 /8해서 62.5MB/s가 최대인데 반절도 못씁니다. 공유기를 바꾼 이후 더 나오면 캡처해서 올리겠습니다. archer ax73을 구매하였으나. 대한통운 택배 부분파업의 피해를 보고 있습니다. 


10개 파일을 동시 다운로드 해도 피어수가 많지 않아서인지 cpu는 20% 이내로 쓰네요. 

주의사항 
기타설정 -> 외부 접속 관리를 설정 할 경우 
종종 rss 에서 다운로드가 되지 않는 경우가 발생했습니다. 
 Unable to download the RSS for task rss340932804 (https://사이트rss.php?filter=15&minMB=2000): HTTPSConnectionPool(host='사이트, port=443
위와 같은 에러 메시지가 발생할 경우 국가 차단 설정에서 해당사이트가 필터링 되는것이라고 보시면 되겠습니다. 또한 nas4dual의 국가 차단의 IP 대역이 실제 국가와 일치하지 않는 현상이 있습니다. 

2021년 5월 24일 월요일

spring boot기반 batch 프로젝트 생성부터 mybatis 연동 단순하게.

 개요 

회사에서 배치 프로세스를 분리해야 하는 일이 생겼습니다. 인터넷으로 이런 저런 조사를 해보는데 정상적인 문서를 찾기 힘든 것이 현실이고, 구했다 하더라도 입맛에 맞는 구조가 아닌 경우가 많아 최소한의 soruce를 통해 mybatis 연동(MariaDB)까지 정리 해보려 합니다. 

본문의 순서는 다음과 같이 진행 하겠습니다.

1. Eclipse spring Boot 설치 

2. Project 생성 

3. Project 환경 설정 

4. application.properties 설정 

5. Source 코드 생성 

6. 발생할 수 있는 오류

순으로 정리되어있습니다. 캡처를 할 경우 너무 여러 장을 찍어야 하기에 설치 순서는 동영상으로 대체하였습니다. 

그럼 시작하겠습니다. 


1. Eclipse spring Boot 설치 

일단 spring boot 프로젝트를 생성하기 위해서는 Eclipse의 Spring Tool이 필요합니다. Eclipse의 Help 버튼을 눌러 Market Place에 들어가서  Spring Tool을 검색해서 Install 하고 Eclipse를 다시 시작 합니다. 

Spring Tool 인스톨 영상 

2. Project 생성 

Project의 생성은 create a new project -> spring 검색 -> Spring Starter Project -> java 버전 선택 -> project 및 package 명 변경 -> spring batch 선택 -> Mybatis Framework 선택 -> finish 순으로 진행하였습니다. 

project 생성 영상 


3. Project 환경 설정


환경설정에 연관된 파일
환경설정에 연관된 파일은 2가지입니다. 
1) pom.xml을 통한 라이브러리 환경 설정과 
2) 프로젝트 환경 설정의 application.properties 파일입니다. 

1) 라이브러리 환경설정 

우선 저는 mariadb를 연결해야 하기에 mariadb의 maven 라이브러리를 pom.xml에 추가하겠습니다. maven을 통한 라이브러리 추가는 google 에서 maven +라이브러리 를 검색하거나 
메이븐 사이트 https://mvnrepository.com/

위 링크로 접속하셔서 해당 라이브러리를 검색하시면 쉽게 dependency 정보를 찾을 수 있습니다. 

mysql 드라이버 정보


검색된 메이븐 라이브러리중 자신에게 해당하는 버전을 클릭하면 이렇게 하단에 디팬던시 정보가 표기되어 해당 정보를 pom.xml에 붙여넣기 하면 됩니다.

pom.xml에 붙여넣기



4. application.properties 설정 

application.properties에 프로젝트에 사용할 환경 설정을 추가해줍니다. application.properties 는 spring toole에서 자동 완성을 지원합니다. 구동 화면은 아래와 같습니다. 
application.property 설정 영상

실제 application.properties에 수록된 내용은 다음과 같습니다. 
#데이터 베이스 연결에 사용할 드라이버 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#데이터베이스 url 
spring.datasource.url=jdbc:mysql://192.168.0.1:6330/test?serverTimezone=UTC&characterEncoding=UTF-8
#계정 
spring.datasource.username=testUser
#비밀번호
spring.datasource.password=testUser

#mapper 파일이 적재될 위치 sql mapper 파일과 동일하게 맞춰준다.
mybatis.mapper-locations=com/springBatchTest/mapper/*.xml
#커스텀 환경변수 
custom.test=test-value


5. Source 코드 생성 

우선 application.properties에 설정한 위치에 mapper xml파일을 만들어줍니다. 
환경설정 순서(클릭시 커짐)
현재 프로젝트의 application 설정이 마이바티스 까지 연동되는 구조는 다음 순서에 따라 이루어집니다. 
application에서 모델을 연결해주는 것은 mapper location.
모델과 컨트롤러의 연결은 xml 파일내의 namespace가 classPath로 역할을 하게 되더군요. 

수정 및 생성한 소스프로그램은 총 4개의 파일입니다. 
1) testMapper.xml 
2) TestDataMapper.java
3) TestDataService.java
4) SpringBatchTestApplication.java
차례대로 기술하겠습니다. 

1) testMapper.xml 

mysql DB에서 데이터를 조회할 sql 문을 입력합니다. 또한 namespace에 java에서 연동할 인터페이스의 패키지 경로와 파일명을 입력합니다. 
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 인터페이스의 패키지 경로와 클래스명 -->
<mapper namespace="com.springBatchTest.mapper.TestDataMapper">

<!-- 수행할 sql -->
    <select id="getTestDataList" resultType="java.util.Map">
<![CDATA[
SELECT 1 AS COL1 
UNION ALL 
SELECT 2 AS COL1
]]>
    </select>
</mapper>
sql은 간단하게 테스트를 수행할 수 있게 정의하였습니다. 

2) TestDataMapper.java

mapper.xml 에 정의된 위치에 정의된 명칭으로 생성해줍니다. 인터페이스 내부에는 xml에 정의된 sql과 동일한 명칭 그리고 동일한 데이터 형식을 갖고 있는 함수가 있어야 합니다. 
package com.springBatchTest.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestDataMapper {
List<Map<String, Object>> getTestDataList();
}
mybatis framework과 java Application간의 인터페이스 역할만 해주므로 정말 내용이 없습니다. SQL이 늘어나는 만큼 증가합니다. 

3) TestDataService.java

서비스에는 인터페이스에 정의된 형식과 동일한 서비스를 구성해줍니다. 이 파일 역시 자동 연결을 위한 선언 ,  서비스 선언 이외에 특별한 내용이 없습니다. 
package com.springBatchTest.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;

import com.springBatchTest.mapper.TestDataMapper;

@Service
public class TestDataService {
    @Autowired
    TestDataMapper testData

    public List<Map<String, Object>> getTestDataList() {
        return testData.getTestDataList(); 
    }
}


4) SpringBatchTestApplication.java

package  com.springBatchTest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.List;
import  java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import  com.springBatchTest.service.TestDataService;

@SpringBootApplication
public class SpringBatchTestApplication {
public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(SpringBatchTestApplication.class , args)) {
SpringBatchTestApplication m = ctx.getBean(SpringBatchTestApplication.class );
m.selectDataf(); 
}catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
  @Autowired
  TestDataService  testDataService;
    public void selectDataf() {
    List<Map<String, Object>> tmp = testDataService.getTestDataList();
    System.out.println(tmp.size());
    }
}


자 이제 테스트용 코드 생성은 끝났습니다. 

6. 발생할 수 있는 오류

1) 정상 처리 시 디버깅 콘솔 내용 


2021-05-24 19:28:03.528  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 10964 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:28:03.533  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : No active profile set, falling back to default profiles: default
2021-05-24 19:28:06.259  INFO 10964 --- [           main] c.s.SpringBatchTestApplication           : Started SpringBatchTestApplication in 3.553 seconds (JVM running for 4.553)
2021-05-24 19:28:06.277  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

2021-05-24 19:28:06.771  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2
2021-05-24 19:28:06.897  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
945  INFO 10964 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

수행할 로직이 없기 때문에 약 3,4초만에 수행되고 종료되며 임시로 생성된 sql에서 받는 데이터 2건에 대한 사이즈 정보가 표기됩니다. 

2) application.properties내의 mapper 경로가 잘못 된 경우  

빨간색 글자처럼 파일을 찾을 수 없다는 메시지가 나옵니다. 
2021-05-24 19:31:39.543  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : Starting SpringBatchTestApplication using Java 15.0.1 on DESKTOP-3QN7REN with PID 7172 (D:\blogger\springBatchTest\target\classes started by jinyboys in D:\blogger\springBatchTest)
2021-05-24 19:31:39.553  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : No active profile set, falling back to default profiles: default
2021-05-24 19:31:42.462  INFO 7172 --- [           main] c.s.SpringBatchTestApplication           : Started SpringBatchTestApplication in 3.802 seconds (JVM running for 5.327)
2021-05-24 19:31:42.479  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

2021-05-24 19:31:42.987  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-05-24 19:31:43.074  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-05-24 19:31:43.086  INFO 7172 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList

3) mapper.xml 파일 내부 SQL구문의 ID와 mapper.java 인터페이스가 불일치 할 경우

위와 동일한 오류가 발생합니다. 
 Invalid bound statement (not found): com.springBatchTest.mapper.TestDataMapper.getTestDataList

4) service.java 클래스 내에 @Autowired 설정이 없는 경우

Cannot invoke "com.springBatchTest.mapper.TestDataMapper.getTestDataList()" because "this.testData" is null

5) mapper.java 클래스가 없거나 비정상 , @mapper 설정이  없는 경우

Description:

Field testData in com.springBatchTest.service.TestDataService required a bean of type 'com.springBatchTest.mapper.TestDataMapper' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.springBatchTest.mapper.TestDataMapper' in your configuration.

Error creating bean with name 'springBatchTestApplication': Unsatisfied dependency expressed through field 'testService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testDataService': Unsatisfied dependency expressed through field 'testData'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springBatchTest.mapper.TestDataMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}


이상 스프링 배치 프로젝트 생성부터 mybatis 연동까지 그리고  발생할 수 있는 오류까지 알아봤습니다. 

이렇게 쉽게 4개의 파일만 설정하면 연동할 수 있는 기본적인 형태를 이해하지 못하고 엉뚱하게 정리 해 놓은 글들이 너무 많아 직접 정리를 해 보았습니다. 누군가에게 도움이 되면 좋겠네요 ㅎㅎ. 

2020년 7월 8일 수요일

Linux(Centos)로 분리된 2개의 망 연결하기 (routing설정)

1. 개요 
회사에서 사용하는 공유기를 통해 Hadoop 서버에 연결하여 사용하는 중입니다. 최근 하둡 시스템의 네트워킹 성능 향상을 위해 광랜 망을 구성하였는데 광 단자로만 이루어진 스위치를 사용하다보니 기존 UTF 기반의 network을 연결할 수 없게 되었습니다. 

이를 해결하고자 네트워크 본딩, NAT나 브릿지를 설정하려고 하던 중 그냥 라우팅만으로 해결할 수 있을 것 같아 해당 방법을 실행 해 보았습니다. 

시스템의 구성은 이렇습니다. 
1GB 망 192.168.0.X 대역
100G 망 192.168.1.X 대역 

네트워크 구성(클릭하면 커집니다.) 

2개의 Lan 카드가 물리적으로 장착되어 있고 사용자는 ip time 공유기를 통해 192.168.0.x 대역의 서버에 접속할 수밖에 없습니다. 광랜망을 통해 하둡 서버를 통신하게 하기 위해서 IP대역이 분리되었는데 분리된 망으로 서버를 구성할 경우 접속을 할 수 없었습니다. 

2. NETWORK 연결 
일단 원하는 목표는 단순합니다. 192.168.0.X 대역에서 192.168.1.X 대역에 접속만 할 수 있으면 됩니다. 뭐 인터넷망과 내부 사설망 연결하는 다른 방식과 크게 다르지 않습니다. 
이렇게 말이죠. 
2개의 사설망을 iptable을 이용해 통합.

복잡하게 이런 저런 일들을 하는 것 보다 단순한 게 좋습니다. 경로에 해당하는 IP TIME과 데이터노드 102번에 대한 설정을 진행하겠습니다. 

가. 공유기 설정 
IP TIME 공유기를 통해 192.168.1.X 대역의 라우팅을 192.168.1.102 서버에 설정합니다.
꼭 102가 아니어도 됩니다. Linux 서버 중 광랜과 통신할 수 있는 1.101, 2, 3, 4 모두 가능합니다. 

우선 위 그림과 같이 IP TIME관리자 페이지에 접속하여 
고급설정 -> NAT/라우터 관리 -> 라우팅 테이블 관리를 통해 
192.168.1.0을 입력하고 MASK 24 GATEWAY를 라우터로 사용할 서버로 설정합니다. 
끝자리를 0으로 설정하는 이유는 0은 실제로 존재하지 않는 IP입니다. 0을 입력하면 해당 대역 전체를 사용하겠다는 의미로 라우터가 받아드립니다. 

따라서 192.168.1.X 대역에 대한 호출은 모두 102번으로 가게 되는 겁니다. 

결과 확인을 위해 사용자 pc를 열어서 ping -t 192.168.1.102를 해놓았었습니다. 라우팅 테이블이 적용됨과 동시에 102에서의 응답을 받을 수 있습니다. 
하지만 102를 제외한 나머지 101, 103, 104 서버는 여전히 통신이 불가능합니다. 


나. CentOS설정
이제 192.168.0.0 대역에서 오는 192.168.1.0 요청을 192.168.1.1로 보내게 하면 되는 것 같습니다. 

switch나 공유기에서 하는 라우팅 테이블 설정이 리눅스, windows모두 가능합니다. 저희 시스템은 Linux 기반이기 때문에 리눅스에서 했습니다. 

1) routing 확인 
먼저 route 명령을 쳐서 routing table을 확인합니다. 
기본 구성된 route 테이블 
192.168.1.102에 패킷 테스트가 바로 성공해서 의아했는데 기본 gateway가 0.0.0.0으로 둘 다 공유되어 있어서 가능했나봅니다. 
--------------------------------------------------------------------------------
우선 위 사진의 "기본 구성된 route 테이블" 처럼 라우팅 테이블이 구성되어 있다면 network 카드 2개에서 발생하는 모든 패킷이 공유되는 것으로 보입니다. 따라서 라우팅 테이블은 손댈 필요가 없습니다. 

없을 경우 아래 정보를 입력합니다. 
routing 테이블에 네트워크 각각 ip영역에 대한 인터페이스 정보를 추가합니다. 
# route add -net 192.168.0.0/24 gw 192.168.0.1 enp4s0
# route add -net 192.168.1.0/24 gw 192.168.1.1 enp1s0
--------------------------------------------------------------------------------

다음은 IP 포워딩 설정합니다. 
우선 기본 포워딩을 지워주고 
# iptables -P FORWARD DROP

다음은 각 랜카드에 포워딩 허용설정을 해줍니다. 
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -A FORWARD -o enp1s0 -j ACCEPT
# iptables -A FORWARD -o enp4s0 -j ACCEPT


다음은 192.168.1. 대역에 가상ip로 접속 가능하게 허용을 해줍니다. 
# iptables -t nat -A POSTROUTING -o enp1s0  -j MASQUERADE


# 기타 centos 8.4의 경우 masquerade 설정이 firewalld 에도 존재하므로 다음 커맨드를  

# firewall-cmd --add-masquerade

3. 완료

위 설정이 다 끝나면 기본적으로 192.168.1.101~4 모두 통신이 돼야 합니다. 사용자 pc에서 ping 테스트를 모두 마친 후 정상이라면 이제 iptable 내용을 저장해야합니다.  현재 커맨드를 통해 적용된 규칙은 재부팅되면 날아가게 됩니다. 

iptables-services를 설치하면 시스템 종료 이후에도 설정 값을 유지할 수 있습니다. 다음 순서에 따라 진행하세요 


1) 방화벽 비활성화 
# systemctl disable firewalld

2) iptable 서비스 설치 
# yum install iptables-services

3) ip테이블 서비스 활성화 
# systemctl enable iptables

4) 규칙 저장 
# service iptables save

규칙은 위 과정에서 이미 다 설정이 되었으므로 별도로 작업하지 않아도 됩니다. 
위 4단계 작업을 수행했으면 해당 서버를 재부팅 된 이후에는 사용자 커맨드 환경에서 간단한 명령을 통해 network이 정상적으로 연결되었는지 확인할 수 있습니다. 
linux 콘솔이라면 traceroute  192.168.1.x
windows 콘솔이라면 tracert 192.168.1.x
명령을 통해 다음과 같은 화면을 확인하실 수 있습니다. 


###############################################################
2020.10.26 echo 1 > /proc/sys/net/ipv4/ip_forward 저장 오류 발생 
ip forward 허용 설정이 풀리는 현상이 갑자기 발생하였습니다. 
해당 설정을 영구저장 하기 위한 파일은 
/etc/sysctl.conf 파일입니다. 
해당 파일에 아래 한줄을 추가하면 재부팅 이후에도 정상 적용 됩니다. 
net.ipv4.ip_forward = 1 
###############################################################
이상입니다. 긴 글 읽느라 수고 많으셨습니다. 
읽어주셔서 감사합니다. 

2020년 3월 29일 일요일

빅알자 6.시계열 DB를 알아봅시다.

1. 개요 

시계열DB는 영문으로 "Time Series DataBase" 시간을 기반으로 삼은 빅데이터 처리 시스템을 이야기 합니다. 과거 빅데이터를 처리할 만큼의 하드웨어 인프라가 잘 갖춰지지 않았던 시절 센서 데이터를 실시간으로 처리하기 위한 기반으로 만들어졌다고 봄이 옳습니다. 실제로 시계열 DB가 강조하는 대부분의 기능은 실시간으로 데이터를 저장하고, 시각화 한다는 것을 무척 강조하고 있습니다.


2. 시계열 DB 시장점유율

일단 데이터베이스 마켓 순위를 보면 시계열 DB는 전체 순위에 들지 못합니다.

https://db-engines.com/의 자료 인용
https://db-engines.com/ 사이트에서 조사한 전체 시스템에서 RDB가 압도적인 우위를 차지하고 있으며 시계열 DB는 RDB(Relational DBMS)의 1/5 정도밖에 되지 않습니다. 그렇다고 해서 시계열DB가 나쁘거나 한건 아닙니다.

https://db-engines.com/의 자료 인용
지난 2년간의 추세를 보면 압도적인 증가 추세를 보이고 있습니다.

왜 이런 현상이 일어나는지는 지난번에 소개해드린 글을 보면 알 수 있습니다.
5.빅데이터 처리 성능. 네트워크 전략

간단히 얘기하면, 물리적으로 엄청난 양의 데이터가 지속적으로 생겨나기 때문에 구세대의 저장장치에 저장했다가 데이터 분석을 위해 꺼내는 데만 해도 수주가 걸릴 만큼 거대하기 때문이죠. 현재 대부분의 데이터베이스 처리 시스템 인프라는 기껏 해야 10Gb/s 속도의 스위치 그리고 hdd 베이스의 저장 장치를 사용하고 있습니다.

서버용 scsi 드라이브라 하더라도 개별 저장소의 I/O 최대 속도는 250MB/s에 불과하고 분산 처리된 파일을 네트워크로 공유하더라도 초당 1.5GB/s에 불과한데 쌓여있는 데이터는 PetaByte이기 때문입니다. 네트워크 속도 최대로 데이터를 추출 하더라도 1PetaByte를 추출하는데 걸리는 시간은 약 9일입니다. 물론 단순계산입니다. 대부분의 데이터 처리 시스템은 데이터 입출력이 항상 일어나고 있기 때문에 I/O부하를 생각한다면 예상 시간은 약 5~9배가 됩니다.

이런 지연 때문에 데이터를 인출하는 것 자체가 어려워지자 이러한 데이터를 분석하기 위해서 시계열 DB는 가장 데이터에 접근하기 좋은 방법을 채택했습니다. 바로 시간을 기준으로 데이터를 분산 처리하고 해당 파티션만 메모리에 올려 분석을 쉽게 만든 것이죠.

3. 시계열 DB의 데이터 저장 구조  

뭐 대부분 유사한 형태를 취하기에 알아본 중 가장 간결하게 구조를 보여주는 DB 설명서는 "Apache druid" 였습니다.
드루이드 에서는 시간의 분할 단위를 chunk '청크'라고 표현 합니다. chunk는 같은 시간 범위 내에 존재하는 데이터이고, 이 시간 범위 내에서 데이터는 RDBMS의 파티션과 같은 구조로 다시 분할됩니다. (청크를 폴더, Segment를 파일로 생각하면 이해가 쉽습니다.)
https://druid.apache.org/인용 드루이드의 SEGMENT 분할 
뭐 이런 구조로 데이터를 분할하는 것은 드루이드만의 기술은 아닐 겁니다. 분명 다른 시계열 DB도 같은 형태를 취하겠죠. 이러한 형태로 데이터를 분할해 저장하면 생기는 이점은 쿼리를 수행할 때 쿼리에 시간을 제약조건으로 사용하여 메모리에 로드할 파일의 양 자체를 줄일 수 있기 때문입니다.

RDB의 파티셔닝과 유사하지만, 다른 점은 RDB에선 파티셔닝을 255개 혹은 1024개, 서브파티션을 포함해서 만여 개를 만들 수 있지만, 관리자가 사전에 생성을 해줘야 하는 점이 다릅니다. RDB에서도 최근에는 빅데이터 처리를 위해 자동 파티셔닝을 지원하는 DB가 있습니다. 그 이야기는 다음에 하겠습니다.

과거에는 빅데이터 처리에 SPARK같은 IN MEMORY 프로세스를 중심으로 처리하는 프로세스를 많이 생각했었습니다. 하지만 엄청난 데이터 량을 메모리에 올리기 위한 처리에서 발생하는 I/O 문제 그리고 MEMORY 용량의 한계 때문에 최근 In memory는 유효하지 못한 전략이 되어가고 있죠. petabyte를 메모리를 적재할 수 있는 시스템이 없기 때문 입니다.

데이터 인출 개념 
시계열 분할 데이터는 개념적으로 보면 위 그림과 같은 처리가 가능합니다.

데이터를 인출할 때 데이터 노드에 간단한 필터 처리를 거쳐 쿼리에 만족하는 데이터만 네임드 노드로 전송한다. 이럴 경우 10Gb/s의 네트워크로도 충분히 차 한 잔 마실 시간에 petabyte급 데이터를 필요 기간 만큼 조회할 수 있을 것 입니다.

드루이드의 파티션 분할 단위는 500MB인데 이를 disk에서 로드 할 경우 3초가 걸립니다. 왜 이렇게 분산파일을 크게 가져가는지 생각해보면 이렇습니다. 파일이 너무 작은 단위로 분산 될 경우 하나의 disk에 같은 시간 파티션이 여러 건 들어있을 수 있으므로, 이럴 경우 동시에 여러 파티션을 불러오면 DISK ARM 점유에 의한 지연이 발생하기도 합니다.
DISK 구조 
DISK ARM 지연이란 위 그림과 같이 생겨먹은 DISK 구조 때문에 발생합니다. DISK는 원판 형태로 되어있고, 회전하는 원판의 특정 영역을 ARM이라는 녀석이 읽어오는데 한 DISK에서 여러 SEGMENT를 동시에 읽어버릴 경우 ARM이 동시에 3파일을 읽으려 ARM을 바쁘게 움직이기만 하고 실제로는 순차적으로 읽는 것 보다 지연되는 현상이 발생하게 되는 것이죠. 따라서 DISK I/O가 가지는 읽기 속도가 160MB/s라고 해도 50MB 파일 3개의 파일을 동시에 읽어오면 1초에 끝나지 않고 지연이 발생해서 1.5초 혹은 3초가 되기도 합니다.

드루이드에서 파티셔닝 크기가 500MB인 이유는 이런 저런 계산 끝에 최적 값을 찾은 것 이라고 한번 믿어보겠습니다. 혹은 SSD를 기준으로 읽기 쓰기 속도를 맞춘 것 일 수 있습니다.

오늘은 여기까지 써야겠습니다. 다음에 또 뵙죠. 읽어주셔서 감사합니다.

빅데이터 개념잡기 '빅알자'는 여러 페이지로 이루어질 것 입니다.

2020년 3월 8일 일요일

빅알자 5.빅데이터 처리 성능. 네트워크 전략

개요 

빅데이터 처리에 스토리지와 네트워크 전략이 필요한 이유는 어디까지나 빅데이터를 쌓아두던 기존 관점이 아닌 활용하기 위해 다양한 분석이 필요해지는 시점에서 하드웨어 성능이 따라주지 못하는 현상을 가장 많이 보고 있기 때문입니다.

빅데이터의 초기 수집에는 일반 PC급의 성능으로 충분히 모든 일을 진행할 수 있습니다. 예를 들어 초당 1회씩 시그널을 보내는 장비가 10만개 있다 하더라도 하둡 클러스터 5개정도면 저장하는데 지장도 없고, 카프카 멀티큐도 1개면됩니다.

하지만 Petabyte 급의 성능은 다릅니다. 일반적인 시스템 구성에서 하둡 클러스터를 아무리 늘린다 한들 성능이 나오지 않습니다.

http://sortbenchmark.org/
위 사이트를 확인해보면 빅데이터의 정렬 성능을 밴치마크 해놓은 자료를 볼 수 있습니다.

그중 눈에 띄는 것은

Tencent Sort
Apache Spark
Hadoop
이 세 가지인데요 각각의 하드웨어 성능에 대해 이야기 해보겠습니다.

1. 정렬 성능 이란 ? 

정렬 성능은 특정 기간의 데이터 혹은 전체 기간의 데이터를 기준으로 데이터의 순위를 매기는 프로세스 입니다. 즉 전체 데이터를 메모리에 올려 순서를 매긴 후 결과를 제공하는 일입니다.

따라서 적절한 정렬 메모리가 확보되지 못한다면 기존 시스템에서 성능 문제가 발생하곤 했습니다. 그런데 빅데이터? 에서의 적절한 성능은 어느 정도 일까요?

Petabyte는 현존하는 어느 컴퓨팅 시스템에서도 한 번에 메모리에 올릴 수 없을 만큼 거대한 양 입니다. 이것이 분할되어 있다 하더라도 문제는 여전히 나아지지 않습니다.

일반적인 PC의 메모리는 많아봐야 32GB 일 것이고, 클러스터를 10대 한다고 해도 320GB, 클러스터를 100대 한다면 32TB, Petabyte에는 도저히 미치지 못합니다. 따라서 연산할 수 없는 데이터는 디스크에 메모리를 내렸다가 다시 올리는 SWAP 이라는 행위를 반복하면서 정렬을 할 수 밖에 없습니다. 디스크 입출력이 반복되면서 IO 부하가 발생하고, 이 때문에 다른 프로세스를 처리하지 못하는 상황이 발생합니다.

그래서 스토리지 전략과 네트워크 전략이 필요합니다.

2. 필요한 장비의 속도

Petabyte를 1초 만에 처리하는 시스템은 현재 어디에도 없습니다. 있다면 자랑하려고 sortbenchmark.org에 등록했을 것 입니다. 검증된 결과를 기준으로 시스템의 도입 여부를 결정하기 때문에 팔기 위해서라도 등록을 하게 됩니다.

탐구해볼 시스템의 성능은 아래와 같습니다.

Tencent Sort(2016) 성능 비고
성능 44.8TB/min
cpu 2 OpenPOWER 10-core POWER8 2.926 GH
memory  512 GB
disk 1.2TB NVMe SSD 1 TB: 3,500/1,000 MB/s
8 TB: 3,500/2,600 MB/s
network 100Gb Mellanox ConnectX4-EN 12 GB/s
병렬 nodes 512
Apache Spark(2014) 성능 비고
성능 4.7TB/min
cpu 2.5Ghz Intel Xeon E5-2670 v2
memory  244GB 
disk 8x800 GB SSD 1,750/1,750 MB/s
network 25 Gbps (3GB/s) 3GB/s
병렬 nodes 207 
Hadoop(2013) 성능 비고
성능 1.42TB/min
cpu 2 2.3Ghz hexcore Xeon E5-2630
memory  64GB 
disk 12x3TB disks 120  MB/s
network 10 Gb/s 1.2GB/s
병렬 nodes 2100

성능에 대한 해석을 해보자면 비고를 보시면 간단합니다. Disk와 network 속도에 의해 좌우되는 것이 명확하게 보입니다.

맨 밑에 하둡이 야후 시스템입니다. 딱 봐도 노드만 늘리면 되겠지 하고 만든 것 같습니다. 2013년 이니 그럴 만 합니다.

네트워크 성능을 보면 1.2GB/s와 3GB/s의 성능 차는 정확하게 3배가 납니다. 즉 병렬 노드의 네트워크 성능이 데이터 크기를 따라가지 못하고 있다고 생각하시면 됩니다.

그리고 1등인 tencent 의 경우 네트워크는 물론 디스크까지 성능을 잘 끌어주고 있습니다. 2016년도 당시 최고 시스템이라고 봐도 과언이 아닙니다. Mellanox 스위치의 경우 현재 200Gb/s를 지원해주는 것으로 알고 있습니다. 약 3200 만원입니다.

spark는 아마존 EC2를 사용한 환경입니다. 아마존의 스펙 중 네트워크 부분은 클라우드이기 때문에 처리속도를 저 정도로 해둔 것 같습니다.

1위인 tencent 시스템과 spark의 성능 차를 보면 좀 더 명확히 보입니다. 디스크의 읽기 쓰기 속도가 받쳐준 이후는 네트워크 속도가 성능을 좌우하게 됩니다.

즉. 기술이 어쩌고, 인 메모리 프로세스가 어쩌고 이야기하기 전에 하드웨어의 성능이 제대로 갖춰지지 않으면 Petabyte처리는 무슨 기술을 써도 느려터지게 쓴다는 말입니다. 2013년 하둡 클러스터 환경을 가지고 Petabyte를 처리하는 것은 드루이드 할애비가 와도 안 될 일입니다.

3. 왜 이런 현상이 나타나느냐? 

뭐 지난번에도 언급했지만 연산이라는 것은 메모리에 올리고 전송하고 저장하는 일의 반복이기 때문입니다.
클러스터 노드가 있는 환경의 처리 순서는 대략 이렇습니다.

1. 마스터가 슬레이브에 데이터 요청
2. 슬레이브가 데이터 파일을 로드, 전송
3. 마스터가 메모리에 데이터를 로드, 초과 데이터는 디스크에 메모리 형태로 저장
4. 현재 메모리를 정렬하고 결과를 디스크 저장
5. 디스크에서 정렬되지 않은 메모리 데이터 로드

4번 5번을 디스크 스왑이라고 하며 이 부분 때문에 디스크의 속도가 빠른 것이 중요합니다. 솔직히 메모리 속도까지 올라와줬으면 좋겠지만.. PCI-E5가 나와야 한다고 합니다.

그리고 네트워크 성능은 디스크가 500MB/s이상을 내며 단일 노드 라면 10Gb/s로 충분하지만 다중 노드라면 100Gb/s 이상의 속도는 나와야 합니다.

스위치는 개별 노드에 100Gb/s 속도를 내는 것 같이 이야기를 결론적으로 마스터가 받아드릴 수 있는 데이터 량은 스위치 최대 속도 단일라인과 다른 게 없습니다. 따라서 마스터 장비의 네트워크는 다중화 되어야 하며 이런 전체적인 조화를 만들어내야 Petabyte 데이터의 분석은 비로소 가능해집니다.

이상 네트워크 전략은 이 정도로 마치겠습니다. 
읽어주셔서 감사합니다. 

빅데이터 개념잡기 '빅알자'는 여러 페이지로 이루어질 것 입니다.