일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 주키퍼
- 자바
- codewars
- golang
- 알고리즘
- 스칼라
- programmers
- HBase
- docker
- 코드워
- DP
- scala
- 프로그래머스
- boj
- 리눅스
- go
- 튜토리얼
- dynamic programming
- Go언어
- 문제풀이
- OOM
- leetcode
- zookeeper
- redis
- 파이썬
- gradle
- Java
- 동적프로그래밍
- Linux
- Python
- Today
- Total
목록분류 전체보기 (111)
파이문
ExecutorService 를 사용하여 멀티 쓰레드로 컨슈머를 개발하였다. 컨슈머는 RPS 를 지켜야 하는 룰이 있어서, Apache 의 TimedSemaphore 를 사용하였다. 멀티 쓰레드로 돌리는 작업이 완료가 되면 프로세스가 종료 되게끔 만들었으나 종료 되지 않았다. shutdown 을 하였는데 왜 종료가 되지 않는 것인지 엄청 삽질을 했다. 사실 ExecutorService 의 shutdown 메서드 자체가 반드시 쓰레드를 종료 시킨다는 보장은 없다. (ExecutorService shutdown not working 이 구글 서제스트로 있을 정도이다.) 그래서 처음엔 개발을 잘못해서, 쓰레드로 만든 코드에 버그가 있어서 shutdown 으로 종료가 보장이 안되어 shutdownNow 를 호출..
자바로 Producer-Consumer 개발을 진행하고 있었다. Producer 에서 더 이상 Queue 에 집어 넣을 데이터가 없는 경우 POISON 이라고 명명한 임의의 객체를 Queue 에 넣게 하였고, Consumer 에서 Queue 에서 꺼낸 데이터가 POISON 일 경우 종료 되게 만들었다. (Producer-Consumer 의 run 은 while loop 로 돌아가고 있었다.) single producer, single consumer 일 때는 잘 동작하였다. 그러나 producer 개수가 consumer 보다 적은 경우는 예상대로 종료 되지 않았다. 당연하겠지만 producer 개수 만큼 queue 에 POISON 이 들어갔기 때문에, 나머지 consumer 들은 해당 (producer)..
HBase 를 대상으로 MR 어플리케이션을 개발할 때 TableMapper / TableReducer 를 사용할 때가 있다. 이 때 TableReducer 를 사용해서 데이터를 써야 하는데, 데이터를 각각 다른 테이블에 저장해야 했다. TableMapReduceUtil 를 사용하면 하나의 테이블에 쓰는 것 밖에 안된다. 그래서 서로 다른 테이블에 데이터를 넣으려면 (TableReducer 를 상속받은) Reducer에서 아래 처럼 해 주고 Put put1 = createPut(...); context.write(new ImmutableBytesWritable(Bytes.toBytes("table1")), put1); Put put2 = createPut(...); context.write(new Immu..
맥북에서 셸 업그레이드 후 zsh 가 안되는 문제 bash, zsh 를 업그레이드 하고 zshrc 를 사용하려고 아래 처럼 명령어를 쳤었다. $ source ~/.zshrc 그런데 아래 처럼 에러가 났음 -bash: autoload: command not found -bash: /path/to/.oh-my-zsh/oh-my-zsh.sh: line 34: syntax error near unexpected token `(' -bash: /path/to/.oh-my-zsh/oh-my-zsh.sh: line 34: `for config_file ($ZSH/lib/*.zsh); do' 알고보니 셸을 업그레이드 하는 와 중에 bash 로 기본 셸을 변경했었던 것이다 (바보!) 다시 원복하는 과정을 진행해보자. z..
자바로 코드를 작성할 때 gracefully 하게 종료하기 위해 ShutdownHook 을 사용하곤 한다. Runtime.getRuntime().addShutdownHook(new Thread(() -> { ... })); 프로세스를 중지하는 시나리오가 잘 있으면 좋겠지만, 강제 종료할 경우도 꽤 있을 것이다. 강제 종료의 경우 인터럽트 시그널인 kill -9 를 자주 썼었다. (각 시그널 번호가 뜻하는 의미는 인터넷에 매우 많으니 패스) SIGKILL (kill -9) 를 해도 ShutdownHook 이 되는지가 궁금했는데 결론부터 말하자면 안된다. 만약 프로세스 ShutdownHook 이 동작하게 하고 싶다면 SIGTERM(15)을 사용하도록 하자. (참고로 SIGINT(2) 도 된다. 인텔리제이에서..
왜 레디스는 싱글쓰레드로 되어 있을까? 프로그래밍이 쉽다. 동시성에서 도움이 된다. (동시성과 병렬성은 다르다!) CPU 가 보틀넥이 아니다. 비용이 효율적이다. 레디스가 싱글 쓰레드인데 어떻게 동시에 접근하지? 우선 동시성에 의미를 다시 생각해봐야 한다. 서버에서 동시성과 병렬성은 다른 컨셉을 갖고 있다. 서버에서 동시성 I/O 를 지원한다는 의미는 하나의 계산 단위만을 가진 클라이언트가 여러 흐름을 실행함으로써, 서버가 여러개의 클라이언트에 서비스를 제공할 수 있다는 의미이다. 병렬은 서버가 여러가지 일을 동시에 할 수 있다는 것이다. 예를 들면 바텐더 여러 고객들을 보고 하나의 음료만 만든다는 것은 동시성은 갖고 있지만 병렬성은 없다는 것이다. 참고 - stackoverflow.com/questio..
Catalog Table hbase shell 에서 list 명령어를 치면 안나와서 헷갈릴 수 있지만 hbase:meta 도 다른 테이블 처럼 그냥 테이블 중에 하나이다. 원래 -ROOT- 라는 테이블도 있었는데 버젼이 업데이트(0.96 이상 부터) 되면서 삭제 되었다. (참고 issues.apache.org/jira/browse/HBASE-3171) (현재 가장 유명한? HBase 책인 HBase 완벽가이드가 버젼이 0.92이여서 -ROOT- 라는 테이블 정보가 아직 있어서 헷갈렸다. 새 책 언제 나오나요?!!오라일리!!) hbase:meta 이전에는 .META. 라고 불렸던 hbase:meta 테이블은 모든 리젼에 대한 정보를 가지고 있다. 그리고 이 hbase:meta 는 주키퍼에 저장되어 있다. ..
Region-RegionServer 할당 방식 Region 이 어떻게 RegionServer 에 할당 되는걸까? StartUp (시작 시) Master 는 AssignmentManager 를 호출 한다. AssignmentManager 는 hbase:meta 의 (이미 있는) region 정보를 살펴 본다. 만약 region 이 여전히 유효하다면 (예를 들면 RegionServer 가 살아있는 상태인 경우) 할당을 한다. 만약 (할당이) 유효하지 않다면 LoadBalancerFactory 가 region 을 할당 시킨다. 로드 밸런서가 Region 을 RegionServer 에 할 >당 시킨다. hbase:meta 에 RegionServer 의 정보를 업데이트 한다. (필요하다면 RegionServer의..
hbase 테이블 별 용량 확인하기 path 는 기본적으로 zookeeper base path 이다. (변경되었다면 hbase master status 웹 UI 에서 확인할 수 있고 본인이 임의로 변경했다면 사용자가 당연히 알겠지?) 기본은 /hbase/data/default 이다. hdfs dfs -du -h /hbase/data/default
메모리 부족 swap 물리 메모리가 부족하게 되면 가상 메모리 방식을 응용한 'swap' 이 일어난다. 스왑은 저장 장치의 일부를 일시적으로 메모리 대신 사용하는 방식이다. 당연한 것이겠지만 메모리 보다 저장 장치에 접근하는 속도가 현저히 느리다. 그래서 시스템이 일시적인게 아니라 만성적으로 메모리가 부족하게 되면 스와핑 / 스왑 인 (스왑 영역을 물리 메모리 영역 으로 되돌리는 것) 과 스왑 아웃 (물리 메모리 영역을 스왑 영역으로) 이 반복되는 스래싱 (thrashing) 상태가 일어난다. 리눅스에서는 스와핑을 페이징이라고 부르기도 한다. 스와핑이 일어나지 않게 하기 (스왑으로 인해 일어나는 성능 하락을 막게 하기 위해) 위해서 아예 스와핑 옵션을 끌 수도 있다. 이 때 사용하는 값이 vm.swapp..