study 973

ansible playbook을 사용한 간단한 흐름 이해

개념 : https://kim-dragon.tistory.com/13 참고 블로그 : https://blog.naver.com/alice_k106/221333208746 guide : https://docs.ansible.com/ansible/latest/user_guide/index.html playbook guide 좋은 블로그 : https://moonstrike.github.io/ansible/2016/09/22/Ansible-Playbooks.html ansible playbook에 대해서만 튜토리얼 형식으로 간단하게 다시 정리합니다. 튜토리얼이나 블로그를 많이 봤는데 일단 한번 동작하는걸 확인하고 모르는게 있으면 구글링으로 확장해서 찾아나가는 저로써는 뭔가 이해하기가 쉽지가 않더군요. ansi..

data engineering 2021.01.13

개발자들이 개발쪽으로 가려고 하는 비전공자들에게 가지 말라고 하는 이유

출처 : 블라인드 출처는 블라인드인데 이미 여러곳에서 퍼간 글 같습니다. 원문 그대로 가져왔고 아무것도 모르는 비전공자나, 심지어 전공자들도 깨닫거나 얻어가는게 많을겁니다. 전반적으로 글 내용에 동감합니다. 아래와 비슷한 글. 둘다 읽는걸 추천함. : okky.kr/article/680617 * 위 글은 비전공자를 비방하는 글은 절대 아니며, 어떤 상황이든 예외적 요소가 있다는 것을 먼저 밝힌다. * 오히려 비전공자들에게 진심어린 조언을 해주고 싶으나, 항상 결과는 뜯어말리게 되는 나와 현직 개발자들의 모습을 보며 성찰하는 글이다. * 귀찮은 사람은 맨 아래에 세줄 요약 있음 1. 여긴 회사, 계열마다 복지, 대우, 연봉 테이블이 천차만별이다. - 하는 일은 풀스택이고 야근과 철야를 밥 먹듯이 하지만, ..

private/memo 2021.01.10

kafka consuming 기본 흐름제어 플로우

운영하는 시스템중에 카프카가 있는데 일부 데이터는 프로듀싱만 하고 다른곳에서는 컨슈밍만 한다. 현재 운영환경에서 하나의 토픽에 파티션이 9개로 나뉘어져있는데, 프로듀싱 시에는 파티션을 딱히 신경 쓰지 않아도 된다. 프로듀싱하면 알아서 나눠지기 때문이다. 근데 컨슈밍시에는 기본적으로 신경쓸게 더 많다. 중요한 데이터의 경우 토픽이 파티션으로 나뉘어져있으면 파티션별 어디까지 읽었는지에 대한 정보인 오프셋도 신경을 써야 한다. 일단 카프카에 데이터가 있는지는 아래의 카프카 콘솔로 컨슈밍해봐서 확인이 가능하다. ./kafka-console-consumer.sh --bootstrap-server 카프카서버:9092 --topic 토픽이름 --from-beginning 데이터 양이 적거나 중간에 데이터가 유실되어도..

data engineering 2020.12.28

why use namedtuple

namedtuple이란게 있다. from collections import namedtuple mynamedtuple = namedtuple("mynamedtuple", ["field1", "field2"]) print mynamedtuple('field1', 2222) 이런식으로 쓰는데 저걸보고 든 생각이.. 굳이 저 namedtuple을 쓰는것보다 딕셔너리나, 복잡해지면 클래스로 간단하게 정의하면 되지 않을까? 생각해서 관련 글을 찾아봤었는데 좋은 글을 찾아서 번역한다. https://stackoverflow.com/questions/9872255/when-and-why-should-i-use-a-namedtuple-instead-of-a-dictionary 의 첫번째 답에서 유용한 부분만 가져온다...

docker Error saving credentials: error storing credentials

Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `The user name or passphrase you entered is not correct.`` 도커 로그인시 위 에러가 자꾸 발생한다. 분명 맞는 아이디와 패스워드를 입력했는데도 틀렸다고 나온다. https://acet.pe.kr/m/790?category=446101 여기에 해법이 있는데 이대로 하니 잘 되어서 이걸 가져왔다.나중에 또 발생할것같아서 참고용으로 저장해 둠. 1. rm /usr/local/bin/docker-credential-osxkeycha..

해외 스톡옵션 행사 가이드

0. '재직증명서'와 '외국인 투자기업등록증명서' 두개 서류를 뽑아놓는다. 1. 본인 회사의 플랫폼에서 스톡 옵션을 행사한다. 마지막에 어느정도를 행사할건지, 금액은 얼마인지, 은행은 어디 은행으로 보낼지 등이 나오는데 이걸 뽑을수 있으므로 뽑아서 서류를 준비해놓는다. (엑서사이즈 서류라고 임시로 부름. 아마 다른 회사도 동일할듯) 2. 은행가서 신분증과 재직증명서, 외국인 투자기업등록증명서, 엑서사이즈 서류 4개를 내고 기다린다. 이것저것 다 적고 사인하고 엑서사이즈 서류에 은행명, 주소, Swift, Account, ABA 등이 있는데 보낸후 맞게 입력했는지 꼼꼼히 확인하자. 초보 은행원같은경우 투자증권명이 뭐냐고 물어볼 때가 있는데 스톡 구입이라고 말해주자. 3. (선택)송금후 받은 영수증을 회사 ..

private/memo 2020.11.18

aws boto3 set ebs tag in auto scaling group ec2

현재 autoscaling group(asg)으로 많은 인스턴스를 만들어 쓰고 있다. 근데 aws를 써보면 알겠지만 asg를 만들때 tag를 설정할수 있는데, 이 설정해놓은 태그가 asg내부의 ec2들에는 동일하게 설정이 된다. 그런데 각각의 ec2가 ebs를 가지고 있는데, 이 ebs 들에는 asg에서 설정한 태그가 붙질 않는다.(aws버그인듯.. 당연히 같이 붙어야하는거 아닌가) aws자원 관리를 위해서 기본적으로 설정해야하는 tag들이 있는데, ebs들은 자동적으로 아무 태그도 들어가지 않으면서 null로 들어감으로써 ebs자원 관리가 되질 않는다는 요청이 왔다.ec2들이 자주 생성되고 삭제되고 하는 구조여서 한번만 수동으로 tag를 설정할게 아니라 매번 자동으로 태그를 설정해줄 스크립트를 짤 필요..

data engineering 2020.11.11

airflow 삽질

몇일전에 spark etl을 제작했고, 이걸 배치잡으로 돌린다는 글을 적었었다. link도커로 하는건 아직 뭐가 문제인지 이유를 못찾았고, 이유를 못찾았다는 이유로 그냥 크론탭에서 계속 돌아가도록 놔둘수 없기에 생각해보다가 airflow에서 돌리기로했다. 처음엔 rancher에서 kubernetes airflow app을 만들어서 거기다가 내 전용으로 따로 올려볼까 하다가 idc에서 돌아가는 airflow서버가 하나 있어서 거기에 올리기로 했다. kubenetes airflow로 올리려다가 만 이유는 dag파일을 커스터마이징하기가 힘들기 때문이다.bitnami의 airflow가 계속 최신에도 업그레이드되고 있어서 이걸 쓰려고 했는데 (bitnami airflow) dag 추가하는부분을 찾아보면 3가지 방..

data engineering 2020.10.20

hadoop echo system의 기반지식 hadoop, zookeeper, yarn등 정리

하둡 에코 시스템을 회사에 들어와서 처음 사용해보는데, 회사에서는 당연히 실질적으로 필요한 지식인 스파크, 카프카 이런것들만 어떻게 설치해서 사용해왔다. 근데 이제 어느정도 여유가 생기니까 기반 지식들이 부족하다 보니 공부해야 할 필요성을 느꼈다.왜 스파크는 하둡 위에서 돌아가는지, 왜 카프카는 주키퍼라는게 필요한지. yarn은 또 뭔지. 마치 c언어로 어떻게 프로그래밍을 하는데 내부에 포인터가 어떻게 어떻게 주소를 참조하는지 등 하나도 모르고 그냥 되니까 코딩하는 느낌이라.. 기반 지식에 대해 공부를 좀 더 하기 위해서 글들을 찾아보고 정리한다. 0. hadoop이란 무엇인가. https://dongvelopment.tistory.com/47, https://rachelsdotcom.tistory.co..

data engineering 2020.10.11

make simple spark docker image

이전 글에서 spark관련 etl을 만들었다. 하루마다 돌려야 하는 배치잡인데 내가 스파크를 설치한 서버에서 크론탭을 걸어서 돌리면 나한테는 가장 편하겠지만 이러면서버에 너무 종속적이다. 스파크가 설치된 idc서버가 교체가 일어난다던지, 하면 스파크를 다시 새로 깔고 jar들을 다운받고 세팅을 다시 처음부터 끝까지 다시 해야 한다. 어쨌든 요즘은 쿠버네티스로 자원 컨트롤링을 하고 도커 쓰는건 대부분 기본인 시대이기에 도커 이미지로 만들어보기로 했다. 처음에 이미 만들어진 도커 이미지를 사용할까 생각했는데 ex) https://hub.docker.com/r/bitnami/spark/ 저번에도 적었지만 스파크 3버전에 하둡 3.2버전을 동시에 충족하는 이미 만들어진 스파크 도커 이미지가 없는것같아서 그냥 처..

data engineering 2020.10.09

spark mongo data processing, write csv to s3 삽질 정리.

https://qkqhxla1.tistory.com/1006 의 mongo부분의 글을 재정리함과 동시에 겪었던 모든 문제들을 적으려고 한다. 하려는 작업의 도식도는 위의 그림과 같다. 몽고디비에서 데이터를 가져와서 스파크에서 전처리를 한다. 그후 전처리된 데이터를 csv형태로 S3에 저장한다. (S3에 저장된 데이터는 하이브 테이블로 만들 예정인데 그건 다른 글에 많이 써놔서 제외한다.) 공용으로 쓰는 spark서버 말고 새로 구축해서 우리꺼 전용으로 사용하려고 내가 구축한 kubernetes rancher서버에 bitnami spark로 아무 버전이나 설치했었는데 이러면 안되었다. 삽질하면서 얻은 중요한 결론을 먼저 적자면 spark는 spark버전과 hadoop버전, 거기에 관련된 jar버전까지 전부..

data engineering 2020.09.21

leetcode 787(다익스트라), 241(dp, 분할정복)

787 https://leetcode.com/problems/cheapest-flights-within-k-stops/ 아주 오랫만에 보는 다익스트라 문제다. 기존에 풀던 다익스트라와 차이를 적자면, K번 stop이라는 횟수제한이 있어서 이 제한조건을 충족시켜야 한다. from collections import deque class Solution(object): def findCheapestPrice(self, n, flights, src, dst, K): adj = [[] for i in xrange(n)] for s,e,w in flights: adj[s].append([e, w]) dist = [float('inf') for i in xrange(n+1)] dist[src] = 0 q = dequ..

leetcode 120(dp), 226(트리), 785(이분 그래프, bipartite), 703(heap)

120 https://leetcode.com/problems/triangle/ 위에서부터 내려오면서 최소 값들을 triangle리스트에 업데이트해준다. 그리고 맨 마지막까지 끝났을때 거기서 최소값을 리턴한다. class Solution(object): def minimumTotal(self, triangle): if not triangle: return for i in xrange(1, len(triangle)): for j in xrange(len(triangle[i])): if j == 0: triangle[i][j] += triangle[i-1][j] elif j == len(triangle[i])-1: triangle[i][j] += triangle[i-1][j-1] else: triangle[i..

leetcode 416(backtracking), 658(이분 탐색), 205(구현), 290(구현)

https://leetcode.com/problems/partition-equal-subset-sum/ 문제를 못풀었다. discussion에서 답들을 읽어보다 이 백트래킹 답이 가장 이해하기 쉬워서 이걸 공유한다.https://leetcode.com/problems/partition-equal-subset-sum/discuss/90610/Python-Backtracking-with-Memoization-Solution 답을 봐도 좀 빡세서 이해하는데 한참걸렸다. class Solution(object): def canFindSum(self, nums, target, ind, n, d): # 남은 nums배열, target, index, 끝길이, d=캐시 if target in d: return d[ta..

mongodb set ttl

https://docs.mongodb.com/manual/tutorial/expire-data/ 특정 시간 이후에 데이터를 자동으로 삭제하고 싶을 경우 ttl을 활용한다. mongodb에는 ttl인덱스가 있다.db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } ) When adding documents to the log_events collection, set the createdAt field to the current time:copycopieddb.log_events.insert( { "createdAt": new Date(), "logEvent": 2, "logMessage": "Success!" } )일부 자료..

data engineering 2020.08.15

kubernetes rancher add helm chart catalogs

이전에 적었듯이 kubernetes cli는 배우는데 러닝 커브가 높아서 gui로 kubernetes를 컨트롤 해주는 rancher라는걸 쓰고 있다.(하드하게 쓰는게 아니라 그런지 쓸만하다.)현재 쓰고있는 몇개 앱만 캡쳐 떠왔다. 카프카, 젠킨스 등 이것저것 잘 쓰고 있는데.. 이번에는 스파크를 설치해야 할 일이 생겼다. Apps탭이니 당연히 여기도 스파크가 있을줄 알고 Launch버튼을 눌러 스파크를 찾아봤다. 찾아봤는데 이 4개밖에 안뜬다. 맨 처음 Helm-incubator의 스파크는 deprecated되었다고 하고 선택지가 두번째 Helm spark밖에 없었다. 근데 가장 최신 버전을 설치했는데 스파크 버전이 1.5이다..... helm chart를 들어가봤더니 업데이트가 안된지 상당히 오래되었다..

data engineering 2020.08.03

leetcode 653(2SUM4), 946(stack), 729(이진 탐색), 722(정규식 regex)

653 https://leetcode.com/problems/two-sum-iv-input-is-a-bst/ https://qkqhxla1.tistory.com/1055 여기서 1번, 167번의 2 sum을 풀었었는데 이번엔 단순히 트리에서 검색하는거다. 검색부만 트리로 변경한다. from collections import deque class Solution(object): def findTarget(self, root, target): queue = deque([root]) d = set() while queue: node = queue.popleft() if target - node.val in d: return True d.add(node.val) if node.left: queue.append(..

leetcode 399(bfs, evalute-division), 406(구현), 304(prefix sum, dp), 303(prefix sum)

399 https://leetcode.com/problems/evaluate-division/ 처음에 이게 bfs dfs탐색으로 풀수있는문제인지 아예 감을 못잡았다. discussion중에https://leetcode.com/problems/evaluate-division/discuss/88275/Python-fast-BFS-solution-with-detailed-explantion 가 가장 유용했다. 요약하면 a/b가 2.0이면 a에서 b로 가는데 가중치가 2.0이라고 그래프형태로 저장해놓을수 있다. b/a는 0.5로 거꾸로도 저장해놓고 이런식으로 갈수있는 모든 경우의 수를 저장해놓는다. 그후에 갈수있는 이웃들을 전부 탐색하면서 해당 이웃으로 갈수 있으면 현재 값에 이웃으로 갈수 있는 가중치를 곱해주..

leetcode 437(트리, prefix sum), 113(트리), 82(linked list), 83(linked list)

437 https://leetcode.com/problems/path-sum-iii/ 1. 노드가 많아봐야 1000개라고 문제에 써있었으니 다른 방법이 기억 안날땐 O(n^2)으로 풀어도 된다.(제출 안하는것보다는 나으니.) from collections import deque class Solution(object): def pathSum(self, root, sum): if not root: return 0 nodelist = deque([root]) # nodelist에는 모든 노드들을 저장해놓는다. q = deque([root]) while q: p = q.popleft() if p.left: nodelist.append(p.left) q.append(p.left) if p.right: nodel..

leetcode 116(트리), 117(트리, 레벨 오더), 119(트리), 203(linked list), 849(구현)

116 https://leetcode.com/problems/populating-next-right-pointers-in-each-node/ 왼쪽에 있는 노드들의 next를 전부 오른쪽을 보게끔 하는 문제이다. 현재노드의 왼쪽자식.next = 현재노드의 오른쪽 자식. 그다음 루프를 돌때부모쪽에서 현재 노드의 next를 만들어줬었으면 그 정보를 토대로 만들어준다. 그림을 보면서 짜면 더 편하다. class Solution(object): def connect(self, root): if not root: return None cur = root _next = root.left while _next: cur.left.next = cur.right if cur.next: cur.right.next = cur...

Vault.

Vault관련 참고 가장 좋았던 블로그 : https://lejewk.github.io/vault-get-started/ Vault란 토큰, 비밀번호, 인증서 ,암호화 키와 같은 비밀 정보나 민감한 데이터를 UI, CLI, HTTP API 를 활용할때 안전하게 저장하고 제어할수 있게 해주는 오픈 소스 입니다. https://learn.hashicorp.com/vault/getting-started/apis https://www.vaultproject.io/api-docs/index 뭔가 더 적고 싶은데 위의 링크나 공식 튜토리얼에 전부 다 설명되어있어서(사용사례까지) 억지로 더 적지 않고 끝냄.

data engineering 2020.07.16

kafka set credentials

https://developer.ibm.com/technologies/messaging/tutorials/kafka-authn-authz/ 를 보고 정리.. 잘 작동한다. broker side. 1. jass파일을 만든다. KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin" user_alice="alice" user_bob="bob" user_charlie="charlie"; }; 이처럼 만들면 사용자가 사용할수 있는 alice, bob, charlie가 추가된다. jass.conf라고 이름짓고 ~/kafka/config안에 저장해놓는다. username=..

data engineering 2020.07.13

leetcode 1081,316(구현), 1130(트리), 150(후위 표기법 계산), 419(구현, ship)

1081 https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/ 문제를 이해하는데 시간이 좀 걸렸다. 문제를 쉽게 풀어쓰자면 중간에 중복된 단어를 지워서 결과값으로 단어가 1개씩만 나오도록 만드는데 결과값이 사전 순서상으로 가장 낮은 값이 나와야 한다. cdadabcc의 답이 abcd가 아니라 adbc가 나온 이유는 cdadabcc에서 a다음에 b가 먼저 오게 되면 b이후에는 cc밖에 없기때문에 d를 출력할수 없기 때문이다. 난 기본적으로 요 링크의 방법으로 풀었다. class Solution(object): def smallestSubsequence(self, text): order_dict = {} for i, t in e..

leetcode 300(lis, dp), 334(구현), 646(lis, dp)

300 https://leetcode.com/problems/longest-increasing-subsequence/ lis문제이다. 예전에 백준에서 많이 풀었었다. 오랫만이니 리마인드해보자. https://qkqhxla1.tistory.com/763 from bisect import bisect_left class Solution(object): def lengthOfLIS(self, nums): if not nums: return 0 dp_len = max(nums)+1 if max(nums) > 0 else len(nums)+1 def lis(line): dp = [0 for i in xrange(dp_len)] size = 0 for i in xrange(len(line)): h = bisect_..

jq, awk

쉘에서 입력값을 받아서 가공해서 쓸때 조금서 세세하게, 정교하게 가공하기 위해서 아래의 jq나 awk를 많이 쓴다. 프로그래밍으로 다 받아서 처리해도 되지만(awk도 프로그래밍이지만 어떤 작업을 처리하기 위해 소스파일을 따로 만들어서 처리하는 경우를 말함.) 그러면 너무 닭잡는데 소잡는 칼을 쓰는것 같고.. 하는 느낌이 들어서 쉘의 한줄 명령어를 쓸때 소금처럼 간단하게 많이 쓰는데 아래 블로그에 튜토리얼식으로 글 설명이 꽤 잘되어있다. 글을 저장해놓고 한번씩 참조할때 다시 한번 보면 좋을것같다. jqhttps://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax awkhttps://recipes4dev.tistory.com/171

leetcode 1114(구현, 쓰레드), 417(dfs parcific atlantic water flow), 179(구현), 19(linked list)

1114 https://leetcode.com/problems/print-in-order/ 쓰레드 환경에서의 lock관련된 실행 순서를 구현하는 문제이다. 반드시 first, second, third순으로 실행되게 하려면 lock으로 잠궜다 풀었다를 잘 해야 한다. lock.acquire()을 했을 경우 lock.release()를 호출해서 그 락을 풀어주기 전까지는 재차 lock.acquire()을 호출할수 없는점을 이용한다. first에는 아무런 제한 없이 출력하고 풀어준다. second에는 first에서의 락을 acquire()함으로써 first에서 release()가 호출될때까지 기다려야함으로써 first -> second호출순서가 유지된다. third도 마찬가지이다. from threading ..