리소스 추정기 서비스

리소스 추정기 서비스 (Resource Estimator Service)

반복 작업(recurring job)의 자원 요구사항을 작업의 과거 실행 기록에 기반해 자동으로 추정하는 Resource Estimator Service를 설명하는 문서예요. 아키텍처, 사용법, 예시, 고급 구성, 향후 작업을 다룹니다.

출처: 문서

본문

개요 (Overview)

동기 (Motivation)

작업 자원 요구사항 추정은 엔터프라이즈 클러스터에서 여전히 중요하고 어려운 문제입니다. 워크로드의 복잡성이 계속 증가하면서(전통적인 배치 작업부터 대화형 쿼리, 스트리밍, 최근에는 머신러닝 작업까지) 이 문제는 더 커집니다. 이로 인해 작업이 Tez, MapReduce, Spark 등 여러 컴퓨팅 프레임워크에 의존하게 되고, 클러스터의 공유 특성 때문에 문제는 더 복잡해집니다. 현재 최첨단 해결책은 사용자 전문성에 의존해 작업 자원 요구사항(예: 리듀서 수나 컨테이너 메모리 크기)을 추정하는데, 이는 지루하고 비효율적이에요.

클러스터 워크로드 분석에 따르면 상당 부분의 작업(60% 이상)이 반복 작업입니다. 이는 작업의 과거 실행 기록에 기반해 자원 요구사항을 자동으로 추정할 기회를 줍니다. 작업은 보통 서로 다른 컴퓨팅 프레임워크에서 오고, 실행마다 버전이 바뀔 수도 있다는 점을 주목할 만해요. 따라서 프레임워크에 구애받지 않는 블랙박스 해결책을 만들어 반복 작업의 자원 요구사항을 자동으로 추정하고자 합니다.

목표 (Goals)

  • 주기적 작업에 대해 기록 로그를 분석하고 새 실행의 자원 요구사항을 예측합니다.
  • 다양한 유형의 작업 로그를 지원합니다.
  • 테라바이트 단위의 작업 로그로 확장됩니다.

아키텍처 (Architecture)

다음 그림은 리소스 추정기의 구현 아키텍처를 보여줍니다.

Hadoop-resourceestimator는 주로 Translator, SkylineStore, Estimator의 세 모듈로 구성됩니다.

  1. ResourceSkyline — 작업 수명 동안의 자원 사용을 특성화하는 데 사용. 구체적으로 RLESparseResourceAllocation(https://github.com/apache/hadoop/blob/b6e7d1369690eaf50ce9ea7968f91a72ecb74de0/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/RLESparseResourceAllocation.java)으로 컨테이너 할당 정보를 기록. RecurrenceId는 반복 파이프라인의 특정 실행을 식별하는 데 사용. 파이프라인은 여러 작업으로 구성될 수 있으며, 각 작업은 자원 사용을 특성화하는 ResourceSkyline을 가짐.

  2. Translator — 작업 로그를 파싱해 ResourceSkylines을 추출하고 이를 SkylineStore에 저장. SingleLineParser는 로그 스트림의 한 줄을 파싱해 ResourceSkyline을 추출. LogParser는 SingleLineParser로 로그 스트림의 각 줄을 재귀적으로 파싱. 로그는 서로 다른 저장 형식을 가질 수 있으므로 LogParser는 File이나 다른 형식 대신 문자열 스트림을 입력으로 받음. 작업 로그가 다양한 형식을 가질 수 있어 서로 다른 SingleLineParser 구현이 필요하므로, LogParser는 사용자 구성에 따라 SingleLineParser를 초기화. 현재 Hadoop-resourceestimator는 SingleLineParser의 두 구현을 제공: NativeSingleLineParser(최적화된 네이티브 형식 지원), RMSingleLineParser(Hadoop 시스템에서 생성된 YARN ResourceManager 로그 파싱 — RM 로그는 프로덕션 배포에서 널리 사용 가능).

  3. SkylineStore — Hadoop-resourceestimator의 저장 계층 역할을 하며 2개 부분으로 구성. HistorySkylineStore는 Translator가 추출한 ResourceSkylines을 저장. addHistory, deleteHistory, updateHistory, getHistory의 네 가지 동작 지원. addHistory는 반복 파이프라인에 새 ResourceSkylines을 추가하고, updateHistory는 특정 반복 파이프라인의 모든 ResourceSkylines을 삭제한 뒤 새 ResourceSkylines을 다시 삽입. PredictionSkylineStore는 Estimator가 생성한 예측 RLESparseResourceAllocation을 저장. addEstimation과 getEstimation의 두 가지 동작 지원.

    현재 Hadoop-resourceestimator는 SkylineStore의 인메모리 구현을 제공합니다.

  4. Estimator — 과거 실행에 기반해 반복 파이프라인의 자원 요구사항을 예측하고, 예측을 SkylineStore에 저장하며 YARN에 반복 자원 예약을 합니다(YARN-5326). Solver는 특정 반복 파이프라인의 모든 기록 ResourceSkylines을 읽고 RLESparseResourceAllocation에 담긴 새 자원 요구사항을 예측. 현재 Hadoop-resourceestimator는 예측을 위해 LPSOLVER를 제공합니다(Linear Programming 모델의 세부 사항은 논문에서 볼 수 있음). 또한 예측된 자원 요구사항을 ReservationSubmissionRequest로 변환하는 BaseSolver도 있는데, 이는 서로 다른 solver 구현이 YARN에 반복 자원 예약을 하는 데 사용합니다.

  5. ResourceEstimationService — Hadoop-resourceestimator를 클러스터에 쉽게 배포할 수 있는 마이크로서비스로 감쌉니다. REST API 집합을 제공해 사용자가 지정된 작업 로그를 파싱하고, 파이프라인의 기록 ResourceSkylines을 조회하고, 파이프라인의 예측 자원 요구사항을 조회하며, 예측이 없을 때 SOLVER를 실행하고, SkylineStore의 ResourceSkylines을 삭제할 수 있게 합니다.

사용법 (Usage)

이 절은 resource estimator service 사용법을 안내합니다.

여기서 $HADOOP_ROOT가 Hadoop 설치 디렉터리를 나타낸다고 합시다. Hadoop을 직접 빌드했다면 $HADOOP_ROOT는 hadoop-dist/target/hadoop-$VERSION입니다. resource estimator service의 위치 $ResourceEstimatorServiceHome는 $HADOOP_ROOT/share/hadoop/tools/resourceestimator입니다. 여기에는 bin, conf, data의 3개 폴더가 있습니다. 사용자는 기본 구성을 사용해 resource estimator service를 사용할 수 있습니다.

  • bin — resource estimator service의 실행 스크립트.
  • conf — resource estimator service의 구성 파일.
  • data — resource estimator service 예제 실행에 사용되는 샘플 로그.

Step 1: 추정기 시작

먼저 구성 파일($ResourceEstimatorServiceHome/conf/에 있음)을 $HADOOP_ROOT/etc/hadoop에 복사합니다.

추정기를 시작하는 스크립트는 start-estimator.sh입니다.

$ cd $ResourceEstimatorServiceHome
$ bin/start-estimator.sh

웹 서버가 시작되고, 사용자는 REST API로 resource estimation service를 사용할 수 있습니다.

Step 2: 추정기 실행

resource estimator service의 URI는 http://0.0.0.0이고 기본 서비스 포트는 9998입니다($ResourceEstimatorServiceHome/conf/resourceestimator-config.xml에 구성). $ResourceEstimatorServiceHome/data에는 tpch_q12 쿼리 작업의 2회 실행 로그가 담긴 샘플 로그 파일 resourceEstimatorService.txt가 있습니다.

  • 작업 로그 파싱: POST http://URI:port/resourceestimator/translator/LOG_FILE_DIRECTORY

POST http://0.0.0.0:9998/resourceestimator/translator/data/resourceEstimatorService.txt를 보냅니다. 내부 추정기가 로그 파일에서 ResourceSkylines을 추출해 jobHistory SkylineStore에 저장합니다.

  • 작업의 기록 ResourceSkylines 조회: GET http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}

GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*를 보내면 내부 추정기가 history SkylineStore의 모든 레코드를 반환합니다. tpch_q12의 두 실행(tpch_q12_0과 tpch_q12_1)에 대한 ResourceSkylines가 보여야 합니다. pipelineId와 runId 필드 모두 와일드카드 연산을 지원합니다.

  • 작업의 리소스 스카이라인 요구사항 예측: GET http://URI:port/resourceestimator/estimator/{pipelineId}

http://0.0.0.0:9998/resourceestimator/estimator/tpch_q12를 보내면 내부 추정기가 기록 ResourceSkylines에 기반해 새 실행의 자원 요구사항을 예측하고, 예측 자원 요구사항을 jobEstimation SkylineStore에 저장합니다.

  • 작업의 추정 리소스 스카이라인 조회: GET http://URI:port/resourceestimator/skylinestore/estimation/{pipelineId}

http://0.0.0.0:9998/resourceestimator/skylinestore/estimation/tpch_q12를 보내면 내부 추정기가 tpch_q12 작업의 기록 자원 요구사항 추정을 반환합니다. jobEstimation SkylineStore는 와일드카드 연산을 지원하지 않습니다.

  • 작업의 기록 리소스 스카이라인 삭제: DELETE http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}

http://0.0.0.0:9998/resourceestimator/skylinestore/history/tpch_q12/tpch_q12_0을 보내면 내부 추정기가 tpch_q12_0의 ResourceSkyline 레코드를 삭제합니다. GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*를 다시 보내면 내부 추정기가 tpch_q12_1의 ResourceSkyline만 반환합니다.

Step 3: 추정기 중지

추정기를 중지하는 스크립트는 stop-estimator.sh입니다.

$ cd $ResourceEstimatorServiceHome
$ bin/stop-estimator.sh

예시 (Example)

여기서 Resource Estimator Service 사용 예시를 제시합니다.

먼저 tpch_q12 작업을 9번 실행하고 각 실행에서 작업의 리소스 스카이라인을 수집합니다(이 예시에서는 "# of allocated containers" 정보만 수집한다는 점에 유의).

그런 다음 Resource Estimator Service에서 로그 파서를 실행해 로그에서 ResourceSkylines을 추출하고 SkylineStore에 저장합니다. 작업의 ResourceSkylines이 아래에 플롯됩니다.

마지막으로 Resource Estimator Service에서 추정기를 실행해 새 실행의 리소스 요구사항을 예측하며, 이는 RLESparseResourceAllocation(https://github.com/apache/hadoop/blob/b6e7d1369690eaf50ce9ea7968f91a72ecb74de0/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/reservation/RLESparseResourceAllocation.java)에 담겨 있습니다. 예측 리소스 요구사항이 아래에 플롯됩니다.

고급 구성 (Advanced Configuration)

이 절은 Resource Estimator Service의 구성을 안내합니다. 구성 파일은 $ResourceEstimatorServiceHome/conf/resourceestimator-config.xml에 있습니다.

  • resourceestimator.solver.lp.alpha — 리소스 추정기는 예측을 위한 통합 Linear Programming 솔버를 가집니다(https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/osdi16-final107.pdf 참고). 이 파라미터는 Linear Programming 모델에서 자원 과잉 할당과 과소 할당 사이의 트레이드오프를 조정합니다. 0부터 1까지 변하며, alpha 값이 클수록 모델이 과잉 할당을 더 잘 최소화합니다. 기본값 0.1.
  • resourceestimator.solver.lp.beta — 이 파라미터는 Linear Programming 모델의 일반화를 제어. 0부터 1까지 변함. 기본값 0.1.
  • resourceestimator.solver.lp.minJobRuns — 예측을 하기 위해 필요한 최소 작업 실행 수. 기본값 2.
  • resourceestimator.timeInterval — 작업 실행을 구간으로 이산화하는 데 사용하는 시간 길이. 추정기는 각 구간에 대해 자원 할당 예측을 합니다. 더 작은 시간 간격은 예측 세분화가 더 정밀하지만, 예측에 더 오래 걸리고 더 많은 공간을 차지합니다. 기본값 5(초).
  • resourceestimator.skylinestore.provider — skylinestore 프로바이더의 클래스 이름. 기본값 org.apache.hadoop.resourceestimator.skylinestore.impl.InMemoryStore(skylinestore의 인메모리 구현). 사용자 정의 skylinestore 구현을 쓰려면 이 값을 그에 맞게 바꿔야 함.
  • resourceestimator.translator.provider — translator 프로바이더의 클래스 이름. 기본값 org.apache.hadoop.resourceestimator.translator.impl.BaseLogParser(로그 스트림에서 resourceskylines 추출). 사용자 정의 translator 구현을 쓰려면 이 값을 그에 맞게 바꿔야 함.
  • resourceestimator.translator.line-parser — 로그의 한 줄을 파싱하는 translator 단일 라인 파서의 클래스 이름. 기본값 org.apache.hadoop.resourceestimator.translator.impl.NativeSingleLineParser(샘플 로그의 한 줄 파싱 가능). Hadoop Resource Manager(https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html) 로그를 파싱하려면 값을 org.apache.hadoop.resourceestimator.translator.impl.RmSingleLineParser로 설정해야 함. 사용자 정의 로그 파일을 파싱하는 단일 라인 파서를 구현하려면 이 값을 그에 맞게 바꿔야 함.
  • resourceestimator.solver.provider — solver 프로바이더의 클래스 이름. 기본값 org.apache.hadoop.resourceestimator.solver.impl.LpSolver(예측을 위해 Linear Programming 모델 통합). 사용자 정의 모델을 구현하려면 이 값을 그에 맞게 바꿔야 함.
  • resourceestimator.service-port — ResourceEstimatorService가 수신하는 포트. 기본값 9998.

향후 작업 (Future work)

  1. SkylineStore에 대해 영속 스토어 구현을 제공할 계획. HBase를 고려 중.
  2. Translator 모듈에 대해 안정적인 API에 의존하고 로그가 신뢰할 수 없으므로 Timeline Service v2를 기본 소스로 지원하려 함.
  3. 작업 자원 요구사항은 skewness, 경쟁, 입력 데이터나 코드 변경 등으로 실행마다 다를 수 있음. 런타임에 작업 진행을 동적으로 모니터링하고, 진행이 예상보다 느리면 성능 병목을 식별하며, ReservationUpdateRequest로 작업의 자원 할당을 동적으로 조정하는 Reprovisioner 모듈을 설계하려 함.
  4. Estimator가 작업 자원 요구사항을 예측할 때 추정 오류(과잉 할당과 과소 할당의 조합)에 따라 예측과 연관된 신뢰 수준을 제공하려 함.
  5. Estimator 모듈에 강화 학습 같은 머신러닝 도구를 통합해 더 나은 예측을 할 수 있음. PerfOrator 같은 도메인 특정 솔버와도 통합해 예측 품질을 개선할 수 있음.
  6. Estimator 모듈에 새 로그만 기반으로 작업 자원 요구사항을 점진적으로 갱신하는 증가형(incremental) solver를 설계하려 함.

더 알아보기 (Learn more)