Hadoop: 분산 캐시 배포(Distributed Cache Deploy)

Hadoop: 분산 캐시 배포(Distributed Cache Deploy)

MapReduce 애플리케이션 프레임워크는 분산 캐시를 통해 새 버전의 MapReduce 프레임워크를 배포하는 기초적인 지원을 제공해요. 적절한 구성 속성을 설정하면 사용자는 클러스터에 처음 배포된 것과 다른 버전의 MapReduce를 실행할 수 있어요.

출처: 문서

본문

소개 (Introduction)

MapReduce 애플리케이션 프레임워크는 분산 캐시를 통해 새 버전의 MapReduce 프레임워크를 배포하는 기초적인 지원을 제공해요. 적절한 구성 속성을 설정하면 사용자는 클러스터에 처음 배포된 것과 다른 버전의 MapReduce를 실행할 수 있어요. 예를 들어 클러스터 관리자는 여러 버전의 MapReduce를 HDFS에 배치하고 mapred-site.xml을 구성해 작업이 기본적으로 사용할 버전을 지정할 수 있어요. 이것은 관리자가 특정 조건에서 MapReduce 프레임워크의 롤링(rolling) 업그레이드를 수행할 수 있게 해줘요.

전제 조건과 제한 사항 (Preconditions and Limitations)

분산 캐시를 통한 MapReduce 프레임워크 배포 지원은 현재 작업을 제출하고 조회하는 데 사용되는 작업 클라이언트 코드를 다루지 않아요. 각 NodeManager 내에서 보조 서비스로 실행되는 ShuffleHandler 코드도 다루지 않아요. 그 결과 다음 제한 사항이 롤링 업그레이드 방식으로 분산 캐시를 통해 성공적으로 배포될 수 있는 MapReduce 버전에 적용돼요:

  • MapReduce 버전은 작업을 제출하고 조회하는 데 사용되는 작업 클라이언트 코드와 호환되어야 해요. 호환되지 않으면 새 MapReduce 버전을 사용하는 작업이 제출·조회될 노드에서 작업 클라이언트를 별도로 업그레이드해야 해요.
  • MapReduce 버전은 작업을 제출하는 작업 클라이언트가 사용하는 구성 파일과 호환되어야 해요. 그 구성과 호환되지 않으면(예: 새 속성을 설정해야 하거나 기존 속성 값을 변경해야 하는 경우) 먼저 구성을 업데이트해야 해요.
  • MapReduce 버전은 클러스터 노드에서 실행 중인 ShuffleHandler 버전과 호환되어야 해요. 호환되지 않으면 새 ShuffleHandler 코드를 클러스터의 모든 노드에 배포하고, 새 ShuffleHandler 코드를 적용하려면 NodeManager를 다시 시작해야 해요.

분산 캐시를 통한 새 MapReduce 버전 배포 (Deploying a New MapReduce Version via the Distributed Cache)

새 MapReduce 버전을 배포하는 것은 세 단계로 구성돼요:

  1. MapReduce archive 업로드: 작업 제출 클라이언트가 접근할 수 있는 위치에 MapReduce archive를 업로드해요. 이상적으로는 archive가 클러스터의 기본 파일시스템의 공개적으로 읽을 수 있는 경로에 있어야 해요. 자세한 내용은 아래의 archive 위치 논의를 참고하세요. 이 단계를 수행하려면 framework uploader 도구를 사용할 수 있어요:

    mapred frameworkuploader -target hdfs:///mapred/framework/hadoop-mapreduce-3.5.0.tar#mrframework
    

    클래스패스에 있는 jar 파일들을 선택해 -target과 -fs 옵션이 지정하는 tar archive에 넣어요. 그러면 도구는 mapreduce.application.framework.path와 mapreduce.application.classpath를 어떻게 설정할지 제안을 반환해요.

    • -fs: 타깃 파일시스템. fs.defaultFS가 설정하는 기본 파일시스템으로 기본값이 정해져요.
    • -target: 프레임워크 tarball의 타깃 위치. 선택적으로 # 뒤에 로컬화된 별칭이 올 수 있어요.

    그런 다음 tar를 지정된 디렉터리에 업로드해요. jar 파일들이 이미 압축되어 있으므로 gzip은 필요 없어요. 클러스터 보안을 보호하기 위해 타깃 디렉터리는 모든 사용자가 읽을 수 있지만 관리자 외에는 쓸 수 없도록 해야 해요.

  2. mapreduce.application.framework.path 구성: archive가 위치한 곳을 가리키도록 mapreduce.application.framework.path를 구성해요. 작업의 분산 캐시 파일을 지정할 때와 마찬가지로, 이 값은 URL이며 URL 프래그먼트를 지정하면 archive의 별칭 생성도 지원해요. 예를 들어 hdfs:///mapred/framework/hadoop-mapreduce-3.5.0.tar.gz#mrframework는 hadoop-mapreduce-3.5.0.tar.gz가 아니라 mrframework로 로컬화돼요.

  3. mapreduce.application.classpath 구성: 위에서 구성한 MapReduce archive와 함께 사용할 올바른 클래스패스를 설정하도록 mapreduce.application.classpath를 구성해요. frameworkuploader 도구를 사용하면 모든 의존성을 업로드하고 여기에 구성할 값도 반환해요.

참고: mapreduce.application.framework.path는 구성됐지만 mapreduce.application.classpath는 설정되지 않은 경우 오류가 발생해요.

MapReduce Archives와 클래스패스 구성 (MapReduce Archives and Classpath Configuration)

MapReduce archive에 대한 올바른 클래스패스 설정은 archive의 구성과 추가 의존성이 있는지에 따라 달라져요. 예를 들어 archive는 MapReduce jar뿐만 아니라 필요한 YARN, HDFS, Hadoop Common jar와 기타 모든 의존성을 포함할 수 있어요. 그 경우 mapreduce.application.classpath는 다음 예시처럼 구성되며, archive 기본 이름은 hadoop-mapreduce-3.5.0.tar.gz이고 archive는 표준 Hadoop 배포판 archive와 유사하게 내부적으로 구성돼요:

$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/mapreduce/lib/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/common/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/common/lib/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/yarn/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/yarn/lib/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/hdfs/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/hdfs/lib/*

또 다른 접근 방식은 archive가 MapReduce jar만으로 구성되고 나머지 의존성은 노드에 설치된 Hadoop 배포판에서 가져오는 것이에요. 그 경우 위 예시는 다음과 같이 바뀌어요:

$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-3.5.0.tar.gz/hadoop-mapreduce-3.5.0/share/hadoop/mapreduce/lib/*,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*

frameworkuploader 도구에는 여러 옵션이 있어요.

SSL 구성 이슈 (SSL configuration issue)

다음 오류가 발생할 수 있어요:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:81)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:61)
    at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:584)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1193)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
    at org.apache.hadoop.mapreduce.task.reduce.Fetcher.verifyConnection(Fetcher.java:427)
....

이것은 (HDFS에서 배포된) MR 클라이언트가 $HADOOP_CONF_DIR 디렉터리의 로컬 FS에 있는 ssl-client.xml에 접근할 수 없기 때문이에요. 문제를 해결하려면 위에서 언급한 것처럼 mapreduce.application.classpath에 ssl-client.xml이 있는 디렉터리를 MR의 클래스패스에 추가할 수 있어요. MR 애플리케이션이 다른 로컬 구성의 영향을 받지 않도록 ssl-client.xml을 넣을 전용 디렉터리(예: $HADOOP_CONF_DIR의 하위 디렉터리 $HADOOP_CONF_DIR/security)를 만드는 것이 좋아요.

framework uploader 도구 로그 (Framework uploader logs)

framework upload 도구를 사용해 MapReduce AM, mapper, reducer가 사용할 클러스터 jar를 수집할 수 있어요. 제안된 구성 값을 제공하는 로그를 반환해요:

INFO uploader.FrameworkUploader: Uploaded hdfs://mynamenode/mapred/framework/mr-framework.tar#mr-framework
INFO uploader.FrameworkUploader: Suggested mapreduce.application.classpath $PWD/mr-framework/*

mapreduce.application.framework.path를 첫 번째 값으로, mapreduce.application.classpath를 두 번째 로그 값으로 각각 설정해요.

더 알아보기 (Learn more)