Category Archives: NOTE

시스템 트레이딩 – 시계열 데이터 TimeSeries Data 저장

데이터 분석 – 옛날

시계열 데이터 저장

예전에는 증권데이터를 저장할 마땅한 방법이 없었다.

처음에는 MS SQL에 저장을 했었는데… 젠장. 다음날까지 insert를 하고 있다.
트랜잭션, 벌크인서트 쿼리, 인덱스변경 여러가지 해 봤지만… 별 차이는 없었다.
이 때 처음 알게 됐다. 디비에 파일을 넣는게 바로바로 쏙쏙 들어가는게 아니군.

파일에 저장을 해 봤다.
2018/10/12/000060.dat 이렇게계층형으로 저장을 했는데 이게 관리가 힘들다. 검색도 힘들고… 순차적으로 로딩만 하면 되는데

시계열 데이터 분석

실시간 데이터를 분석할 방법은 많이 보였다.

당시 Marketcetera, Streambase, Esper 등의 CEP툴들.. RuleEngine.

근데 뭐.. 저장할 방법이 없으니 쓸모가 없었다. 이것들도 딱히 쓰기 좋게 잘 나와 있지도 않았고

그래서 뭔가를 만들었나?

아니. 그냥 몇년 기다렸다.

그랬더니 역시 뭔가 나왔다.

데이터 분석 – 최근

Hadoop, HDFS, Hbase 하둡이 나오고 막 발전하기 시작하더니

Spark, Storm, Cassandra, OpenTSDB, Prometheus 등 다양한 방법이 나오기 시작했다.

Minio, Ceph, …

다양한게 나왔는데.. 너무 난립 해 있어서 오히려 머리가 아플 지경이다.

한개가 압도적으로 좋으면고민도 안 할텐데

배치분석 : Map Reduce, Spark

실시간 분석 : Storm, Spark

컬럼디비 : Cassandra, HBase

시계열디비 : OpenTSDB, Prometheus, InfluxDB, vaultaire, Riak, Whisper(graphite)

파일저장소 : minio, HDFS, ceph

로그 수집 : Fluentd, Flume, Logstash, Scribe

MQ : RabbitMQ, Kafka

기타 : ZooKeeper

이 중에서 한개만 고르면 땡인 것도 아니다. 이것들끼리 의존관계가 얽혀서…

고민되는 부분

ceph를 쓰면 vaultaire와 hadoop, hbase의 backend로도 쓸 수 있다.
비공식 플러그인 지원이라서 좀 문제가 발생할 가능성도 있다.
로그저장. 파일저장도 할 수 있고.
설치가 쉽진 않다.
hdfs보다 좀 더 활발하게 사용되는 것 같기도 하고…

hdfs를 쓰면 hbase, opentsdb, map reduct … 이렇게 자연스럽게 연결. 
레퍼런스가 많다.

aws, gcp를 써도 되지만… 월비용 10만원을 넘을 때 까지는 집에서 운영하고싶은 생각에..

지금 중학생이면 얼마나 좋을까…

사용기술 선정

Spark – 배치분석, 머신러닝돌리기 좋고 호환이 잘된다. 레퍼런스도 많다.
Storm – 실시간 분석, 스파크는 완전실시간이 아닌 마이크로 배치. 조금 다르다. 일단 사용 후 필요한지 검증.
HDFS – 오브젝트저장소, 호환성이 좋다. 성능도 나쁘지 않다.
HBase – 컬럼DB, HDFS를 백엔드로 사용한다. ceph를 쓸 수도 있지만 기본옵션으로 쓰는게 속편하다.
OpenTDSB – 백엔드 저장소로 Cassandra, HBase, GoogleBigtable을 사용.
Fluentd – 로그수집, 가볍고 간단하다.
Kafka – MQ. RabbitMQ도 나쁘진 않지만.. 하둡 쓸 때는 Kafka 쓰는거다. 분산형으로 사용하기 더 좋다는 결과를 본 것 같다. 호환성은 RabbitMQ가 더 좋았던 것 같은데..
Minio – 파일저장소. 오브젝트는 제외. 파일 저장소로 사용.

ㅃㄲ(빅)데이터는 마케팅 용어다

씨잇팔 삑데이터 더럽게 좋아하네

빅데이터 국비교육 과정이고 빅데이터 젛문가고 삑떼이터 분석이고

여기저기 빅데이터 엄청 들먹인다.

토끼뉴스 빅데이터 분석이니 트위터 빅데이터 분석이니

뉴스 중간에도 어디선가 빅데이터 분석을 했다고 하고

빅데이터 전문가라는 사람이 나와서 뭔 설명을 해준다

빅데이터. 이건 그냥 마케팅 용어다.

삑떼이터 용어가 처음 유행한게 2012년경인가?
4차산업혁명이나 유비쿼터스 스마트시티 등등처럼 실체가 불분명한 마케팅 용어에 불과하다.

데이터 분석은 계속 있어왔고 계속 있을건데

빅데이터라는 개념때문에 시대가 갈라지진 않는다. 어차피 데이터 분석 잘 하던 사람은 빅데이터 분석도 잘 한다.

빅데이터 분석 플랫폼/솔루션이 따로 있기는 하지만 어차피 중요한 것은 시스템관리능력과 통계지식 등등이니까 변하는 것은 없다.

약간 다른점

하둡, 카산드라, 스파크 등 분산형 디비/분석툴 등등이 개발됐다. 그 전까지는 슈퍼컴퓨터로 하던 일들..

Clojure 이용한 아무거나 개발

노는김에.. 클로저로 뭘 만들어보려고 하는데..
프레임워크가 필요할 것 같아서

두가지
* http://clojure-liberator.github.io/liberator/
* https://github.com/weavejester/compojure
* https://github.com/cmiles74/bishop
* Luminus – Leiningen
https://stackoverflow.com/questions/26674766/clojure-rest-api-frameworks

클로저는 문법이 희한해서 왠지 해보고 싶지 않나

빌드 툴은 Gradle을 이용. Leiningen이 표준이지만.. 공산당 같은 이름이라 안 쓰기로 했다.
최근 Gradle에서도 Clojure 플러그인이 있으니 그걸 쓰겠다.
IDE는 Intellij에서 할건데 Cursive를 깔면 좋다고 하지만.. 유료라 안깔고 쓸 것 같다.

서버 – Cloud vs IDC

그냥 다 귀찮으니 편하게 쓰고 싶다면 Cloud를 쓰는게 맞다. 서버 조그만거 껐다 켰다 하는 경우에는 Cloud가 가격도 싸고..
그런데 뭔가 조금만 무겁게 돌리려고 하면 Cloud의 GCP기준 2cpu 월3만원 4gb 서버는 좀 버거워 하는게 느껴진다.
Kubernetes가 자동으로 설치되고, Storage(s3, goosto..) 처럼 설치해서 관리하기 매우 난감한 솔루션도 종량제로이용 가능. minio, hdfs등을 설치해서 관리하려면 머리가 아프고 소규모로 쓰는데 이걸 설치하려면 골이 아프다.

서버2개정도로 빡빡하게 돌리려면 IDC
통큰아이 서버 중에 5만원~10만원 정도 하는거 두개쯤 쓰면 된다. 단기계약도 가능.

스케일업다운해가면서 테스트 할거면 Cloud

고정적으로 돌릴거면 IDC 코로케이션
http://www.koreaidc.com/03_colo/colo_type.html
액면가(협의가능) 쿼터렉(20Mbps) 25만, 하프렉(50Mbps) 60만, 풀렉(100Mbps) 110만
LG IDC
http://www.uplus.co.kr/biz/bzid/clct/RetrieveBzIdCoIt.hpi
부가포함 – 쿼터 44만, 하프 75.5만 풀 121만
네트워크나 기타 서비스 가격 차이가 있을 수 있다.
평촌IDC를 쓰면 AWS 다이렉트 연결도 가능.

하이브리드 사용을 하려면 AWS Direct 네트워크 연결이 되는 IDC를 선택하면 된다.

결론은

없지만… 개인적으로는 그냥 로컬서버(집에다가) 두개정도 돌려놓고 개발 하다가 클라우드에 한두개정도 올리고… 클라우드 비용이 100만원을 넘는 시점에 하이브리드 환경을 고려 해 보는게 좋지 않을까

요즘시대에 완전 온프레미스 환경을 구축하는건 좀 비효율적이라고 생각한다. s3와 같은 환경을 직접 구축하는건 … 필요해지는 순간이 오긴할까

Gradle 플러그인 선언 스타일

요즘방법

플러그인 검색 페이지 : https://plugins.gradle.org/
옛날건 properties 파일에 플러그인 버전을 다 설정 해 놨는데 새로운 설정방법으로 하면 값을 가져오지 못한다. 자주 하는건 아니니가 그냥 노가다 표기법 사용.

옛날방법

멀티모듈, 버전 설정파일이 있는 경우 사용

옛날방법은 낭만이 있었는데 요즘건 너무 삭막해

서비스 베이스 프로젝트

뭔가 개발하려면 꼭 필요한 녀석들이 있다.
그리고 한번 개발 해 놓으면 계속 쓸 수도 있고
(나만그런가 싶기도 하지만)

Infra : DB, MQ, MemoryStorage, FileStorage

App : 파일저장, SSO

클라우드로 하면 되는데.. 왠지 클라우드를 쓰기 싫을 때도 있고

그럴 때 필요한 것들

FileStorage

하듭 파일시스템을 써야되나 고민했는데 아마존 S3처럼 쓸 수 있는게 있다고 한다.
minio https://www.minio.io/
https://github.com/minio/minio
fakes3 https://supso.org/projects/fake-s3
https://github.com/jubos/fake-s3

s3 기능을 많이 흉내내서 만들었다고 하는데 안정성은 잘 모르겠지만 남는피씨서버하드에 돌리기 좋아보인다.

Kotlin DSL – BeanDefinitionDSL.kt

코틀린 DSL Bean 선언.

이거 공부 좀 하면 커스텀 빈도 만들 수 있지 않나

샘플코드
https://github.com/sdeleuze/spring-kotlin-functional
가이드 페이지
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way

한글 번역이나 어설프게 소스코드 붙여놓고 설명하면 더 헷갈릴 것 같다.

이해할 것도 없고 간단하니 그냥 소스 리포지터리 보는게 더 쉬움.

Kotlin에서 slf4j 로거 선언


SLF4J loggers in 3 ways from Kotlin


자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.


class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin

inline fun logger(): Logger {
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}

이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다

class MemberService {
companion object {
private val log = logger()
}
}

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨

private val log = logger()
class MemberService {
}

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?


interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}


abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}

코틀린Kotlin에서 자바 인터페이스 getter 처리

문제의 getter를 포함한 UserDetails 인터페이스

자바에서의 처리

코틀린Kotlin에서의 처리

1.

2.

3. 이게 제일 깔끔하고 알아보기 편하다.

상황에 따라 1,2번을 써야하는 경우가 있기는 할까