본문 바로가기

HaDoop...?

hadoop test중 문제점

문제점

hadoop을 가동중이다. 그러다가 설정파일(conf/ 밑에)을 고쳤다. 복제개수라던지.. 등등

hadoop을 종료하고 hadoop namenode -format을 한다.

그대로 실행하면 data의 namespaceID가 달라서 에러가 뜬다.

그럴 경우 dfs.data.dir 파일을 지우고 다시 NN를 포맷한다.

그러면 설정파일을 바꾸면 data 디렉토리를 삭제해야된다는 건데. 그러면 기존에 있던 데이터는 전부 날라간다...

말이안된다 내가 잘못한건지 모르겠다.

------------------------ 해결

아아... 소스를 분석해봤다. NN가 실행 할 때 conf파일을 다시 한번 읽는다.

format 할 때 읽는 것이 아니다. 고로 format을 할 필요가 없다. 고로 data도 지울 필요가 없다..

가끔 safemode중이라서 delete가 안 될 경우가 있다. 그럴경우

hadoop dfsadmin -safemode leave 를 치면 safemode OFF 가 된다. 그러고 지우면 된다.



지금 노드에는 단일 노드 머신이고

hadoop 0.20.0 버전과

hadoop 1.03 ? 버전이있다.


1.xxx 버전은 상당히 안정적이고 에러 없이 잘 돌아가나

0.20 버전은 상당히 에러가 많다. 뭐만하면 exception이 뜬다...


예를들어 could only be replication to 0 nodes, instead of 1 같은 에러가.. 유일하게 해결을 못했다.

(결과론 적으로 해결한건가..? 이론상은 맞는듯)


다른건 다 구글링하고 소스뒤져서 해결했는데.


뭐하다가 이런 에러가 났냐면. 맨위에 문제점을 고민하고 있을 때 dfs.block.size를 변경해봤다. 그러고 hadoop에 파일을 올려봤는데

소량의 뭐 conf/ 디렉토리 자체를 올린다던지(cmd : hadoop dfs -put $HADOOP_HOME/conf input) 소량의 데이터는 잘 올라가는데. 대량의 데이터.(대량도 아님) linux kernel source 3.3 을 올렸는데 안올라간다.. 저런 오류가 뜬다..

일단 추측으로는 파일 사이즈(hdfs-site.xml -> dfs.block.size)를 2KB(20480)를 잡았다.  그럴 경우 conf밑은 xml이라 용량이 작아서 잘 올라가는듯 하나.

커널 소스같은 경우는 너무 용량이커 blk으로 나누자니 디렉토리 내 파일생성 최대치를 넘겨서 못하나 보다. (디렉토리 안에 파일을 생성할 수 있는 최대 개수가 있다. 그래서 current밑에 보면 subdir이 있는것이다. subdir 안에 또 blk이 나눠서 저장된다.)

그래서 복제 할 수 있는 노드가 0이라고 뜨는것이다. DN가 많으면 복제 개수가 많아서 그만큼 분산되어 디렉토리 안에 blk이 생성 될 수 있다고 하지만. 이 경우에는 복제개수가 한개라서 current의 하나의 디렉토리가 감당 할 수 있는 파일의 개수를 초과해버린 것이다.


정리하자면 극히 작은 크기의 블록 사이즈를 설정하고 복제개수가 1개일 경우에는 큰 용량의 데이터를 저장 할 때 dfs.data.dir의 파일 생성 개수의 한개가 와서 오류가 뜨는 것이다 (극히 추측.. )


이론상은 맞는거 같은데..실험으로도 맞고.. 찾아봐도 답이없다 ㄱ- 구글링이 안나와 ㅠ


커널 공부했을때 기억으로는..

커널에서 디렉토리내 한정 개수를 늘려주는 것이 있다. 그리고 64bit인 경우에는 무한(? 무한은 아님 대신 엄청 많음)에 가까운 디렉토리를 생성 할 수 있다고 한다. 그러면 커널 레벨에서 설정을 해줘야되는데 다른 오류(커널오류)가 뜨면 그냥 ZOT망이라 안 건드릴란다. 


또 blk을 보면서 알게 된건데 예를들어 20480사이즈 20KB로 블록 사이즈를 잡으면 작은 크기는 모두  20480사이즈로 blk이 저장되는게 아니다. 몇개는 20480이지만 나머지는 15byte부터 크기가 다양하다. blk은 NN에서 랜덤으로 blk_<id> 를 난수로 생성해서 지 원하는 DN에게 던져주고 나서 어디에 던졌는지 저장한다더라. 

이 말은. 예를 들자면 공이있다. 정면으로 던지겠다 하고 던지는게 아니고. 아무곳이나 던지고 난 후 던진 방향을 적는 것이다. 뭔가 좀 난잡한데.. 소스보니까 진짜 난수인가보다 random() 함수도 발견했다... 뭐이리 무식하게 단순하게 한건지 실제로 블록 관리하는 FSDataset.java, Block.java를 봐도 어떻게 나눠서 저장하는 지는 안나온다. 그냥 NN를 DN에게 뿌리고 DN는 파이프라인으로 연결된 DN끼리 복사만 하고 복사 완료후 NN에게 보고를 하면 NN는 그 보고를 정리해서 리포트를 가지고 있는 것이다. 고로 BlockReport가 이렇게 생겨난다.


뭔가 정리가 안되고 철자도 많이 틀렸는데. 분노의 타이핑.. 몇시간동안 삽질만 했다.

여기까지 읽는 용자가 있는지는 모르겠지만. 알고있는 정보일 수도 있고 모르는 정보일 수도 있다.

읽으면 도움이 되겠지만 정리가 안되있다. 나중에 정리하고 철자 다고쳐서 올리겠다. 디아블로 하러가야징



* 지식은 공유되어야 한다. 그러니까 제가 틀렸으면 댓글..*

'HaDoop...?' 카테고리의 다른 글

Hadoop 코딩 환경 설정 및 hadoop 컴파일 해보기  (0) 2012.06.29
JDK, ANT 설치  (0) 2012.06.29
hadoop 실습 examples  (1) 2012.05.03
Hadoop Multi 환경 구축!  (0) 2012.04.12
Fedora Hadoop Compile !!!  (0) 2012.03.28