스칼라의 DynamicVariable은 Java의 Thread Local State 변수와 동일한 효과를 가진다. 




import scala.concurrent.ExecutionContext
import scala.util.DynamicVariable

object DynamicVariableExample extends App {

def execute(body: =>Unit) = ExecutionContext.global.execute(new Runnable {
def run() = body
})

val dyn = new DynamicVariable[Int](10)

def doSomething = println(Thread.currentThread().getName() + ":" + dyn.value)

dyn.withValue(1) { execute(doSomething) }
dyn.withValue(50) { execute(doSomething) }
println

}



결과


scala-execution-context-global-11:1

scala-execution-context-global-12:50




내부 코드를 살펴보면,java.lang.InheritableThreadLocal을 사용하고 있다. 


class DynamicVariable[T](init: T) {
private val tl = new InheritableThreadLocal[T] {
override def initialValue = init.asInstanceOf[T with AnyRef]
}


public class InheritableThreadLocal<T> extends ThreadLocal<T> {


Posted by '김용환'
,



카산드라에서 복합 기본 키(compound primary key)에 대한 설명이다. 


모든 카산드라 테이블에는 파티션 키가 있어야 한다. 클러스터링 컬럼은 선택 사항이다.



즉, 테이블은 하나 이상의 파티션 키 컬럼과 0개 이상의 클러스터링 컬럼을 정의할 수 있다.


카산드라의 테이블의 파티션 키는 로우을 논리적으로 관련된 번들로 그룹핑한다. 




클러스터링 컬럼의 작업은 파티션 내의 로우 순서를 결정한다. 


읽기 시간을 데이터를 읽을 때 많은 엘리먼트에서 분류하는 것은 비용이 많이 든다. 


다행히도 카산드라는 로우를 클러스터링 순서로 저장한다. 그래서 로우를 검색할 때, 로우는 저장된 순서대로 로우를 리턴할 뿐이다. 읽을 때 값 비싼 정렬 작업이 없다는 점이 장점이다. 



동일한 기본 키를 공유하는 모든 로우는 디스크에 연속적으로 저장된다. 로우는 클러스터링 컬럼 값 별로 정렬된다. 


각 파티션은 저장소 레벨에서 엄격하게 바인딩되기 때문에 동일한 파티션 키를 공유할 수 있는 로우 개수에 상한이 있다. 

이론적으로 해당 상한 값은 약 20억 개의 전체 컬럼 값이다. 예를 들어 10개의 데이터 컬럼을 가진 테이블이 있는 경우 상한 값은 파티션 키 당 2억 개의 로우가 된다.


복합 기본 키를 사용하는 데이터 모델링에 대한 자세한 내용http://www.datastax.com/documentation/cql/3.1/cql/ddl/ddl_compound_keys_c.html를 참조한다.



따라서 클러스터링 키에 uuid 값이 있다면 정렬이 자동으로 되어 SELECT로 이를 활용해 읽을 때 정렬할 필요가 없어진다. 

Posted by '김용환'
,


카산드라에 존재하는 uuid version 1 테스트 코드이다. 



cql은 다음과 같이 사용한다.


cql> SELECT "uuid", DATEOF("uuid"), FROM "activities";


uuid | system.dateof(uuid)

---- + ----------------------------

11.. .   2017-05-30 01:13:21.813000+0000




http://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html



실제 코드로 테스트해볼 수 있다. 



import java.util.Date;

import java.util.Map;

import java.util.UUID;



UUID uuid = com.datastax.driver.core.utils.UUIDs.timeBased(); 

String uuidStr = uuid.toString(); 

System.out.println(uuidStr); 




결과는 다음과 같다.


c4888d00-61f3-11e7-afc1-53e0e7faa58a

Thu Jul 06 11:35:26 KST 2017




uuid의 timestamp를 보고 싶다면 UNIXTIMESTAMPOF 함수를 사용한다. 



cql> SELECT "uuid", UNIXTIMESTAMPOF("uuid"), FROM "activities";

 system.unixtimestampof(id)

+----------------------------

              1401412401813

              1401411917725



UNIXTIMESTAMPOF 함수는 UUIDs.unixTimestamp()와 동일하다.


long timestamp = com.datastax.driver.core.utils.UUIDs.unixTimestamp(uuid) ; 

System.out.println(new Date(timestamp));


Posted by '김용환'
,


아파치 쓰리프트(apache thrift)의 bool 타입은 true와 false만 사용할 수 있다.


https://thrift.apache.org/docs/types


  • bool: A boolean value (true or false)

만약 null이면 false로 이해한다.




만약 true, false, not_set의 의미로 3개의 상태 값을 갖게 하려면 byte(i32 등등) 또는 enum을 사용하는 것이 좋다.






Posted by '김용환'
,

스칼라에서는 underscore를 많은 용도로 사용할 수 있다.


그 중 변수를 기본값으로 초기화를 하라라는 의미이다. 


scala>  var a: String = _

a: String = null



var에 underscore를 사용할 수 있지만, val에 사용하면 에러를 리턴한다. 



scala>  val a: String = _

<console>:11: error: unbound placeholder parameter

        val a: String = _

                        ^


함수도 초기화할 수 있다.


private var myExpr: () => Int = _






scala 언어 스펙에 따르면.. 다음과 같이 정의하고 있다.

http://www.scala-lang.org/files/archive/spec/2.11/06-basic-declarations-and-definitions.html




A variable definition var $x$: $T$ = _ can appear only as a member of a template. It introduces a mutable field with type $T$ and a default initial value. The default value depends on the type $T$ as follows:

defaulttype $T$
0Int or one of its subrange types
0LLong
0.0fFloat
0.0dDouble
falseBoolean
()Unit
nullall other types



Posted by '김용환'
,


람다 이론에 대해서 정확히 알지도 못한채 공부하고 책을 번역했다. 휴. 부족한 것이 많다.




Deduction, Reduction, Lamda Calculus, Substitution model.. 



코세라 강의https://www.coursera.org/learn/progfun2/lecture/Gd31A/lecture-3-1-functions-and-state) 중에 Church-Rosser의 람다 이론이 나와서 공부하기 좋은 링크를 걸어본다.


http://www.aistudy.com/pioneer/Church.A.htm


http://www.aistudy.com/computer/lambda_calculus.htm


https://groups.google.com/forum/#!topic/han.sci.math/SwxTPD2AYmM



https://www.cs.cornell.edu/~kozen/papers/ChurchRosser.pdf



https://en.wikipedia.org/wiki/Church%E2%80%93Rosser_theorem



http://syjdev.tistory.com/15

http://syjdev.tistory.com/16

http://syjdev.tistory.com/17

http://syjdev.tistory.com/18







'scala' 카테고리의 다른 글

[scala] DynamicVariable 예제  (0) 2017.07.07
[scala] 변수를 사용하기 위한 underscore  (0) 2017.07.05
[scala] Stream 의 concat은 #::이다.  (0) 2017.07.03
[scala] forall, for 예제 코드  (0) 2017.06.30
[scala] forall 표현식  (0) 2017.06.30
Posted by '김용환'
,



cassandra의 null의 개념은 '없다'를 의미하고..


관계형 데이터베이스에서의 null은 정의하지 않음(미지의 값)을 의미한다.



 SELECT * FROM "profiles" WHERE "location" IS NULL;

SyntaxException: line 1:42 mismatched input 'NULL' expecting K_NOT (...FROM "users" WHERE "location" IS [NULL]...)




참조


https://ko.wikipedia.org/wiki/Null_(SQL)



수학적 연산[편집]

널은 데이터 값이 아니라, 미지의 값에 대한 표시일 뿐이기 때문에, Null에 수학적 연산을 사용하는 것은 미지의 값으로 나타난다.[4] 아래의 예에서, 10을 Null에 곱하면 결과값은 Null이 된다.:

10 * NULL          -- 결과는 NULL

이것은 예기치 않은 결과를 야기한다. 예를 들어, 널을 0으로 나누려 한다면, 플랫폼은 ‘0으로 나눈’ 예상된 데이터 예외값을 던지는 대신, 널 값을 반환한다.[4] 비록 이러한 행위가 ISO SQL 표준으로 정의되어 있지는 않지만, 많은 DBMS 벤더들이 이러한 연산을 유사하게 다룬다. 예를 들어, 오라클, PostgreSQL, MySQL 서버, 그리고 마이크로소프트 SQL 서버 플랫폼은 모두 널 값을 아래와 같이 반환한다 :

NULL / 0



Posted by '김용환'
,


APM하면 apache, php, mysql이 떠오르듯이 


최근에 외국에서 SMACK 이라는 스택이 떠오르고 있는데, 이는 spark, mesos, akka, cassandra, kafka로 이루어진 스택을 의미한다. 


신선한 즐거움을 준 책이다.  특히 마지막 3장 사용 사례는 나에게는 충격이었다. 버전이 낮긴 하지만, 중요치 않았다.



Spark + Mesos + Cassandra의 알싸한 조합!!!






https://www.amazon.com/Fast-Processing-Systems-SMACK-Stack/dp/1786467208/


https://www.packtpub.com/big-data-and-business-intelligence/fast-data-processing-systems-smack-stack



## 2017년 12월 1일 추가 내용


http://www.acornpub.co.kr/book/data-processing-smackstack




역자 내용.

"서버 개발자의 입장에서는 웹서비스든, 앱서비스든 단순히 서버를 개발하는 것만으로는 서비스가 완성되지 않는다. 서비스 개발이 완성됐다 하더라도 고객문의(CS), 시스템 모니터링 등 데브옵스 업무 등이 남아 있다. 서비스 데이터 또는 로그를 백엔드에 전달해 모니터링뿐 아니라 사용자의 활동 지표로 활용하기도 하고, 머신 러닝을 활용해 추천 친구나 추천 시스템을 개발하기도 한다.

서비스 로그를 파일로 저장한 후 파일 데이터를 옮겨 빅데이터 저장소에 해당 서비스 로그를 저장하는 아키텍처를 데이터 파이프라인(data pipeline)이라고 한다. 데이터 파이프라인 처리 아키텍처에서는 멀티 테넌시(multi-tenancy), 확장, 대용량 처리, 실시간 데이터 처리를 지원해야 한다. 또한 저장된 빅데이터 저장소를 기반으로 실시간 분석 및 대용량 처리를 하고 지표, 모니터링, 추천 시스템으로 활용해서 사용자의 재방문률을 높일 수 있는 인사이트를 얻어야 한다.


처음에는 데이터 파이프라인과 데이터 분석이 무척 낯설 수 있다. 나도 처음부터 파이프라인과 데이터 분석을 시작한 것이 아니라서 많이 낯설었지만, 회사에서 업무를 진행하면서 조금씩 알아가고 있다. 외국에서는 데이터 파이프라인과 분석을 완벽히 해결할 수 있는 방법으로 하나의 오픈소스가 아닌 여러 오픈소스를 묶어(스택) 데이터 프로세싱을 처리하기 위한 다양한 시도를 하고 있다.


이런 흐름 속에서 2016년, 샌프란시스코 베이 에어리어(San Francisco Bay Area)의 데이터 엔지니어링 회의 및 컨퍼런스에서 "Spark, Mesos, Akka, Cassandra, Kafka Laying down the SMACK on your datapipelines"(링크: https://goo.gl/ny5Lwm, 발표 동영상: http://goo.gl/XVuxj8)라는 주제가 발표됐다. 이런 발표의 영향을 받아 관련 내용이 본 도서로 출판하게 됐다. 이 책에서는 데이터 인메모리(in-memory) 분산 컴퓨팅 기능이 포함된 스파크(Spark), 클러스터 OS(Cluster OS), 분산 시스템 관리, 스케줄링, 확장 기능이 포함된 메소스(Mesos), 스칼라 언어의 액터 모델의 구현인 아카(Akka), 영속성 계층인 noSQL 데이터베이스인 카산드라(Cassandra), 분산 스트리밍 플랫폼(메시지 브로커)인 카프카(Kafka)를 기반으로 데이터 파이프라인 아키텍처를 구성하는 SMACK 스택을 소개하고 있다.



이 책은 SMACK 스택을 전혀 모르는 개발자를 위한 책이다. 개별 컴포넌트를 쉽게 설명했고, 파이프라인 스택에 대한 아키텍처를 배우기에 적절하다. 특히 마지막 3장은 사례를 통해 SMACK 스택을 기반으로 하는 아키텍처를 배울 수 있다."




2017년 12월에 출간된다. - SMACK 스택을 이용한 빠른 데이터 처리 시스템










오랄리 페이지에서도 SMACK을 소개하면 좋으니 참고하면 좋을 듯 하다.


https://www.oreilly.com/ideas/the-smack-stack






Posted by '김용환'
,



Mastering Elasticsearch 5.x 는 일래스틱서치 5.x에 대한 설명을 담은 책이다. 


예제 단위로 하나씩 설명한 책은 아니고 일래스틱서치를 어느 정도 다룬 개발자나 운영자가 보면 재미있어할 만한 책인 듯 하다. 


(언제 나올라나..)



https://www.amazon.com/Mastering-Elasticsearch-5-x-Bharvi-Dixit/dp/1786460181





에이콘 출판사 기준 주간 9위까지 올라갔다. 





Posted by '김용환'
,



쉘 프로그래밍(Shell programing)에 관련된 책이지만 쉽지만 튼튼하게 설명된 책이다.


단순히 써보는 수준이 아니라 깊은 통찰력을 주는 책인듯 하다.


역시 내가 모르는 내용이 있었다!!! 끝없이 겸손하게 공부해야겠다는 생각이 들었다. 




https://www.amazon.com/Shell-Programming-Unix-Linux-Developers/dp/0134496000





Posted by '김용환'
,