Format aborted in namenode

하둡을 처음 설치해 보는데 namenode 포멧이 안되는 것이었다.


[root@hadoop-1 bin]# hadoop namenode -format
Warning: $HADOOP_HOME is deprecated.

15/05/22 02:37:44 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop-1/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.2.1
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG: java = 1.7.0_79
************************************************************/
Re-format filesystem in /home/hadoop/hdfs/namenode ? (Y or N) y
Format aborted in /home/hadoop/hdfs/namenode
15/05/22 02:37:46 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop-1/127.0.0.1
************************************************************/

이유는….

Re-format filesystem in /home/hadoop/hdfs/namenode ? (Y or N) y

이 부분

대소문자 가림….. Y 로 해야한다..

하하..

[AngularJS] controller 2번 호출 되는 문제

AngularJS 를 이용해서 개인적인 프로젝트를 하는데 Controller가 2번이 호출되는 문제가 발생 했다.

대략 컨트롤러 소스 를 올려보면

여기서 사용중인 IntroController 소스는

이렇게 되어있는데 저 IntroController 이 두번이 호출이 되는 현상이 발생 했다.

Screen Shot 2015-05-07 at 3.58.05 PM

대략 이런식로..

이게 왜 문제가 발생 하냐면

templateUrl: ‘/assets/views/intro.html’ 이 html 파일 안에

data-ng-controller=”IntroController” 이렇게 컨트롤러를 또 호출해주는 코드가 있었다 -_- ㅎㅎ

하핫 그런데 웃긴것은 검색 해보니 나말고 이런사람 많다는거! =_=;;

Play framework 에서 Cookie 사용하기

이번에 Play framework 에서 사용자 인증을 처리하는데 Cookie 를 사용하기 위해 좀 찾아 보았다.
역시 Play framework! 쿠키 사용하는것이 완전 심플 했다.

이렇게 간단하게 사용이 가능하다.

Play 굿 +_+)=b

ConcurrentHashMap 의 lock 거는 기법

일단 ConcurrentHashMap 과 HashMap 의 차이점은 다 알고 있다는 전제하에 포스팅을 작성 한다.

이 포스팅을 하게된 이유는 사실 어떤분이 나에게 ConcurrentHashMap 과 HashMap 의 차이점을 아냐고 물어봤고
물론 알고 있어서 쏼라쏼라 대답을 했지만 (Multi-Threaded 환경에서 thread safe 여부) 거기에서 끝나지 않고
또 물어보시더라 ConcurrentHashMap 이 왜 Thread 에 safe 한지? 어떤 원리인지 아세요?

그래서 나는 사실 정확하게 알진 못했지만 대략 MySQL 의 innodb 처럼 row-level lock 걸듯이 접근하고 있는 해당 Key 값에
lock을 걸지 않을까요? 라고 대답을 했다.

이 대답은 후에 찾아 보니 반은 맞고 반은 틀리더라…

그리고 다시한번 정확하게 정리한다..

——————————————————————————————————

보통은 우리가 Multi-threaded 환경에서 key-value 저장소가 필요할때 자바에서 사용하는 것이

크게

1. HashTable
2. HashMap
3. ConcurrentHashMap

이렇게 있는데 파악을 하기 위해서 각 자바 source 를 까보았다.
가장 중요한 Get, Set 부분만 보면

1. HashTable


public synchronized V More ...get(Object key)
public synchronized V More ...put(K key, V value)

보이는가? 메소드 레벨에서 synchronized 를 걸어 버린다.

2. HashMap

얘는 볼것도 없이 synchronized 가 없다. 따라서 속도는 빠르지만 Multi-threaded 환경에서 그냥 쓰면 여러 Thread 에서 동시 접근시 Exception 이 난다.

3. ConcurrentHashMap

얘는 특이하게 synchronized 가 아니라 lock 을 사용한다.


V More ...put(K key, int hash, V value, boolean onlyIfAbsent) {
lock();
try {
int c = count;
if (c++ > threshold) // ensure capacity
rehash();
HashEntry[] tab = table;
.
.
.

처음에 이 부분만 보고 아싸 내 말이 맞았구나 했다. 하지만 찾아 보니

비슷은한데 CurrentHashMap 은 Map 자체를 Currency 레벨로 영역을 쪼개서 (기본이 16개)
해당 영역별로 lock을 거는 것이었다. 이 Lock 이름은 ReentrantLock 이라고 한다.

소스에서

CurrentHashMap 생성자중에


public More ...ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) {
...
}

이런놈이 있더라… 하아…

역시 갈길이 멀다.. 그래도 좋은거 하나 확실하게 배웠다.

Play framework 에서 JVM 옵션 조정 하기

전에 포스팅 했던 JSrank 는 Play framework 를 사용하여 만들었는데
오픈 하면서 JVM 옵션을 조정할 일이 생겼다.

간단했다.

Linux 기준으로


shell >> JAVA_OPTS="-Xms512m -Xmx1g -XX:NewRatio=3 -XX:+UseConcMarkSweepGC -Xloggc:gc.log -verbose:gc -XX:+PrintGCDateStamps -server"

하면 끝.

(혹시 모르니 shell 에서 echo $JAVA_OPTS 명령어로 설정값을 확인해 보는것이 좋다)

설정후

play 로 play framework 콘솔 진입후

start 80 (80 포트로 시작)

후에 ctrl + d 로 빠져 나오면 된다. (ctrl + c 하지 말자! 취소다)

ebean 에서 orm 테이블 조인

아놔….

Play framework 를 사용하여 웹어플리케이션을 만들고 있는데
일단 Play framework 는 h2 database engine 이 embedded 되어 있어서 편리하게 사용할수 있고 해당 db 는
ebean 을 사용하여 orm 을 사용할수 있다.

난 사실 orm 보다 sqlmap 을 더 선호하지만 한번 사용해 봤다.

생각보다 ebean 은 사용하기 편했고 별다른 문제가 없었지만 서로 다른 테이블 join 시에 문제가 발생했다.
ebean 의 메뉴얼을 보고 해도 안되는 것이었다… ㅜㅜ 즉


SELECT a.data1, b.data2 FROM A as a INNER JOIN B as b a.id = b.id WHERE ...

이런 쿼리를 짜고 싶다고 가정하면

Entity 2 개를 정의하고 (Ebean 에서 Entity 즉 우리가 일반적으로 Java 프로그래밍에서 말하는 Model)

A Entity


@Entity
@Table(name = "a")
public class A extends Model {
...

@OneToMany(mappedBy = "bTest", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public ArrayList b = new ArrayList<>();
}

B Entity


@Entity
@Table(name = "b")
public class B extends Model {
...

@ManyToOne(fetch = FetchType.EAGER)
public A a;
}

이렇게 정의 해주고


Ebean.find(A.class)
.select("a.data1, b.data2")
.where()
...

해도 조인이 안걸린다.. 그냥 A 테이블만 select 될뿐…
이걸로 몇일동안 메뉴얼도 보고 이래저래 다 해봤는데 실패..

결국

RawSql rawSql = RawSqlBuilder.parse(sql).create();

를 사용하여 직접 SQL 문 작성하여 만들었음…

아 정말 왜 안되는걸까?…

언젠가 해결 되면 해당 포스트에 댓글로 달겠음… ㅜㅜ

jmx 를 이용한 JVM 모니터링 사용하는 방법

JVM 상태를 모니터링할때 간단하게 사용할수 있는것이 바로 JMX 이다.
java 를 설치하고 기본적으로 깔려있는 비주얼 jvm으로 간단하게 확인 가능하다

java 어플리케이션을 실행전에 해당 옵션을 추가해 주면 된다.

export JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote=true”
export JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.port=포트”
export JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false”
export JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false”
export JAVA_OPTS=”$JAVA_OPTS -Djava.rmi.server.hostname=서버아이피”

해당 설정은 인증없이 바로 JMX 에 접근할수 있으니 ACL 등을 이용해서 접근 권한을 설정하도록 하고

만약 인증이 필요하면 jmxremote.access과 jmxremote.password 파일이 필요하다.

jmxremote.access : 사용자 권한
jmxremote.password : 사용자 비밀번호

jmxremote.access는 $JAVA_HOME/jre/lib/management/ 에 위치해 있다.
jmxremote.password는 $JAVA_HOME/jre/lib/management/에 템플릿파일이 있으니 복사해서 쓰면 된다.
(chmod 600 jmxremote.password 권한 설정 필수 읽기만 가능하도록)

다음 해당 값을 바꿔준다.
export JAVA_OPTS=”$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true”

테스트 결과 어느정도 고 부하가 있는 서버에서도 큰 문제없이 사용이 가능했었다.
그래도 꼭 테스트를 하고 사용하도록 하자

개발자가 맥을 써야하는 이유 ?

저는 회사에서 플랫폼 개발 및 아키텍쳐를 담당하고 있습니다.
저는 맥을 업무용 PC 로 사용하기 때문에 회사의 보안쪽에게 부탁을 해야하는 경우가 많은데요.

왜 당신은 꼭 mac 을 써야 합니까? 라는 질문에 제가 대답한 내용을 정리해서 글로 남겨 봅니다.


안녕하세요. 이경일 입니다.

일단 저희 팀에서 주장하는 저희 팀이 (정확히는 저희 플랫폼 개발 파트 개발자가) 맥을 써야하는 이유입니다.

mac 의 OS인 osx 의 코어인 unix 정확히 말하면 (FreeBSD) 때문 입니다.
Android 개발이나 웹 개발은 솔직히 꼭 mac 이 필요 없긴 합니다. 하지만 웹어플리케이션 또는 서버 플랫폼 아키텍쳐 개발을 하는
저희 파트의 경우 특성상 서버 환경에서 오픈 소스 및 오픈 플랫폼을 가지고 개발을 하는 경우가 많습니다. 이 오픈 소스의 경우
대부분 unix 환경에 최적화 되어있기 때문입니다. 윈도우 os 에서 개발을 한것이 unix 나 linux 환경에서 안돌아 가는 경우가
종종 있습니다.

저희 파트는 서버상에서 돌아가는 것들을 만드는 파트이고 또한
개인용 PC 시장은 윈도우가 장악했을지 몰라도 서버 시장은 unix, linux 의 세상이라고 말할수 있을 정도 이기 때문이죠.

만약에 mac 을 쓰지 말라고 할 경우 저희 파트의 경우 윈도우를 쓰지 말고 Linux 를 (우분투 같은) 써야 하는것이 맞습니다.
따라서 편리한 컴퓨터 사용 환경과 개발을 위해 최적화된 환경 모두를 충족해주는 OS 는 지금은 mac 뿐 입니다.

그리고 Android 나 웹 개발자는 그럼 mac 을 쓸필요가 없지 않느냐 ? 라고 물어 보실수도 있는데 물론 반드시 쓸 필요는 없습니다.

하지만 Android 개발자나 웹 개발자는 주로 개발 도구로 eclipse 를 사용합니다. 이 eclipse 는 java 로 짜여진 개발 도구로
OS 의 메모리 관리에 매우 민감합니다.

따라서 메모리 관리가 엉망인 윈도우에서 사용하다가 종종 eclipse 가 죽는 경우가 종종 있는데 그런경우 힘들게 개발한 코드가
날아가는 경우가 허다하게 발생 하고 있습니다.
mac 에서는 아직 그런 경우는 경험해보지 못했습니다.

쉽게 이야기 하면 안정성과 효율성 이라고 말하고 싶네요. (싱글 모니터 쓰는것보다 듀얼 모니터 쓰는것이 효율이 좋은것과 같은 맥락)

저희 팀 안에 ui 개발 파트가 있는데 이 파트는 맥을 안쓰고 윈도우 PC 를 쓰고 있습니다.
이분들은 eclipse 를 안쓰고 editplus 라는 text 편집 툴을 쓰고 사용자들과 접점인 브라우저 상에서 돌아가는 것을 개발하는 파트 이기
때문에 사용자의 대부분을 차지하는 익스플로어 환경 (윈도우) 에 맞추어 개발할 필요가 있기 때문이죠.

그들 입장에서는 맥에서 개발하고 확인을 하기 위해서 VDI 의 익스플로어를 쓰면 너무 불편하고 효율성을 위해 PC 를 쓰는것 입니다.

저희 파트는 mac 을 꼭 사용했으면 하는 점을 어필한 것이니 검토 부탁 드립니다.

 

어떤가요? 동감 가시나요?

추가

죄송합니다. 해당 글은 매우 개인적인 글로 한창 패기 있을 때 쓴 글입니다. 당시 매우 폐쇄적인 대기업의 상황에서 온갖 보안 프로그램이 달려있는 윈도 랩톱을 사용하다가 화가 나서 쓴 글인데… 오해가 좀 있을 거 같네요. 저 회사 다닐 때 결국을 맥을 사용하긴 했는데 결국 맥용 보안 프로그램을 어디서 또 구해 오더라고요… 우분투는 그런 보안 프로그램을 설치가 불가능해서 인터넷을 접속할 수 없어 전혀 사용할 수 없었고요. (개인적으로는 우분투 좋아합니다. 제가 사용하는 씽크패드에도 일부 파티션에 우분투를 설치해서 사용하고 있습니다.) 우분투 이야기가 많으신데 물론 우분투 좋습니다. 하지만 가끔 답답하때가 있더라고요. 에버노트 사용이라던지 가끔 하는 게임류? (제가 가난해서 게임용 데스크톱이 따로 없다 보니 ㅜㅜ)

 

[Play framework] Error getting sequence nextval 발생시…


play.api.Application$$anon$1: Execution exception[[PersistenceException: Error getting sequence nextval]]
at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.0]
at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.0]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:132) [play_2.10.jar:2.1.0]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:128) [play_2.10.jar:2.1.0]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0]
javax.persistence.PersistenceException: Error getting sequence nextval

시퀀스 오류인데 정말 아무리 살펴봐도 잘못된 부분이 없었다….
테이블과 시퀀스를 지우고 다시 만들길 수차례…

점점 졸릴쯔음 기존것을 그냥 지운뒤에 시퀀스를 새로운 이름으로 다시 만들어 봤다…

script_result_queue_seq -> script_result_queue_new_seq

문제가 해결 되었다…. 이유가 뭘까? ㅜㅜ