[hadoop] 30G Access log 수행 결과

namenode 1대

slave 3대(dataNode)
(30분)
13/12/06 01:16:28 INFO mapreduce.Job: Running job: job_1386259770316_0001
13/12/06 01:16:36 INFO mapreduce.Job: Job job_1386259770316_0001 running in uber mode : false
13/12/06 01:16:36 INFO mapreduce.Job: map 0% reduce 0%
13/12/06 01:17:20 INFO mapreduce.Job: map 1% reduce 0%
13/12/06 01:17:44 INFO mapreduce.Job: map 2% reduce 0%
13/12/06 01:18:24 INFO mapreduce.Job: map 3% reduce 0%
13/12/06 01:47:08 INFO mapreduce.Job: map 100% reduce 100%
13/12/06 01:47:09 INFO mapreduce.Job: Job job_13862597 70316_0001 completed successfully
slave 6대(dataNode)
(기존 30분 -> 17분으로 단축)
13/12/06 02:32:39 INFO mapreduce.Job: Running job: job_1386264218442_0002
13/12/06 02:32:46 INFO mapreduce.Job: Job job_1386264218442_0002 running in uber mode : false
13/12/06 02:32:46 INFO mapreduce.Job: map 0% reduce 0%
13/12/06 02:49:50 INFO mapreduce.Job: map 100% reduce 100%
13/12/06 02:49:51 INFO mapreduce.Job: Job job_1386264218442_0002 completed successfully

[hadoop] WARN unable to load native hadoop library

64bit에서 hadoop을 실행시키면 발생하는 경고창이라고 한다….

완전히 문제를 해결하기 위해서는 64bit환경에서 모듈을 컴파일 해야 한다고 한다.

http://stackoverflow.com/questions/19943766/hadoop-unable-to-load-native-hadoop-library-for-your-platform-error-on-centos

[Memory] thrashing

thrashing :
메모리 할당 -> 원하는 크기의 메모리 block이 없음 -> Memory 부족으로 -> Page Fault가 빈번하게 일어나는 상태(LRU alg로 오래된 page 추방)

원인 : 메모리 부족 -> system call로 조그만한 메모리 block 할당 -> 메모리 단편화(fragmentation) 발생 -> 단편화 조각보다 큰 메모리를 요청한 경우 메모리 부족으로 page fault 발생 -> 잦은 I/O -> CPU자원을 활용하기 어려움.

해결방법 : RAM Size UP, Block 단위의 메모리 공간 할당, 사용, 반납

VM기반의 Java보다는 system call을 사용하는 C++에서 이런 현상이 자주 발생한다고 한다.
http://stackoverflow.com/questions/60871/how-to-solve-memory-fragmentation

문제를 겪고 있는 프로그래머가 3가지 방법 중 가장 좋은 대안을 물어보았다.

1) Use Windows Low-fragmentation Heap

2) jemalloc – as used in Firefox 3

3) Doug Lea’s malloc

본문 내용의 일부를 발췌하여 요약하면
-> 비슷한 life time을 가진 동적 메모리를 비슷한 heap에 할당하여 관리 하는 것이 메모리 단편화를 막는데 효율적이라고 말한다. 그럼 용도에 맞는 Heap을 관리해야 한다고 하는데 

Why are you having a fragmentation problem? – Sources of fragmentation problems are caused by the behavior of an application and have to do with greatly different allocation lifetimes in the same memory arena. That is, some objects are allocated and freed regularly while other types of objects persist for extended periods of time all in the same heap…..think of the longer lifetime ones as poking holes into larger areas of the arena and thereby preventing the coalesce of adjacent blocks that have been freed.

To address this type of problem, the best thing you can do is logically divide the heap into sub arenas where the lifetimes are more similar. In effect, you want a transient heap and a persistent heap or heaps that group things of similar lifetimes.

아래 댓글을 읽어보면 흥미있는 대화를 하고 있는데 persistent, transient heap을 나눈 것이 일반적인 Garbage collection 정책과 유사한 것이 아니냐 라고 물어보니…

가장 높은 점수를 받은 저자가 embedded에서는 꽤 잘 알려진 사용 방식이라고 말하는 것으로 보아 embedded 개발자로 보인다. 

직접 써봐야 메모리 관리가 얼마나 어려운지 생산성은 얼마나 되는지, 안정적으로 메모리 운용이 가능한지 알 수 있을 것 같다.

말이 나온김이 Java GC 정책에 대해 정리하는 시간을 갖는 것이 좋겠다.

[Mysql] MYISAM table lock issue

MYISAM lock 이슈에 대해 사전 조사 중 읽어 볼만한 블로그 포스트가 있어 소개한다.

http://devoluk.com/mysql-myisam-table-lock-issue.html

위 내용은 다 읽을 필요 없고 이 문장 뒤로 읽어보면 된다.

It turned out we were having a classic table locking issue

And due to table level locking no write (INSERT) statement was allowed to run until the read (SELECT) query is finished.

non indexed select query 에서 지연이 발생하는데 insert는 우선순위가 select에 비해 낮아 insert query가 수행이 끝나기를 기다리느라 발생한 이슈라고 한다.(MYISAM)

2007년이라 좀 그렇긴 하지만 위에 언급한 내용과 동일하다.

http://nileshbansal.blogspot.kr/2007/07/mysql-lock-contention.html

After investigating a bit in why a SELECT was blocking other SELECT operations, I found an explanation in MySQL docs.

결국 원인은 slow query이며 Query 튜닝은 반드시 하여 slow Query가 발생하지 않도록 미연에 방지 하는 것이 중요하겠다.

[WEB] JSP precompile

블로그 내용은 API 문서를 참고 하였다.

일반적인 web application 제조사? 커뮤니티에서이미 제공한다.

Shell for the jspc compiler. Handles all options associated with the command line and creates compilation contexts which it then compiles according to the specified options. This version can process files from a _single_ webapp at once, i.e. a single docbase can be specified. It can be used as an Ant task using:

http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/jasper/JspC.html

추가로 웹 로직은 아래 링크를 참조

http://docs.oracle.com/cd/E13222_01/wls/docs81/jsp/reference.html#65756

ant를 이용하여 build 또는 hudson, jenkins batch에서 주기적으로 jsp 검증이 가능하다.

jsp precompile이 중요한 이유는 jsp는 페이지가 로딩 될 때 최초 한번 compile(lazy)한다.

만약 precompie을 하지 않고 배포하게 되면 배포 뒤에 최초 한번 jsp를 컴파일 하게 되는데 CPU load가 올라간다. 하지만 precompile을 하게 되면 다음과 같은 장점이 있다.

  1. compile 되는 시점에서 jsp가 유효한지(컴파일 가능한지, 문법이 잘 맞는지) 알 수 있다.
  2. 무정지 서비스 배포시에 CPU Load가 집중되는 것을 막아주며 안정적인 서비스를 제공 할 수 있다.

반드시 jsp를 precompile 한 뒤에 배포하자. (대충 쓴 글 2017년에 다시 업데이트 됨)

[독서] 태도의 차이 – 생각의 정리1

요즘 블로그에 이미 올린 글을 여러번 고친다.
그만큼 보는 사람을 의식해서인가 싶기도 하고 언제가 내가 쓴 글을 다시 읽어보면 손 볼 곳이 하나 둘 씩 보이기 시작한다.

난 저자처럼 독자에게 펌프질 하는 글보다는 필요한 내용 위주로 정리하여 나의 생각대로 해석하였다.

이 독자가 하고 싶은 말은 성공한 사람은 이미 태도가 다르다는 것을 의미한다. 태도라는 단어는 2개의 한글로 이루어 져 있지만 많은 의미를 함축한다.

무엇보다도 전문가가 성공하기 위해서는 치열한 준비가 있었다는 것을 책을 읽어 보면 알 수 있다.

1만 시간의 법칙

한 분야에 대해 정통하기 위해서는 1만 시간을 연습해야 한다. 그것도 1만시간은 대충 시간을 때우는 시간이 아니다. 집중해서 정말 연습한 시간이 1만 시간이라는 것이다.

과연 나는 얼마나 시간을 투자해 왔고 얼마나 왔을까 되물어 본다.

하루에 8시간을 근무하고 한달에 20일을 출근하고 1년은 12달이니 계산해보면 1년에 1920시간을 연습한다고 할 수 있다. 물론 직장에서 자기 전문 분야에 대한 연습만 하는게 아니라 일반 잡무도 섞여 있고 하루 최대 6시간을 집중해서 일을 한다고 치자. 그럼 75%의 효율을 가정하면 1년에 1440시간을 투자하는 셈이다.

그럼 1만시간은? 대략 견적이 나오지 않는가?  7년이다.

학교 교과 과정 외에 자기 수련을 해온지 07년도 대학교 2학년 때부터 였으니깐 만으로 6년이 좀 넘었다. 그럼 난 전문가에 얼마 만큼 가까워 졌을까? 에 대한 자문에 대한 자답은…

3년 전만 해도 많은 것을 안다고 생각 했지만 공부와 일을 하면 할 수록 무엇을 모르는지 더 많은 것을 알게 되었던 것 같다.

아직 갈길이 멀다. 집중하자 집중!!

타프(무용가) : “당신은 나에 대해 얼마나 아는지 알려주세요”

타프라는 무용가는 인터뷰를 요청한 책 저자가 여러가지 질문을 던지자 던졌던 말이라고 한다. 그리고 그 다음말은 짜릿하고 아름다웠다.

“하하하. 간단한 테스트죠. 당신이 우리 만남을 위해 얼마나 준비했는지 보기 위해서에요. 나는 당신이 보내온 소개서를 몇 번이나 읽었죠. 당신이 어떤 사람일지, 무슨 질문을 던질지 상상했어요. 인사를 나누기 전에 모든 준비를 마쳐야 합니다. 그렇지 않다면 우왕좌왕하다 재앙만 일으키죠”

의식 행위

매일 아침 의식 행위를 치르면서 하루를 최고로 보내기 위한 준비를 한다고 한다.
그 의식 행위는 개인마다 다를 수 있으며 하루를 보내는 가치의 무게가 달라짐을 체험할 수 있다.

나는 요즘 아침에 자고 일어날 때 하루가 주어졌음에 대해 감사의 기도를 올린다. 물론 무신론자인 내가 기도를 한다고 하면 나를 아는 사람들은 믿을 수 없겠지만…나만의 신을 만들고 나만의 신에게 기도를 한다.

기적과 같은 것이 그 뒤로는 회사 업무가 바빠도 일에 치이거나 정신상태를 놓는 일이 없어졌으며 지금 내가 필요한 것이 무엇인지, 목표를 똑바로 볼 수 있도록 만들어 주었다. 정신적으로 건강하니 몸이 건강해 졌고 운동도 더 자주하게 되는 것 같다.

마이클 센델

정의란 무엇인가를 쓴 저자다. 이 사람이 자신의 이야기에 몰입한 비결을 찾자면…
자신의 이야기를 하려는 사람에게 이름을 물어본 다음에 그 이름을 부르고 대화를 시작했다.
자신의 이름이 불리면 태도가 달라지고 보다 적극적으로 강연에 참여하게 만든다고 한다.

질문은 사람의 마음을 열게 한다고 한다. 질문을 받은 사람의 관심사에 대한 질문을 받으면 그 사람의 마음을 사로잡을 확률이 높다.

사람들은 자신이 생각해 낸 것을 더 쉽게 믿으며, 질문을 요령있게 하며 사람들의 마음을 특정한 방향으로 움직일 수 있을 것 같다는 것에 동의한다.

센델이 강의에서 즐겨하는 말은 좀 더 자세하게 이야기 해달라는 것이다.
당신이 하는 말에 흥미가 있고 보다 듣고 싶습니다. 난 당신을 존중합니다. 라는 의미가 아닐까.

물론 사적인 대화가 아니라면 상대방과 마주 않기 전에 반드시 철저한 준비를 마쳐야 한다고 한다. – 이것도 동의한다. 회의에 들어가기 전에 상대방을 어떻게 설득할 것인지 준비 된 사람이 회의 분위기를 주도한다.

책 저자와 같은 생각을 가지고 있지만 비판 할만한 구석은 보이지 않는다. 블로그 주인장은 Yes Man은 아닌 것 같다. 시키는대로 일을 잘 안하니깐!? 이 아니라 기계처럼 일하는게 아니니깐….ㅎㅅㅎ;

적어도 효율적으로 일이나 문제를 해결하기 위해서는 적당한 타협과 유혹적인 차선책으로 비용을 적게 들이고 문제를 해결 할 수 있다면 팀장님이나 고객이나 본인이나 모두 윈윈 아닐까?

[Math] 최소제곱법(Least squares method)

기계학습을 공부하는 도중에 최소제곱법이라는 용어가 나와 간단히 정리 하는 차원에서 포스팅을 한다.

이론을 공부하기 전에 가장 먼저 해야 할 일은 정의를 이해하는 것이며 더 중요한 것은 왜 이것이 필요한지 니즈를 이해하는 것이 좋다.

정체를 알 수 없는 함수 f(x)가 있다고 가정해 보자.

함수 f(x)의 입력값 x에 대응하는 출력값 y에 대한 데이터만 구할 수 있다면
함수 f(x)를 정확하게 아는 것은 어렵지만 근사적 접근으로 함수 f(x)를 구할 수 있다.

y = f(x,\beta)라고 하면

각 대응되는 점 (x_i,y_i)\!에 대해 
(y – y_i)의 차이를 r_i라고 하면 r_i=y_i-f(x_i,\boldsymbol \beta)

r_i의 합은 최소제곱법의 오차 S로 

S=\sum_{i=1}^{n}{r_i}^2 
S의 값이 최소가 되었을 때의 beta vector \boldsymbol \beta 값이 가장 함수 f(x)에 근접한다는 원리 이다.

그럼 beta vector는 어떻게 찾는 것이 좋을까? 일일히 값을 대입해볼까?

최소 제곱법을 Cost Function으로 정의하고 Cost Function 값을 최소값으로 만드는 최적화 알고리즘중 하나인 Gradient Decent Algorithm을 공부했다.

Cost Function은 Bow Shape 즉 둥그런 그릇 모양을 하고 있는데

바닥이 Cost Function의 최소 값이 되는 부분이다.

http://ko.wikipedia.org/wiki/%EA%B2%BD%EC%82%AC_%ED%95%98%EA%B0%95%EB%B2%95

특정한 지점에서 시작해서 Cost Function이 일정  부분 지점까지 기울기가 하강하게 되면은 최적화가 완료 된 것이다.

다른 방법으로는 선영대수 역함수를 이용하여 하는 방법이 있는데 이는 차원의 값이 적을 때 (대략 엔드류 교수님이 말씀하시길… n값이 1000~1500정도 이하면) 계산이 빠르고 그 이상이면 Gradient Decent 가 효율적이라 했던 것으로 기억한다.