[Hbase] 구동시에 regionserver 에서 마스터서버 주소를 localhost 로 접속을 시도할 경우 (Attempting connect to Master server at localhost)

네이버의 pinpoint 를 도입하기 위해 테스트를 하려고 하던중 이었다.

pinpoint 를 설치하기 위해서는 일단 hadoop + zookeeper + hbase 를 설치해야하는 상황…
일단 hadoop 부터 zookeeper 까지는 문제 없이 설치를 완료 했다.

하지만 hbase 는 자꾸 문제가 발생 ….

일단 문제가 hbase 의 regionserver 가 구동시에 master 서버로 접속을 해서 validation 체크를 해야 하는데
자꾸 로그상으로 regionserver 에서 master 서버의 아이피를 localhost 로 보고 있는…

Exception log를 보면

이런식 으로… Attempting connect to Master server at localhost,60000 을 보고 있다.

hbase 설정 파일에는

분명히 마스터로 namenode 를 잡아 놨는데도 저렇게 바라보니 정말 혼란스러웠다..
구글링을 해봤지만 쓸만한 답변은 찾을수가 없었다. (대부분 위에 설정 파일처럼 hbase.master 를 설정 해보라는 것)

이 상태에서 zookeeper 로 hbase 상태를 확인해 보면

이렇게 아무것도 안나오는 상황…

일단은 각 regionserver 들에 HRegionServer 프로세스가 잘 뜨고 있고 namenode 인 마스터 서버에도 HMaster 가 잘뜨고
있기 때문에 결국은 남은것은 host 설정 문제 뿐 이었다… (조언을 부탁 드린 네이버 분들도 이 부분을 알려주심)

이쪽으로 구글링을 집중적으로 해보았다.
결과는 127.0.0.1 localhost 설정을 없애 보라는것

일단 /etc/hosts 내용을 보면

* 참고사항
1. 총 서버는 4대
2. 각 서버의 호스트 명은 hadoop-1, hadoop-2, hadoop-3, hadoop-4
3. 아이피는 내부 아이피 이니 해킹 시도는 꿈에도 꾸지 말것!

이렇게 되어있고 namenode 가 마스터 이다.
그리고 regionserver 는 datanode01 ~ 03 이다.

여기서

이 부분을 이렇게 주석 처리 하고

이렇게 각 서버별로 서버명과 자신의 아이피를 설정해준뒤

zookeeper 클라이언트 에서 /hbase 삭제후에 다시 hbase 기동!

기동하면서 regionserver 로그를 tail 로 찍어놓고 보면

master 서버의 주소를 의도한대로 hadoop-1로 보고 있는것을 알수 있다.

잘 실행이 되는것을 알수 있다.

휴… 해결.. 이제 pinpoint 설치하러 가야겠다.

그런데 이 설정으로 localhost 127.0.0.1 설정이 없어졌는데..
이로 인해 문제가 다른곳에서 발생을 할지 … 좀 걱정이긴 합니다… 따라서… 좀 써보다가 문제가 발생하면
다시 포스팅 하도록 하겠습니다…

———————–추가————————————————————

아무래도 localhost 를 없앤것이 좀 찝찝한 나머지 좀 테스트를 해보았습니다.
결론적으로 말하면 linux 에서는 127.0.0.1 localhost 설정이 hosts 파일에 없어도 기본적으로 localhost 를 127.0.0.1
로 인식하는거 같네요.

이런식으로 인식이 됩니다.

그래도 혹시 어플리케이션 중에 hosts 파일의 localhost 설정을 사용하는 것이 있을수 있기 때문에
각 서버의 /etc/hosts 파일에 localhost 를 추가해 주기로 했습니다.

위의 설정의 요는 localhost 가 127.0.0.1 이 아닌 본인 서버의 아이피만 바라보면 되기 때문에

hadoop-1 서버

hadoop-2 서버

hadoop-3 서버

hadoop-4 서버

이렇게 추가시켜 주었고 잘 동작 하네요..

도움이 되시길 바랍니다.

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 을 꼭 사용했으면 하는 점을 어필한 것이니 검토 부탁 드립니다.

 

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

추가

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