월별 글 목록: 2015년 5월월

[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) {
...
}

이런놈이 있더라… 하아…

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