나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

전체 글 105

[Java8] sorted groupBy

이번에는 간단한 주제로 글을 짧게 남겨보고자 한다. stream의 groupBy와 관련된 내용이다. 개발을 하다가 List에 있는 객체의 특정 값으로 groupBy를 했다. 문제는 groupBy된 결과가 group key로 사용한 값의 순서로 정렬이 되지 않은 부분이다. 데이터 가공의 결과로 group key 값으로 정렬을 해줘야 사용하는 측에서 용이했기 때문이다. 관련해서 java doc을 찾아보았더니 같은 groupBy 함수에서 argument가 다른 함수가 존재했다. public static Collector groupingBy( Function

Language/Java 2019.01.11

[multi thread] java.util.concurrent Part 1

Java에서는 멀티스레드 프로그램을 작성하는데 도움이 되는 많은 클래스들을 구현해 놓았다. java.util.concurrent 패키지 안에 포함되어 있는데 패키지 내용을 잘 설명한 IBM의 문서가 있어서 이해한 만큼 한글로 정리해 보고자 한다. 1. TimeUnitTimeUnit는 class가 아닌 Enum 타입이다. TimeUnit을 사용하면 코드를 읽기 쉽도록 만들어 준다. Java 개발자가 millisecond 단위의 숫자로 코드를 지저분하게 하는 대신 사용하면 좋다. MILLISECONDS, MICROSECONDS에서부터 DAY, HOURS에 이르기까지 개발자가 다루고자 하는 대부분의 범위의 시간을 표현할 수 있다. 또한 enum에 구현된 함수를 통해 시간 단위 변환을 쉽게 해준다. 2. Cop..

Language/Java 2019.01.04

[Kafka] consumer group offset change by python.

Kafka consumer 관련 2번째 글이다. 지난 글에서 LAG에 대해서 설명했는데, consumer group과 offset에 대한 설명을 빼 놓고 지나가니 이해하는데 부족할 수 있어 consumer group에 대한 개념 설명을 하고자 한다. 그리고 추가로 consumer group의 offset을 변경하고자 할 때가 발생할 수 있는데 간단한 python 코드로 offset을 변경하는 방법을 알아보자. offset을 왜 변경하지? 라는 질문이 있을 수 있는데, consumer group에 대해서 이해하면 질문에 대한 답이 저절로 될 듯 하다. 1. consumer group 아래 그림이 consumer group을 이해할 수 있는 가장 좋은 그림이다. Kafka의 Topic은 여러 partitio..

Big Data/Kafka 2018.12.31

[Kafka] consumer LAG 수집 및 elasticsearch 적재

Kafka에 저장된 데이터를 consumer를 통해 처리를 하고 있을 때, 개발한 코드로 데이터가 잘 처리되고 있는 건지 궁금할 때가 있다. consumer의 데이터 처리 상황을 주기적으로 모니터링 한다면 처리하지 못하고 Kafka에 남아있는 데이터 수치를 알아야 한다. Kafka에 남아 있는 데이터 수의 증감을 통해 consumer의 throughput도 계산할 수 있다. Kafka 문서에 보면 consumer group의 현재 position을 얻는 command가 있다. 다음은 해당 command인 kafka-consumer-group.sh의 실행 예제이다. > bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --g..

Big Data/Kafka 2018.12.28

[Kafka] Topic의 Replica 분배 로직 분석

Kafka에서 topic을 생성할 때, partition 별로 replica를 어떻게 할당하나 찾아보았다. 여러개의 broker를 가진 Kafka Cluster를 운영할 경우 각 broekr 마다 replica 불균형이 발생한다. 최고 topic 생성 이후에 broker shutdown 등 다른 이유에 의해 replica가 바뀔 수 있겠지만 topic 생성 최초에 partition 별 replica 할당이 어떻게 되나 궁금했기 때문이다. 그래서 topic이 생성하는 코드 안쪽에서 partition 분배 로직을 뒤졌다. partition 분배 로직에는 broker의 rack 설정이 있는 것과 없는 것 2개의 로직이 존재했다. 이 글에서는 rack이 없는 설정에 대해서 먼저 분석해 본다. 다음은 partit..

Big Data/Kafka 2018.11.22

Spark SQL

팀에서 spark SQL을 사용해서 사용자가 요청한 쿼리를 stream 처리하는 작업을 하고 있다. 그래서 spark SQL에 대해서 정리해 보고자 한다. 해당 블로그의 내용은 책 '스파크 2 프로그래밍'에서 대부분 참고했다. 1. RDD와의 차이점 spark의 기본 데이터 모델은 RDD 이다. 분산환경에서 메모리 기반으로 빠르고 안정적으로 동작하는 프로그램을 작성할 수 있는 장점이 있지만 아쉬운 점도 있었다. 그것은 "스키마"에 대한 표현방법이 없다는 것이다. spark 2.0 부터 DataSet으로 통합되어 "스키마" 있는 데이터 처리가 가능하다. "스키마"라는 단어를 처음 들었을 때, 제일 먼저 데이터베이스가 생각났다. 데이터베이스가 설정된 스키마에 따라 SQL문을 던지면 결과를 주듯이, DataS..

Big Data/Spark 2018.11.20

아트 인문학 여행

아트인문학 여행국내도서저자 : 김태진,백승휴출판 : 카시오페아 2015.05.25상세보기 유럽 여행을 가게 되면 미술관, 성당을 많이 찾게 된다. 그럼 걸작이라 불리는 많은 그림을 마주하게 되는데, 정작 그림 뒤에 숨어 있는 역사나 명작의 이유를 알지 못하면 그저 유명한 그림을 본 추억에 머물게 된다. 나 역시도 처음 이탈리아 여행에 다녀온 이후 르네상스 시대의 역사와 그림을 만든 장인의 삶이 궁금해졌었다. 이 책은 르네상스 시대의 이탈리아 장인들을 시대와 도시를 접목하여 소개하고 있다. 르네상스 미술의 발전과정과 발전이 이루어진 도시도 연관도 처음 알게 됐다. 책은 피렌체 --> 밀라노 --> 로마 --> 베네치아 순서로 소개하고 있다. 그렇게 소개한 이유는 르네상스의 발전이 위 도시의 순서로 이루어졌..

2018.08.06

위대하고 위험한 약 이야기

위대하고 위험한 약 이야기국내도서저자 : 정진호출판 : 푸른숲 2017.07.31상세보기 저자는 서울대 약학 대학에서 독성학을 전문분야로 하는 교수님이다. 모든 사람은 병이 찾아오고 그때 마다 약을 먹게 되는데 어떤 약을 어떻게 먹어야 하는지 궁금하여 읽게 된 책이다. 약을 정확히 쓰지 않으면 독이 되고, 약을 포함한 독성물질에 대한 이해 없이 사용하게 되면 생명의 위험이 따른다. 이런 위험성에 대한 경각심을 일깨워 준 책이다. 반면 약이 개발되어서 인류 역사 상 위대한 발전을 이룬 사건이 되기도 한다. [대표적인 약의 위험성] 예 - 탈리도마이드. 가습기 살균제 사건. 가습기 살균제 사건은 국내를 뜨겁게 달군 이슈 중 하나다. 아이의 건강을 위해 가습기 살균제를 사용했던 사람들은 오히려 아이의 생명을 ..

2018.06.25

주경철의 유럽인 이야기1

주경철의 유럽인 이야기 1국내도서저자 : 주경철출판 : 휴머니스트 2017.04.17상세보기 요즘 읽고 싶은 책을 골라보라고 했을 때, 역사책을 선택하는 횟수가 늘었다. 과거의 일들을 토대로 현재의 지혜를 얻을 수 있다는 생각 때문이다. 그럼 현재를 판단하는 지혜의 근거가 과거에 있다는 이유를 들라고 한다면 2가지를 들고 싶다. 사람들이 살아가면서 반복적으로 일어나는 사건과 현재의 모습이 있게 한 배경이 과거 역사에 있다는 점이다. 역사의 평가는 과거 사건의 분석으로 이루어지는데 사건을 일으키고 당하는 주체가 사람이라 했을 때, 과거 사람을 살펴보는 것이 흥미로울 수 밖에 없다. 이 책은 15~16세기 중세의 중요 유럽인을 다루고 있다. 워낙 유명해서 일대기를 알고 있던 사람도 있고, 이름만 알고 자세한..

2018.05.17

[python] list

알고 있는 내용을 정리하는 수준으로 블로그에 글을 적으려고 한다. python 문법에 대한 2번째 내용이다. 모든 언어에서 제일 많이 사용하는 데이터 구조인 list. python에서 유용한 것들 정리해 보자. 정의 방법# 빈 리스트 정의my_list = [] my_list = list() # 값과 함께 정의 (여러 데이터 타입들의 섞어서도 가능하다)my_list1 = [1,2,3] my_list2 = [“a”, “b”, “c”] my_list3 = [“a”, 1, “python”, 5] # list들의 list도 가능my_nested_list = [my_list1, my_list2] # list의 병합combo_list = my_list1 + mylist2 # [1, 2, 3, “a”, “b”, “c”..

Language/python 2018.03.28

[python] 상속 기본 및 factory method 패턴 정리

회사에서 python으로 코드를 작성하는 중에 비슷한 비즈니스를 처리하지만 타입에 따라 다르게 동작하는 기능을 넣어야 하는 필요가 생겼다. 비슷한 비즈니스 처리 중에 공통으로 쓰는 것도 있고 타입에 따라 약간 차이나는 것도 있다. 객체지향에 익숙한 사용자라면 상속을 통해 해당 기능을 처리해야 겠다고 바로 생각할 것이다. 그래서 python 문법 정리도 할 겸 상속에 대해 기본적으로 기술하고, 객체를 생성하는 과정에서 factory 패턴을 적용했는데 그 부분도 정리하고자 한다.상속 객체들 간의 관계를 구축하는 방법이다.상속의 핵심을 계층구조를 표현하는 것이다. python 상속의 문법 class 클래스명(상속할 클래스명)python에서는 class 정의 시에 괄호에 상속받을 부모클래스만 적으면 끝난다. 자..

Language/python 2018.03.27

Evaluation Rules

coursera의 Functional Programming Principles in Scala 강좌를 들으며 중요한 개념들만 블로그에 정리해 보고자 한다. call by value : 함수를 실행하기 전에 인자들의 값을 구한다. call by name : 함수를 먼저 실행하고 인자값이 필요할 때 값을 구한다. 다음과 같이 함수가 있다고 하자. 인자값을 달리해서 각 함수를 호출할 때 어떤 속도 차이가 있는지 보자. def square1(x:Int, y:Int) = x*x def square2(x: => Double, y:Int) = x*x square1(2,3) : 2*2 -> 4square2(2,3) : 2*2 -> 4동일한 단계가 필요하다. square1(3+4,8) : square1(7,8) -> 7..

Language/scala 2017.09.12
반응형