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 가 이루어 진다.


2015년 7월 27일 월요일

Hadoop 2.7.1 - Cluster Setup 설치 적용기.

최근들어 hadoop 2.X의 버전업이 매우 긴박하게 이루어지고 있는 느낌이다. 작년 말 2.6.0 이 정식 릴리즈 된 이후, 잠시 Spark 때문에 Hadoop 버전업을 따라가고 있지 못한 사이, 불과 3달 전(2015년 4월말) Hadoop 2.7.0 이 4~5개월여 만에 또 다시 정식 릴리지가 된 바 있었기 때문이다. (그리고, 다시 언급하겠지만, 몇주전 Hadoop 2.7.1 이 정식 릴리지 되었다.)

그러나, Hadoop 2.6.0 을 Skip 하고 Hadoop 2.7.0 을 staging 에서 production 화 테스트 시작했던 두어달 전, 나는 작업 하던 중간 아래와 같은 문구를 발견하고, 한참 세팅하던 과정을 접고 다시 Hadoop 2.6.0 으로 Down Grade 하였던 아픈 기억이 있다.


바로 위에서 파란색으로 Highlight 한, 2.7.0 은 몇가지 critical issue 때문에 production 에서는 아직 이용하지 않는게 좋다는 문구 때문이었다.

위 이미지 내에 언급된것 처럼 2.7.0 에는 몇가지 매력적인 업그레이드가 있었다. 그중 하나는 Azure Storage 를 쓸 수 있게 된점이고(회사에서 그룹사 계약으로 Azure Storage 를 Amazon 보다 유리한 조건으로 사용이 가능하다.), 또 다른 점들은 (좀더 실험을 해 보아야 하겠지만) variable length 나 file truncate 를 사용할 수 있게 된 점 등이었다.

여하튼 그런 일부 매력적인 기능을 포기하고, 다시 2.6.0 으로 Down Grade 하였다가, 막 테스트를 끝내고 Production 환경 Rolling Upgrade Script 에 반영 Freezing 하려던 찰나...난 몇주전 또 한번 좌절하고 말았다.

바로, 2.7.0의 Critical Issue 가 해결된 2.7.1 의 안정버전이 발표 되었기 때문이었다.(정확히는 2015년 7월 6일 정식 릴리즈 발표가 있었다.) 버전 바꾸는 삽질을 많이했지만, 기저에 해당하는 Hadoop 의 버전업은 매우 조심하고 신중하게 처리해야 하고, 자주 하기도 힘든 작업인 까닭에, 어찌 되었든 다시 2주 정도를 할애하여, 신규 구성중인 New 시스템의 호환성 테스트를 마치고, Production Rolling Upgrade 버전을 다시 2.7.1 로 수정 하였다. 2.7.0 대비 131개의 Bug 패치가 더해졌다고 하니, 이 버전으로 한동안 안정적인 운영을 했으면 하는 바램이다. (대부분 2.6.0 과 호환성이 맞춰진 Legacy 들은 2.7.1 과 특별한 호환성 이슈가 발견되지 않았다.)

아래는 기본적인 테스트를 마친 Hadoop 2.7.1 설치 스크립트의 기본 버전이다. (일부 특수한 Legacy 및 자체환경 특화 Custom 세팅 부분은 제외한 기본 세팅 버전....)
  1. 초기세팅 ( at .bashrc )
    1. 환경변수 $JAVA_HOME 세팅 되어 있는지 확인
    2. 환경변수 $HADOOP_HOME , $HADOOP_CONF_DIR 세팅
    3. 환경변수 $HADOOP_PREFIX 세팅
    4. 환경변수 $LD_LIBRARY_PATH 세팅
    5. source .bashrc
  2. 다운로드
    1. wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
  3. 설치
    1. tar xvzf hadoop-2.7.1.tar.gz
    2. cd hadoop-2.7.1
    3. mkdir /data02/log/hadoop
  4. 세팅
    1. etc/hadoop/hadoop-env.sh 세팅
      1. export HADOOP_NAMENODE_OPTS 에 -XX:+UseParallelGC 추가
      2. export HADOOP_LOG_DIR=/data02/log/hadoop
      3. export HADOOP_HEAPSIZE=4000
      4. export HADOOP_NAMENODE_INIT_HEAPSIZE="4000"
    2. etc/hadoop/core-site.xml 세팅
    3. etc/hadoop/hdfs-site.xml 세팅
      1. for NameNode
      2. for DataNode
    4. etc/hadoop/yarn-site.xml 세팅
      1. 우선 대부분 default 로...
      2. 위 Address 및 기본 옵션 추가
    5. etc/hadoop/mapred-site.xml 세팅
    6. etc/hadoop/slaves 세팅
      1. 모든 slave 노드의 hostname 혹은 ip를 등록
    7. Rack Awareness
      1. 현재 Staging 배포 버전에선 skip. Production 할때 하는 걸로...
  5. 전체 노드로 설정파일 overwrite 복사
    1. 위에서 수정한 설정 파일들에 대하여 전체 노드에 복사.(with scp)
    2. hdfs-site.xml 의 경우 NameNode 설정과 DataNode 설정값이 다소 다름.
  6. 전체 노드에 기본 디렉토리 생성
    1. 위 xml 파일에서 설정하였던 디렉토리들 mkdir
  7. 전체 노드에 기본 유저 생성
    1. Stage 모드에서는 moneymall로 통일
  8. password less 설정
    1. master node 루트 에서
      1. ssh-keygen -t rsa 하고 엔터 세번...
      2. scp ~/.ssh/id_rsa.pub moneymall@각노드Domain:~/.ssh/authorized_keys
    2. clinet node 에서
      1. mkdir ~/.ssh
      2. chmod 700 ~/.ssh
      3. chmod 600 ~/.ssh/authorized_keys
  9. 각 노드 구동
    1. master node 의 hadoop home 으로 이동
    2. bin/hdfs namenode -format moneymall(<-cluster 이름)
    3. sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
    4. sbin/start-all.sh
    5. 리소스메니저가 안뜨면...
      ./yarn-daemon.sh start nodemanager
      ./yarn-daemon.sh start resourcemanager
      
      
  10. DataNode jps 확인
  11. NameNode jps 확인
  12. Web UI 띄움. (Classic 버전) <-- Classic UI 가 2.6.0 에서는 공존하였는데, 2.7.1 에서는 Default 로는 링크가 존재하지 않는다.
  13. [내부 정보 유출 방지를 위하여 이미지는 Dev-Zone 이미지 임.]
  14. Web UI 띄움. (New 버전) <-- New  UI가 2.6.0 에서는 하단 링크로 존재하였었는데, 현재 버전에서는 Default 로 존재한다.
  15. [내부 정보 유출 방지를 위하여 이미지는 Dev-Zone 이미지 임.]