나누고 싶은 개발 이야기

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

전체 글 103

[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류

최근에 yyyyMMddHHmmssSSS String 포멧으로 구성된 날짜형식을 LocalDateTime으로 바꾸는게 필요했다. 그런데 아래와 같이 LocalDateTime.parse 함수로 변환을 시도했는데 오류가 났다. LocalDateTime converted = LocalDateTime.parse(field, DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); 처음 들었던 생각은 pattern에 들어가는 값을 잘못 알고 있었나 의심했다. 그래서 DateTimeFormatter에 기술된 pattern 내용을 찾아보았다. 대문자 S 값이 아래와 같이 밀리세컨드를 의미함을 확인하였다. Symbol Meaning Presentation Examples S fracti..

Language/Java 2019.07.11

Kinesis Stream vs Kafka

최근에 Cloud service를 활발하게 사용하는 곳이 많아졌다. Big Data 영역에서도 기존 On-Premise에서 Cloud 환경으로 대체되는 경우가 많아지고 있다. 그래서 On-Premise에서 쓰던 Application들이 Cloud 환경에서 무엇으로 대체되는지 검토를 해볼 필요가 있었다. Kafka를 사용하는 입장에서 Cloud의 1위 업체인 Amazon에서는 어떤 대체 서비스가 있는지 찾는게 첫번째 검토사항이었다. Kafka에 대한 설명에 대해서는 필자의 Kafka 내용을 추가하는 것으로 대체하도록 하고, 이 글에서는 Kafka와 비교가 가능한 Amazon Kinesis Stream을 설명하고자 한다. Kinesis Data Stream이란 무엇인가? Amazon 사이트의 설명을 참조하면..

Cloud 2019.06.25

[Spark] Accumulators

Spark 으로 ETL 작업을 처리하다가 처리한 데이터의 누적 양을 집계하고 싶었다. 예를 들면, Kafka의 데이터를 활용해 spark streamming 작업을 할 때, 각 단계(spark streaming은 짧은 간격의 배치)마다 처리된 데이터 건수를 집계한다고 하자. spark은 분산으로 데이터를 처리하기 때문에 각 executor의 처리된 결과를 조합한 공유 변수가 필요하다. executor가 처리한 데이터를 하나의 공유변수로 값을 기록하는 것이다. 이 때 공유변수는 결합 및 가환 연산을 지원해야 한다. '가환'이라는 단어가 어색한데 사전으로 찾아본 결과 '조작이나 연산의 순서를 바꾸어도 그 결과가 변하지 않는 일' 이다. 다시 간단히 정리하면 공유변수를 통한 연산의 순서, 연산의 조합의 결과가..

Big Data/Spark 2019.05.03

[Scala] with 키워드 정리

기존 scala로 된 프로젝트를 파악하던 중 다음과 같은 코드를 보고 with 키워드가 헷갈리기 시작했다. val mapper = new ObjectMapper() with ScalaObjectMapper 그래서 필자와 같이 scala와 친숙해 지려고 노력하는 분들을 위해 짧게 with 키워드를 짧게 정리해 보고자 한다. scala 책을 살펴보면 with 키워드가 처음 나오는 부분은 trait가 아닐까 싶다. trait는 캡슐화된 메소드와 필드 정의를 재사용하는데 사용된다. 클래스 상속도 재사용이 가능하지만 하나의 부모 클래스만 가져야 한다는 부분이 다르다. trait는 믹스인을 통해 여러개의 trait를 조합할 수 있다. 믹스인을 할 때 사용하는 키워드가 with이다. 그럼 실제 사례를 들어보자. 먼저..

Language/scala 2019.04.26

[Kafka] Configurable SASL callback handler

최근에 Kafka 인증 기술에 대해서 하나씩 공부를 하고 있다. 가장 기본이 되는 SASL/PLAIN에 대해서 이전 블로그 글을 통해 소개한 바 있다. 이번 글은 Kafka 2.0 버전에 추가된 SASL callback 기능을 알아보고자 한다. SASL callback이 인증과 관련하여 중요하다고 생각되는 것은 SASL/PLAIN에서 접근을 허용하는 사용자 정보의 관리에 장점이 있어서이다. SASL/PLAIN에서 소개했듯이 Broker의 jaas 파일에 사용자 정보를 관리하게 되면 Kafka 운영에 불편한 점이 많다. 이번에 소개할 SASL callback 기능을 사용하면 인증 로직을 custom하게 추가할 수 있어 Kafka Cluster 운영 상황에 맞는 인증 서비스를 할 수 있다. KIP-86에 S..

Big Data/Kafka 2019.04.18

[Kafka] 파티션 이동

예전 블로그 글 - [Kafka] Topic의 Replica 분배 로직 분석을 통해 Kafka는 Topic을 만들 때 각 Broker에 Partition을 균일하게 분배한다고 설명한 적이 있다. 하지만 Kafka를 운영하면 각 Topic 별로 쌓이는 데이터 용량이 다르기 때문에 Broker별 디스트 사용량이 차이가 나게 된다. 필자도 회사 업무 중에 디스크 불균형이 발생하여 일부 Topic의 Partition을 디스크가 남은 Broker로 이동하는 작업을 진행하였다. 먼저 어떤 Topic들을 대상으로 이동하면 좋을지 선택해야 했다. 모니터링 metric을 수집하기 때문에, 수집된 metric으로 판단을 해도 좋다. 에를들면, kafka.server:type=BrokerTopicMetrics,name=By..

Big Data/Kafka 2019.04.12

[Kafka] 인증 - SASL/PLAIN

최근 Kafka 인증에 대해서 살펴보고 있는데, 인증에서 가장 기본이 되는 SASL/PLAIN에 대해서 정리해 보고자 한다. 블로그의 내용은 Kafka Document의 내용을 토대로 직접 실습해보고 정리한 내용이다. SASL/PLAIN 인증 방식은 가장 먼저 머리속에 떠오르는 id/password를 통한 인증이다. id/password로 인증을 할 때는, SSL 통신을 해야 plain text가 노출되지 않는다. Kafka에서는 SASL_SSL, SASL_PLAIN 2가지 타입이 있으며, Live 환경에서는 SASL_SSL으로 설정해서 SSL 통신을 하도록 추천하고 있다. SASL/PLAIN 인증을 하기 위해서는 인증정보를 포함한 conf 파일을 Broker, Client에 각각 만들어 줘야 한다. 먼..

Big Data/Kafka 2019.03.26

[Spring] Hadoop hdfs 파일 업로드

회사에서 서비스를 만들다가 Restful API를 통해 파일을 업로드 받고 HDFS에 저장하는 기능이 필요했다. API 서버는 Spring으로 구현되어 있었기에 Spring에서 Hadoop 관련 repository도 찾아보고 JavaConfig 설정도 해보았는데 이번 포스트에서 간단히 정리해 보고자 한다. 내용은 아래의 순서로 진행하고자 한다. 1. Spring Apache Hadoop 라이브러리 찾기. 2. Hadoop 관련 JavaConfig 추가. 3. Hadoop NameNode HA 구성 맛보기. 4. HDFS에 파일 업로드. 1. Spring apache hadoop 라이브러리 찾기. Spring Data 프로젝트 하위에 Spring for Apache Hadoop이 포함되어 있다. 라이브러리..

Big Data/Hadoop 2019.03.06

Keepalive 정리

TCP Keep alive 3-way handshake를 통해 연결된 세션을 없애지 않고 계속 사용하는 방식. [그림 1] TCP Keepalive 환경에서의 패킷 흐름. [그림 1]과 같이 TCP Keepalive는 일정 시간이 지나면 연결된 세션이 살아있는지 확인하기 위해 아주 작은 양의 패킷을 하나 보낸다. 패킷은 연결을 유지하기 원하는 쪽에서 보낸다. 패킷을 주고 받은 다음에 타이머는 원점으로 돌아가고 카운트를 진행한다. ss 명령으로 간단히 Keepalive를 확인할 수 있다. -o 옵션을 주면 timer의 정보도 볼 수 있다. ss -otn -o : Show timer information. -t : Display only TCP sockets. -n : Do now try to resolve..

Linux 2019.02.13

[Java9] CompletableFuture 지연 & 시간초과 개선

앞으로 Java 8 이후의 버전들의 추가된 기능들을 공부하면서 정리를 해볼 생각이다. 간단한 내용이라도 블로그에 정리를 하게 되면 머리 속에 남는 내용이 많고, 나중에 버전별로 찾아보기 쉬울 것 같아서다. Java 9에 추가된 기능부터 보게 될 텐데 다음 블로그에 Java 9 의 추가사항을 잘 정리해 주어서 그 내용을 바탕으로 하나씩 세부 내용을 정리해 보고자 한다. 순서대로 하지는 않을 것이고 궁금해서 보게 된 순으로 정리를 하게 될 것 같다. 예전 블로그 글을 통해서 비동기 처리를 위한 CompletableFuture를 소개한 적이 있다. Java 9 에서는 CompletableFuture의 기능을 보완한 부분이 있다. 가장 주요한 변화는 실행 시간의 지연과 타임아웃을 넣을 수 있는 부분이다. 먼저 ..

Language/Java 2019.01.28

[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
반응형