하둡에 인증을 넣어 관리할때 커버로스 인증을 사용해서 권한 관리를 할때는 hadoop 명령어를 이용해서 접근할 경우 다음과 같이 오류가 발생된다. 그래서 하둡명령을 날리기전에 kinit 명령을 실행해서 인증을 거친이후 하둡명령을 실행해야 사용이 가능하다. $ hadoop fs -ls ls: failure to login: using ticket cache file: FILE:/tmp/krb5cc_p13321 javax.security.auth.login.LoginException: java.lang.IllegalArgumentException: Illegal principal name foo@BAR.COM: org.apache.hadoop.security.authentication.util.Kerbero..
Flink 에서 Window 단위로 데이터를 다루려면 워터마크를 지정해야하고, 워터마크를 지정하기위해서 TO_TIMESTAMP_LTZ 함수를 써서 날짜타입으로 전환해서 사용해야 하는 경우가 종종 있다. 보통 EpochTime 이 들어있는 필드를 쓴다면 아래와 같은 형태로 워터마크를 선언하려고 할것이다. CREATE TABLE source_table { ... rowtime AS TO_TIMESTAMP_LTZ(logTime, 6), // logTime 의 단위는 microsec WATERMARK FOR rowtime AS rowtime } WITH { ... }; 그리고, 원본의 logTime 필드의 값이 microsec 이라서 정밀도값을 6으로 지정하면 다음과 같은 오류가 발생한다. org.apache...
데이터를 다루기 위해서는 다양한 데이터 변환과 조작작업을 주기적으로 수행해야 한다. 이런 행위를 단단히 줄여서 ETL (Extract, Transform, Load) 작업이라고 하는데, 이런 작업을 구성하고 스케쥴 하는 방법에 대해서는 몇년전엔 여러 플랫폼들이 혼재되어있었지만 지금은 AIRFLOW 가 결국 살아 남은거 같다. 과거에는 춘추전국 시대 사실 ETL 을 전문적으로 다루지 않는 부서에서는 Jenkins(젠킨스) 와 Spring Batch(스트림배치) 를 섞어서 주기적인 배치작업을 돌리는 경우도 많다. (Jenkins 는 빌드관리를 위한 용도인데, 희안하게 주위에 배치 스케쥴러로 쓰는 케이스를 꽤 많이 봤다) crontab 을 쓰는것 대비 WEB UI 에서 진행상태나 로그를 확인 할 수 있기 때문..
Flink 에서는 Savepoint 와 Checkpoint 라는 개념이 있는데, 복구를 할때 사용할 메타정보들을 활용한다. 이 정보는 "state.checkpoint.dir" 이나 "state.savepoints.dir" 를 설정한 디렉토리의 하위에 _metadata 라는 파일로 존재한다. 이 파일을 확인해 보고 싶은경우가 있는데 다음과 같이 코드를 만들면 확인할 수 있다. _metadata 파일 확인하기 (java) 소스코드를 확인하면 복호화 하는 메소드를 금방 찾을 수 있는데, 문제는 파일로 저장할때는 이 byte[] 앞에 "매직넘버"와 "버전정보"가 추가로 저장되기 때문에, 해당 값을 읽어야 그 이후 데이터를 정상 처리할 수 있다는 점만 주의하면 된다. import org.apache.flink.r..
시간 관련된 필드를 다룰때 글로벌을 고려하면 복잡할게 많아진다. 동일한 이벤트 발생 시점이라도 어떤 타임존에 있느냐에 따라서 시간을 표시하는게 달라지기 때문이다. 이런걸 고려하기 위해서 요즘은 절대적인 날짜값을 저장하고, 타임존 정보를 이용해서 시간을 다루는 필드들도 생겨나기 시작했다. 물론, Flink 에도 타임존을 고려한 날짜 필드가 존재한다. 그게 TIMESTAMP_LTZ 타입이다. 이 타입은 다음과 같이 Flink 에서 타임존 값에 영향을 받는다. SET 'table.local-time-zone' = 'Asia/Shanghai'; 타임존에 맞춰서 조회하려면? TIMESTAMP_LTZ 필드는 타임존 세팅값에 따라서 값을 계산해서 출력해준다. 쉽게 생각해서 내부적으로는 UTC 와 같은 절대기준(?)의..
보통 Unique Count 를 구하기위해서 다음과 같은 쿼리를 많이 사용한다. 유니크 카운트가 필요한 대표적인 사례가 방문한 사람이 몇명인지 카운팅하는 User Count 를 구할때이다. 단순한 count 가 아니라, 중복 방문을 제거후 카운팅을 해야하다보니 비용이 비싼 쿼리이다. SELECT count(distinct user_id) FROM logs WHERE ymd = '2022-01-02'; 1개의 리듀서로 처리된다? count(distinct ...) 형태로 쿼리를 날리면, "mapred.reduce.tasks=100" 같이 리듀서 갯수를 강제로 키워도 1개의 리듀서로 처리된다. 즉, 병렬처리가 안되기 때문에 매우 큰 데이터에서 이런 쿼리를 돌리게 되면?? 결과 보기가 하늘의 별따기가 된다. ..
Hive 에서 쿼리를 돌리다보면, 특정 리듀서 하나에서 작업이 안끝나고 무한정 대기하는 경우가 종종있다. 이런 경우 skewed 형태의 데이터구조일 확률이 높다. skewed 라는건 데이터가 균일하지 않고, 특정 key 에 데이터가 쏠려있음을 의미한다. 특정 리듀서에 데이터가 쏠려있어서 병목이 되는 현상이다. (이미지에서 1개의 task 만 끝나지 않는 상황인걸 보면 쉽게 이해 할수 있다) Skewed 데이터 문제 이런 데이터 쏠림현상은 생각보다 흔하다. 우리나라 성씨만 봐도 "김씨" 가 압도적으로 많다. 아마 ㄱㄴㄷ 형태로 담당자를 정하면 ㄱ을 담당한 사람은 숫자 카운팅할때 엄~~청 오래걸릴수 밖에 없을것이다. 이런 문제를 해결하려면 데이터 쏠림이 심한 테이터를 분산처리할 수 있도록 유도해주어야 한다...
구글시트에는 웹의 데이터를 추출해서 시트의 값으로 활용할 수 있는 좋은 기능이 있다. importXML 과 importHTML 이 대표적이다. 하지만, RESTAPI 형태로 제공되는 데이터의 경우 일반적으로 json 데이터를 사용한다. 그런데 기본적으로 importJSON 이라는 펑션이 제공되지 않는다. 하지만, 확장기능을 통해 설치하고 쉽게 데이터를 시트에 표현할 수 있다. importJSON 설치하기 google script 에 함수를 복붙해서 추가하는 방법으로 가이드된 내용도 많이 있지만, 확장프로그램에서 쉽게 설치하는 방법이 있어서 그 방법을 가이드 하고자 한다. 아마 이미지만 대충 봐도 설치와 활성화는 매우 쉽게 할 수있을것으로 보인다. 1 . 마켓에서 importJSON 설치하기 구글시트의..