2015년 7월 29일 수요일

Hadoop 1.X -> Hadoop 2.X Data Copy with DISTCP

Hadoop 1.X 에서 Hadoop 2.X 로 Data 를 Copy 할때는 여전히 distcp 를 이용하면 MapReduce Job 을 이용 N대의 머신의 IO 를 모두 활용 빠르게 Copy 가 가능하다.

하지만, 동일 버전의 서로다른 2대의 클러스터에서 사용할때와는 좀 다르게 사용해야 한다.

우선 동일 버전의 Cluster 에서는 아래처럼 사용했었다.

hadoop distcp hdfs://source-masternodeURL:9000/path hdfs://destination-masternodeURL:9000/path

그러나, 버전이 다른, 특히 1.X 와  2.X 처럼 크게 버전이 다른 경우에는 아래와 같은 에러가 발생한다.


 그래서, 위 명령어를 2.X 에서 수행하면서, 아래처럼 1.X 의 프로토콜을 변경해 주어야 호환성 있게 작동을 한다.

hadoop distcp hftp://source-masternodeURL:50070/path hdfs://destination-masternodeURL:9000/path

그러나, 위처럼 작업을 하면, 또 아래와 같은 에러가 발생하다가 MapReduce Job 이 죽어 버린다. 결과를 확인해 보면, Directory 만 잔뜩 에러 없이 만들어지고, 파일을 Copy 하는 과정에서는 아래처럼 CheckSUM 에러가 잔뜩 나다가 죽어 버리는 상황이 반복된다.

위 에러를 해결하는 방법은 아래와 같다.

에러메시지를 자세히 보면, using -skipCrc 요런 문구가 보인다. 그런데 옵션 메뉴얼상을 보면 -skipCrc 라는 옵션은 존재하지 않는다...아마도 에러메시지의 bug 인듯... 해당 옵션은 -skipcrccheck 이다. 그리고 해당 옵션만 넣고 수행하면, 또 -update 옵션과 함께 사용하라는 문구가 나온다. 결국 최종 컴멘드는 아래와 같다.

hadoop distcp -update -skipcrccheck hftp://source-masternodeURL:50070/path hdfs://destination-masternodeURL:9000/path

위 명령어 수행시 아래처럼 MapReduce Job 이 수행되면서 두 서로 다른 버전의 hadoop cluster 가 병렬 분산 Copy 가 이루어 진다.


댓글 없음:

댓글 쓰기