티스토리 뷰


하둡1.0 에서 부분 정렬을 하려고 MapFileOutFormat을 사용하는데 뜬금없이 FileNotFoundException이 발생했습니다.^^;;

 Exception in thread "main" java.io.FileNotFoundException: File does not exist: hdfs://server01:9000/user/blrunner/output/_SUCCESS/data
        at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:517)
        at org.apache.hadoop.fs.FileSystem.getLength(FileSystem.java:796)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1475)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1470)
        at org.apache.hadoop.io.MapFile$Reader.createDataFileReader(MapFile.java:302)
        at org.apache.hadoop.io.MapFile$Reader.open(MapFile.java:284)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:273)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:260)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:253)
        at org.apache.hadoop.mapred.MapFileOutputFormat.getReaders(MapFileOutputFormat.java:93)

인터넷이나 하둡 책에 나와 있는대로 구현했는데, 위와 같은 에러가 나오니 참 당황스럽더군요.
output 폴더는 시퀀스 파일을 맵 파일로 변경한 폴더인데,
혹시나 output 폴더의 하위 폴더까지 지정해봐도 똑같은 에러가 발생했습니다.

 Exception in thread "main" java.io.FileNotFoundException: File does not exist: hdfs://server01:9000/user/blrunner/output/part-00000/data/data
        at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:517)
        at org.apache.hadoop.fs.FileSystem.getLength(FileSystem.java:796)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1475)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1470)
        at org.apache.hadoop.io.MapFile$Reader.createDataFileReader(MapFile.java:302)
        at org.apache.hadoop.io.MapFile$Reader.open(MapFile.java:284)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:273)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:260)
        at org.apache.hadoop.io.MapFile$Reader.<init>(MapFile.java:253)
        at org.apache.hadoop.mapred.MapFileOutputFormat.getReaders(MapFileOutputFormat.java:93)

분노의 구굴링은 했지만 역시나 뾰족한 닶은 없었는데요.

하둡 버전이 1.0이라서 지원이 안되는 건가도 생각해봤지만,
하둡을 다운그레이드 하기에는 너무 부담스럽더군요.

그런데 오류 메세지를 다시 한번 들여다 보니 data라는 폴더가 눈에 들어오더군요.

File does not exist: hdfs://server01:9000/user/blrunner/output/_SUCCESS/data
File does not exist: hdfs://server01:9000/user/blrunner/output/part-00000/data/data

하둡IO를 보신 분은 아시겠지만, MapOutput을 생성하면 data와 index라는 두 개의 폴더를 생성합니다.

MapFileOutputFormat.getReaders를 할 때 MapFile이 저장된 폴더명과 FileSystem 객체를 설정하는데,
FileSystem이 MapFile 폴더명에 있는 모든 폴더에서 data 폴더를 체크해서 오류가 난 것입니다.

MapFile이 저장된 폴더를 아래와 같이 확인해보면 _SUCCESS와 _logs가 있습니다.
바로 요 두 폴더에서도 data 폴더를 체크해서 오류가 난 것입니다. --;;

 ./bin/hadoop fs -ls output
Found 3 items
-rw-r--r--   1 blrunner supergroup          0 2012-03-13 12:22 /user/blrunner/output/_SUCCESS
drwxr-xr-x   - blrunner supergroup          0 2012-03-13 12:21 /user/blrunner/output/_logs
-rw-r--r--   1 blrunner supergroup     218725 2012-03-13 12:21 /user/blrunner/output/part-00000

결국 두 폴더를 삭제해주니 MapFileOutputFormat.getReaders가 잘 실행됐습니다. ㅎㅎ

P.S 하둡 0.19에서도 이렇게 해줘야 하는 지 궁굼한데요.
      혹시라도 제 방법이 잘못됐거나, 다른 좋은 방법이 있으면 댓글 부탁드리겠습니다~ ^^



저작자 표시 비영리 변경 금지
신고
댓글
  • 프로필사진 하둡에 이를 가는 사람 로컬(윈도우)에서 맵리듀스를 돌리고 있는데요...
    _SUCCESS를 지우고 해도 안 돌아 가더라구요
    버전은 1.0.1을 쓰고 있습니다.
    data라는 폴더도 만들어 보고 별짓을 다했는데도 안 돌아 가서...
    혹시 꼭 해주어야 하는 방법이 있는지 물어보고 싶어서 글을 남깁니다.
    혹여 괜찮으시면... 답변을 부탁드립니다.
    2012.03.21 14:54 신고
  • 프로필사진 blrunner _log 폴더도 지우신거죠? 입력 경로는 파티션명이 아니라, 시퀀스 파일이 저장된 상위 폴더를 입력하셔야 되요. 제가 올린 폴더를 보면 output을 입력 경로로 잡았다고 보시면 됩니다. 다시 해보시고 안되면, 에러 로그를 올려주세요~ 2012.03.22 08:36 신고
댓글쓰기 폼