티스토리 뷰

아마존 AWS의 서비스인 EC2와 S3를 연동해서 하둡 클러스터를 구성하고 있습니다.


S3(Simple Storage Service)는 인터넷 스토리 서비스며, 데이터를 버킷 단위로 관리합니다.

하나의 버킷에는 여러 개의 데이터를 저장할 수 있고, 데이터 조회도 가능합니다.


EC2 단독으로도 하둡 클러스터를 운영할 수 있지만,

EC2 인스턴스를 제거할 경우 EC2의 모든 데이터가 삭제되기 때문에,

당연히 HDFS의 데이터도 복구할 수 없습니다.


이러한 현상을 대비하기 위해서 HDFS를 S3로 대체해서 구성해야 합니다.


하둡에서 S3를 인식하려면, core-site.xml에 AWS의 인증키를 설정하고,

맵리듀스잡을 실행할 때 입출력 데이터의 경로를 S3의 경로(s3:// 혹은 s3n://)로 설정하면 됩니다.


* 참고링크: http://wiki.apache.org/hadoop/AmazonS3


하둡과 S3를 연동하는 방법은 참고 링크의 내용처럼 매우 간단한데,

실제로 테스트하는 과정에서 무지 애를 먹었습니다.


맵리듀스 잡을 실행하면, 다음과 같이 S3를 인식하지 못하는 오류가 계속 발생했습니다.


java.lang.IllegalArgumentException: Invalid hostname in URI s3://버킷이름

at org.apache.hadoop.fs.s3.S3Credentials.initialize(S3Credentials.java:41)

at  org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.initialize(Jets3tNativeFileSystemStore.java:49)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:616)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)

at org.apache.hadoop.fs.s3native.$Proxy1.initialize(Unknown Source)


몇 시간의 구글링 끝에 원인을 찾아냈는데요..
바로 버킷의 이름에 언더바(_)가 들어가서, 호스트가 인식이 안된 것이였습니다. ㅠㅠ


S3 관리 콘솔에서 언더바를 넣어도 버킷이 잘 만들어져서 이런 오류가 날 줄 상상도 못했었는데요.
언더바를 뺸 버킷과 연동하니 잡이 정상적으로 돌아가네요.

S3에서 버킷을 만들 때 언더바를 넣지 않도록 주의하시기 바랍니다

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
댓글
  • 프로필사진 ^^ 혹시 .staging 파일 권한 문제 해결 하셨는지요? 2013.01.11 14:57 신고
  • 프로필사진 blrunner 저도 처음에 staging 파일 권한 때문에 애를 먹었는데요. 제 책에 있는 대로 설치하시면 문제 없이 실행됩니다. 댓글이나 포스팅하나로 설명하기에는 내용이 너무 많네요. ^^;; 2013.01.11 16:26 신고
댓글쓰기 폼