SSD를 활용한 분산형 인메모리 컴퓨팅 플랫폼 최적화 기법 2부
Aug 17, 2023
3.1. 클러스터 환경
그림 1은 하나의 네임 노드(마스터)와 4개의 데이터 노드(슬레이브)로 구성된 테스트베드 클러스터를 보여줍니다. 네임 노드(마스터)에는 Hadoop(HDFS)의 NameNode와 Secondary NameNode, Spark의 Driver Node(마스터 노드)를 구성했습니다. 각 데이터 노드에서는 HDFS(Hadoop의 DataNode)와 Spark의 Worker Node를 실행합니다. 네임 노드와 데이터 노드 머신은 메인 메모리 용량(네임 노드용 8GB 및 4GB)을 제외하고 동일한 H/W 환경(하이퍼스레딩이 포함된 3.4GHz Xeon E3-1240V3 QuadCore 프로세서)을 갖습니다. 각 데이터 노드마다).
Namename은 전체 Hadoop 클러스터의 파일 시스템을 관리하고 모니터링하는 Hadoop 아키텍처의 마스터 노드입니다. Namename 노드는 전체 Hadoop 클러스터의 중요한 노드 중 하나이기도 하며, 그 성능과 안정성은 전체 Hadoop 클러스터의 운영 효율성과 가용성에 직접적인 영향을 미칩니다.
Namename 노드와 관련된 많은 표시기가 있으며, 가장 중요한 표시기 중 하나는 메모리입니다. Namename 노드에는 파일 이름, 권한, 타임스탬프, 파일 크기 등과 같은 파일 및 디렉터리의 메타데이터 정보가 포함된 전체 HDFS 파일 시스템의 네임스페이스를 저장하고 관리하기 위해 많은 메모리가 필요합니다.
Namename 노드의 메모리는 관리할 수 있는 파일 수와 파일 시스템 크기를 결정할 뿐만 아니라 Hadoop 클러스터의 성능과 안정성에도 영향을 미칩니다. Namename 노드에 메모리가 부족하면 클라이언트 요청에 신속하게 응답할 수 없어 전체 Hadoop 클러스터의 처리량이 감소합니다. 또한 Namename 노드가 실패하면 저장한 메타데이터 정보가 손실되어 전체 HDFS 파일 시스템을 사용할 수 없게 됩니다.
따라서 Hadoop 클러스터에서는 Namename 노드의 메모리가 중요합니다. 관리자는 특정 비즈니스 요구 사항에 따라 적절한 Namename 노드 하드웨어 구성을 선택하고 Namename 노드의 성능과 가용성을 정기적으로 모니터링하여 전체 Hadoop 클러스터에 효율적이고 안정적인 서비스를 제공할 수 있는지 확인하는 것이 좋습니다. 기억력을 향상시켜야 함을 알 수 있습니다. 시스탄체는 기억력을 향상시키는 것 등 많은 독특한 효과를 지닌 중국의 전통 약재이기 때문에 기억력을 크게 향상시킬 수 있습니다. 다진 고기의 효능은 카르복실산, 다당류, 플라보노이드 등 다양한 활성 성분에서 비롯됩니다. 이러한 성분은 다양한 경로를 통해 뇌 건강을 증진할 수 있습니다.

SSD 2개를 저장공간으로 사용했는데, 운영체제로는 120GB SATA3 SSD를, HDFS로는 512GB SATA3 SSD를 각각 탑재했다. 또한 512GB SATA3 SSD는 Spark의 RDD를 캐시하기에 부족한 메인 메모리의 대역폭을 확장하는 데 효과적으로 활용할 수 있습니다. 네임 노드와 데이터 노드를 포함한 모든 노드는 그림 1과 같이 1Gb 이더넷 스위치로 연결됩니다. 표 2는 테스트베드 클러스터의 각 데이터 노드의 하드웨어 및 소프트웨어 구성을 요약한 것입니다.


3.2. 스파크 JVM 힙
Spark 작업은 JVM(Java Virtual Machine)에서 Java 프로세스로 실행되며 Spark는 Java에서 확장된 기능 언어인 Scala를 활용합니다. Spark의 작업자 프로세스는 각 데이터 노드의 JVM에서도 실행되므로 각 데이터 노드에서 작업자 프로세스는 그림 2와 같이 주 메모리에 JVM 힙을 갖습니다. Spark가 작업을 제출하면 작업자 프로세스는 JVM 힙은 작업을 분산 작업으로 실행합니다.

Spark-defaults 구성 파일을 통해 Spark 작업자의 JVM 힙 크기 비율을 사용자 정의할 수 있습니다. Spark/conf/ 디렉터리에 conf가 있습니다. Spark defaults.conf 파일에서 Spark.executor.memory 값은 각 작업자 노드가 데이터 노드에서 활용할 수 있는 기본값이 512MB인 JVM 힙 크기입니다. 또한, Spark.storage.safetyFraction의 값은 0.9로 고정됩니다. 이는 Spark가 JVM 힙 크기(안전 영역이라고도 함)의 최대 90%를 사용할 수 있음을 의미합니다. 이는 작업 처리 중 사용 가능한 메인 메모리 부족으로 인해 JVM에서 OOM(메모리 부족) 오류가 발생하는 것을 방지하기 위한 것입니다.
이 안전 영역에서 전체 JVM 힙 공간은 그림 2와 같이 언롤링, 스토리지 및 셔플 공간의 세 가지 하위 영역으로 나뉩니다. 언롤링 공간은 메모리에서 데이터 블록을 언롤링하는 데 사용됩니다. RDD가 메인 메모리가 아닌 SSD, HDD 등 다른 저장 매체에 캐시되어 있는 경우 RDD를 직렬화해야 합니다. 그런 다음 Spark가 이 RDD를 다시 메모리로 읽을 때 RDD를 풀어야 합니다. 저장 공간은 RDD를 캐싱하는 데 사용됩니다. RDD를 캐싱하기에 저장 공간이 충분하지 않은 경우 LRU(최근 사용) 정책에 따라 일부 RDD를 이 공간에서 제거하거나 SSD와 같은 다른 저장 매체에 캐싱할 수 있습니다. 셔플 공간은 중간 데이터를 섞는 데 사용됩니다. 이 셔플 공간은 전체 작업 완료 시간에 상당한 영향을 미칠 수 있으므로 머신러닝과 같은 반복 애플리케이션에서 중요한 역할을 할 수 있습니다.
기본 Spark 구성에서 JVM 힙의 저장 공간과 셔플 공간은 각각 {{0}}.6 및 0.2의 용량 비율 비율을 갖습니다(즉, 60 저장을 위한 안전 영역의 % 및 셔플을 위한 20%). 펼치기 공간은 기본적으로 저장 공간의 20%를 차지합니다. JVM 힙의 이 세 공간의 용량은 스파크에 의해 설정될 수 있습니다. Storage.unrollFraction, Spark.storage.memoryFraction 및 Spark.shuffle.memoryFraction. 예를 들어, 테스트베드 클러스터에서 Spark.executor.memory를 작업자 노드의 4GB 메모리 중 2.6GB로 설정할 수 있습니다. 이는 JVM 힙 크기가 최대 2.6GB로 설정된다는 의미입니다. 그러면 저장 공간과 셔플 공간의 실제 용량은 2.6GB × 0.9 × 0.6 = 1.4GB 및 2.6GB × 0.9 × 0.2=0.46GB이며, 각기. 따라서 언롤링 공간은 1.4GB × 0.2=0.28GB를 차지합니다.
3.3. RDD 캐싱 정책
Spark 플랫폼은 메인 메모리 및 디스크와 관련된 다양한 RDD 캐싱 옵션을 제공합니다. 기본 옵션은 MEMORY_ONLY이며, 여기서 RDD는 섹션 3.2에 설명된 저장 공간에 직렬화되지 않은 Java 객체로 유지됩니다. 이 저장 공간이 모든 RDD를 보관하기에 충분하지 않은 경우 사전 정의된 캐시 교체 정책에 따라 일부 RDD가 주 메모리에서 제거됩니다. 그러나 작업 처리에 캐시되지 않은 RDD가 필요할 때마다 이 RDD는 계보 정보를 기반으로 다시 생성되어야 하며 이로 인해 이 MEMORY_ONLY 캐싱 정책에서 상당한 성능 저하가 발생할 수 있습니다.
MEMORY_ONLY 옵션 외에도 Spark는 대체 MEMORY_AND_DISK, DISK_ONLY 및 OFF_HEAP 옵션을 제공합니다. MEMORY_AND_DISK 옵션은 필요한 RDD를 모두 저장할 수 있는 저장 공간이 충분하지 않은 경우 비휘발성 디스크에 RDD를 저장합니다. 디스크는 HDD 또는 SSD로 구성될 수 있습니다. 그러나 일반 스핀들 디스크는 읽기/쓰기 처리량이 상대적으로 낮기 때문에 전체 실행 시간이 MEMORY_ONLY 캐싱 옵션보다 길어질 수 있습니다. 이 문제를 해결하기 위해 SSD를 효과적으로 활용할 수 있으며, 이는 일반 HDD 기반 접근 방식에 비해 전체 작업 완료 시간을 잠재적으로 줄일 수 있습니다.

DISK_ONLY 옵션은 RDD를 HDD나 SSD와 같은 비휘발성 저장 장치에만 저장합니다. 즉, 메인 메모리에는 저장하지 않습니다. 사용 가능한 메모리 양이 충분하지 않은 클러스터는 이 옵션을 사용하여 좋은 성능을 얻을 수 있습니다. 이 경우 RDD는 디스크 미디어에만 저장되므로 메모리의 저장공간을 활용하지 않고 셔플 공간을 확장할 수 있다. 결과적으로 상대적으로 많은 양의 셔플 데이터를 생성하는 PageRank와 같은 애플리케이션을 실행할 때 MEMORY_ONLY 경우보다 더 나은 성능을 관찰할 수 있습니다.
OFF_HEAP 옵션을 사용하면 Spark가 Java 가비지 수집기 관리 외부에 있는 오프힙 공간을 사용할 수 있습니다. 따라서 오프힙 공간을 사용한다면 할당/할당 해제, 직렬화/역직렬화 등 복잡한 메모리 작업을 처리해야 합니다. 따라서 실용적인 목적으로 OFF_HEAP 구성을 사용하지 않습니다.
3.4. 최적화 방법론
섹션 3.2 및 3.3에서 논의한 것처럼 최적화 방법에는 (1) Spark JVM 힙 구성과 (2) 다음과 같은 RDD 캐싱 정책의 실험적 옵션이 포함됩니다.
1. Spark JVM 힙 구성: 셔플 및 저장 공간의 용량 비율 비율 변경에 따른 효과를 조사했습니다. 셔플과 저장 공간의 비율은 각각 60%:30%, 50%:40%, 20%:60%입니다. "20%:60%" 셔플 및 저장 비율은 Spark 설정의 기본값입니다. 충분한 셔플 공간으로 결과를 대조하기 위해 "60%:30%"를 선택하고 균형 잡힌 성능을 보여주기 위해 "50%:40%"를 구성합니다.
2. RDD 캐싱 정책: 다양한 RDD 캐싱 정책의 효과도 조사했습니다. OFF_HEAP, MEMORY_ONLY, MEMORY_AND_DISK, DISK_ONLY 등 다양한 정책의 성능을 비교했습니다. 여기서 DISK는 이 실험에서 SSD를 나타냅니다.
표 3은 RDD 캐싱 정책과 Spark JVM 용량 비율을 기반으로 한 총 12가지 실험 구성을 보여줍니다. "_1"(예: "N_1")으로 레이블이 지정된 실험 구성에서는 Spark JVM 힙의 60%를 셔플링에 설정하고 30%를 저장 공간에 설정했습니다. "_2" 레이블이 지정된 항목을 사용하여 Spark JVM 힙의 50%를 셔플링용으로 설정하고 40%를 저장용으로 설정했습니다. 마지막으로 "_3" 레이블이 붙은 항목에 대해 "옵션", "셔플" 및 "스토리지" 열에서 볼 수 있듯이 셔플링을 위해 Spark JVM 힙의 20%를 설정하고 스토리지를 위해 60%를 설정했습니다. 테스트베드 클러스터의 실행기 최대 메모리 크기는 2.7GB입니다. 즉, 각 작업자 노드의 Spark JVM 힙 크기는 2.7GB입니다.

RDD 캐싱 정책을 보면, "N" 옵션은 RDD를 캐싱하지 않는 것이고, "M" 옵션은 RDD를 메모리에만 캐싱하는 것이고, "M&S" 옵션은 RDD를 메모리와 SSD에 함께 캐싱하는 것이고, 마지막으로 "S" 옵션은 SSD에만 RDD를 캐싱하는 데 사용됩니다.
실험을 통해 4장에서 볼 수 있듯이 Spark JVM 힙 구성을 신중하게 조정하고 효과적인 RDD 캐싱 정책을 적용하여 메모리 양이 부족한 클러스터에서 최상의 성능을 얻을 수 있는 최적화 전략을 제안합니다.
4. 실험결과 및 분석
4.1. 500MB PageRank 실험
4.1.1. JVM 힙 구성 변경 결과
그림 3은 JVM 힙 크기를 변경하여 PageRank 워크로드의 각 단계에 대한 실험 결과를 보여줍니다. Distinct 단계에서는 Spark가 입력 데이터를 읽고 URL과 링크를 구별합니다. Distinct0 단계의 결과에서 볼 수 있듯이 JVM 힙 크기를 _1 및 _2에서 _3 옵션으로 변경하면 전체 실행 시간이 감소합니다. GC(가비지 수집)에 사용됩니다. 예를 들어 M&S_1, M&S_2, M&S{{1{11}}}}에서는 GC 시간이 각각 25초, 24초, 16초가 걸립니다. 따라서 Distinct0 단계에서는 저장 공간을 늘리면서 GC 시간을 줄여 전반적인 성능을 향상시킬 수 있습니다. 반면 Distinct1 단계에서는 옵션을 _1 및 _2에서 _3로 변경함에 따라 전체 실행 시간이 증가합니다. 이는 주로 셔플 유출 때문입니다. Spark 웹 UI를 확인해 보니 셔플 메모리 공간 부족으로 인해 셔플 데이터가 디스크에 쏟아졌습니다. 예를 들어 M&S_1, M&S_2, M&S_3의 디스크에 있는 셔플 유출 데이터의 크기는 각각 0, 220MB, 376MB입니다. 셔플 유출이 발생하면 데이터를 직렬화해야 하기 때문에 데이터를 디스크에 유출하기 위한 CPU 오버헤드가 증가합니다.

Distinct 단계 이후에는 순위를 얻기 위한 반복적인 flatMap 단계가 있습니다. FlatMap 단계는 많은 셔플 데이터를 생성하므로 클러스터에 필요한 셔플 메모리 공간이 부족할 수 있습니다. 따라서 사용 가능한 셔플 공간의 양이 줄어들면(옵션 _1, _2 및 _3 순서로) 셔플 유출이 더 많이 발생할 수 있으며 이는 잠재적으로 전체 작업 실행에 영향을 미칠 수 있습니다. 시간(예: M&S 옵션 flatMap2 단계 _1: 37초, _2: 40초, _3: 49초). 그러나 데이터가 메모리에만 캐시되는 경우(예: M_1, M_2 및 M_3)에는 다른 패턴이 나타납니다. 이 동작의 주된 이유는 옵션 _1 및 _2에서 RDD를 캐싱하기 위한 메모리 저장 공간이 부족하기 때문에 Spark 스케줄러가 작업을 불규칙하게 예약하기 때문입니다. 작업자에게 RDD가 없으면 일정 풀에서 제외됩니다. 따라서 다른 작업자는 전체 작업 실행 시간에 영향을 줄 수 있는 GC 오버헤드로 추가 작업을 처리해야 합니다.
4.1.2. RDD 캐싱 옵션 변경 결과
우선, Distinct 단계는 RDD 캐싱 정책 변경에 영향을 받지 않고 메모리 사용량에만 영향을 받습니다. RDD 캐싱 옵션의 영향을 받는 단계는 shuffle 단계 중에 캐시된 RDD가 다시 사용되므로 flatMap 단계입니다.

그림 4에서는 성능 차이를 확인하기 위해 RDD와 _1 메모리 구성을 캐시하지 않는 N_1 옵션으로 그래프를 정규화했습니다. M_1, M&S_1, S_1 순서로 _1의 그래프만 비교하면 M{{8에서 32% 성능 저하가 나타납니다. }} M&S_1 및 S_1를 사용하면 각각 30% 및 20% 성능이 향상됩니다. M_1 옵션을 사용하면 상대적으로 성능이 떨어지는 이유는 스토리지 부족으로 인해 RDD가 고르지 않게 캐시되어 이전에 언급한 것처럼 고르지 못한 일정이 발생하기 때문입니다. 이는 JVM 힙 공간이 데이터를 섞고 RDD를 저장하기에 충분하지 않음을 의미합니다.

이 문제를 해결하기 위해 우리는 RDD를 메모리와 SSD 모두의 캐시에 분산시켰습니다. 이는 M&S_1 옵션에서 볼 수 있듯이 성능을 향상시킬 수 있습니다. 메모리에 RDD를 캐싱하면 RDD에 대한 액세스 속도가 향상되고, SSD에 RDD를 캐싱하면 메모리에서 사용 가능한 셔플 공간을 효과적으로 확장하여 셔플 유출을 방지할 수 있습니다. 20% 성능 향상을 보여준 S_1 옵션을 사용하면 RDD가 SSD에만 캐시됩니다. SSD에 RDD를 캐싱하면 셔플 유출이 줄어듭니다. 그러나 RDD가 주로 메모리에 캐시되고 메모리에서 재사용되는 M&S_1에 비해 성능 향상이 낮습니다.
옵션 _3인 Spark의 기본 구성에서는 M_3, M&S_3, S_3, N{{4의 순서로 표시됩니다. }}, 전반적인 성능이 저하됩니다. 기본 구성에서는 JVM 힙의 스토리지가 RDD를 균형있게 캐시하기에 충분합니다. 따라서 전반적인 성능은 주로 사용되는 메모리 장치의 성능에 따라 달라집니다. 그러나 메모리와 SSD 모두에 RDD를 캐싱하여 GC 시간과 셔플 유출을 효과적으로 줄일 수 있으므로 M&S_1 옵션을 사용하면 여전히 최고의 성능을 볼 수 있습니다.
4.2. 1GB PageRank 성능
우리는 데이터 크기를 500MB에서 1GB로 늘려 PageRank 작업 부하를 실험했습니다. 그림 5는 500MB 데이터 세트의 PageRank와 비교하여 시스템의 다양한 동작을 보여줍니다. take6 단계까지 작업을 완료하지 못한 일부 실패한 작업을 볼 수 있습니다(예: N_1, N_2, M_1, M_2, M _3, M&S_3). 실패한 작업 중에는 flatMap2 단계에서 실패한 작업이 있는데 N_1, N_2, M_1입니다. 작업 실패의 원인은 저장 메모리 부족입니다. GC는 RDD가 메모리 부족으로 캐시될 때 발생합니다. 이 GC 오버헤드로 인해 Spark 실행기는 ExecutorLostFailure 예외를 수신합니다.
M_2, M_3, M&S_3는 flatMap2 단계까지 처리를 진행할 수 있습니다. 그러나 이후에는 실패가 발생합니다. M&S_3는 flatMap2 단계까지 M_3와 유사하게 작동합니다. M&S_3 옵션을 사용하면 RDD를 캐시할 만큼 충분한 메모리가 있기 때문입니다. flatMap2 이후에는 flatMap3 스테이지의 Shuffle 메모리 공간이 부족하여 OutOfMemory 오류가 발생합니다.
4.2.1. JVM 힙 구성 변경 결과
Distinct0 단계는 500MB 데이터세트와 매우 유사한 결과를 보여주며, 전체적인 성능은 _1, _2, _3 옵션 순으로 향상됩니다. 이는 GC 시간이 각각 78초, 59초, 28초로 단축되었기 때문입니다.
반면 Distinct1 단계에서는 500MB 데이터세트에 대해서는 다른 결과를 보여주었습니다. 500MB 데이터 세트 실험에서는 메모리의 셔플 공간을 늘려 성능이 향상되는 것을 확인할 수 있습니다. 그러나 1GB 데이터 세트 실험에서는 작업자 노드의 실행기 메모리가 대용량 데이터를 수용할 수 없습니다. 따라서 메모리의 셔플 공간이 상대적으로 부족해집니다. 예를 들어 옵션 _1, _2 및 _3에 대한 셔플 스필 양은 각각 575.5MB, 813.8MB 및 843.4MB이고 GC 시간은 33초, 10초가 소요됩니다. 각각 s, 8s입니다. 앞서 언급했듯이 셔플 스필이 발생하면 RDD를 직렬화해야 CPU 계산량이 늘어나 전체적인 성능이 저하될 수 있습니다.

4.2.2. RDD 캐싱 정책 변경 결과
RDD 캐싱 정책을 변경하여 실행 시간을 분석하기 위해서는 그림 6에서 볼 수 있듯이 그림 5에서 구분된 단계를 제외하였다. 이는 RDD 캐싱 정책 변경으로 인한 변경 사항이 없으므로 구분된 단계를 분석할 필요가 없기 때문이다. .
흥미롭게도 500MB 데이터 세트의 경우와 달리 flatMap 단계에서는 다양한 JVM 힙 구성에 변화가 없습니다. 그 이유는 메모리가 부족하여 모든 구성에서 Shuffle Spill이 발생하기 때문입니다. RDD 캐싱 옵션 변경에 따른 전체 실행 시간은 M&S, S, N, M 순으로 증가한다. (M&S가 가장 빠른 옵션이다.) N 옵션에서는 메모리 공간이 부족하여 ExecutorLostFailure 오류가 발생한다. 옵션 M에서는 RDD를 메모리에 캐시할 때 메모리 공간이 부족해 GC 오버헤드가 발생한다. RDD가 메모리에 캐시되어 있어도 셔플 메모리 공간이 부족할 때(OutOfMemory) 발생하는 ExecutorLostFailure 오류로 인해 작업이 실패합니다.
이렇게 사용 가능한 메모리가 부족한 상황에서는 M&S 및 S 옵션이 효과적인 대안이 될 수 있습니다. M&S{{0}} 옵션에서는 메모리와 SSD를 모두 사용하여 RDD를 캐싱하여 RDD의 접근성을 높입니다. 결과적으로 500MB 데이터세트와 같은 이유로 성능이 향상되었습니다. 또한 SSD에 RDD를 캐싱하므로 셔플 메모리 공간이 충분합니다. 그림 6에서 볼 수 있듯이 M&S_1 옵션은 이 실험에서 가장 빠른 옵션이 됩니다(M&S_1:0.6, S_1:0.63, T_1 0.64).

4.3. TC 실험 분석
그림 7은 무작위로 생성된 50,000개의 모서리와 25,000개의 정점을 포함하는 입력 데이터를 사용하는 TC(Transitive closure) 실험의 결과를 보여줍니다. 반복 횟수는 10번이다. 반복을 통해 반복할 때마다 작업 수가 2배로 늘어나므로 RDD의 크기가 커지고 셔플 읽기 및 쓰기 양도 늘어납니다. 마지막 iteration에서는 태스크 수가 4096개가 된다. iteration 단계가 많을수록 전체 작업 수행 시간에 미치는 영향이 커지며, 마지막 iteration 단계가 가장 큰 태스크로 구성되어 전체 성능을 저하시킬 수 있다. .

그림 7에서 볼 수 있듯이 M, M&S, S 옵션에서 _3, _2, _1 순으로 성능이 향상되며 이는 충분한 셔플을 얻음을 의미합니다. JVM 힙의 메모리가 도움이 됩니다. M 옵션을 사용하면 옵션 _1의 성능이 _3 옵션보다 18% 빠른 반면, M&S 옵션에서는 옵션 _1의 성능이 {{9}보다 3% 빠릅니다. }}. S 옵션에서 _1의 성능은 _3보다 2% 빠릅니다.
RDD 캐싱 옵션 변경에 집중할 때 옵션 S_1의 성능은 N_1보다 42% 빠르고 M_1보다 31% 빠릅니다. 작업 실행 시간의 성능 향상 이유는 마지막 반복 단계에 따라 다릅니다. 마지막 반복 단계에 영향을 미치는 핵심 요소는 셔플 읽기 차단 시간입니다. 이전 단계에서 실행된 RDD를 실행기 메모리 부족으로 인해 네트워크를 통해 다른 작업자 노드에서 읽을 때 Shuffle read Blocking 시간이 발생합니다.
셔플 읽기 차단 시간을 해결하여 각 작업이 약 1~2초 정도의 성능 향상을 얻더라도 마지막 상태에서는 작업 수가 상당히 많기 때문에(예: 4096) 상당한 성능 향상을 얻을 수 있습니다. 또한 작업 실행 시간에 영향을 미치는 주요 요인 중 하나는 마지막 작업에서 TC 매트릭스가 몇 개의 에지를 가지고 있는지 계산하는 계산 단계입니다.
옵션 N을 사용하면 계산 단계에 캐시된 RDD가 없기 때문에 Spark는 이전 단계에서 실행된 셔플 데이터를 읽으며 60초가 걸립니다. 또한 옵션 M에서는 실행기 메모리 부족으로 인해 RDD가 메모리에 캐시되지 않습니다. 결과적으로 60초도 소요됩니다. 그러나 M&S 및 S 옵션에서는 RDD를 메모리와 SSD에 캐시할 수 있으므로 카운트 단계에서 2초만 소요됩니다.
4.4. TeraSort 실험 분석
그림 8은 JVM 힙 구성과 RDD 캐싱 옵션을 변경하여 10GB 데이터 세트를 사용하는 TeraSort 벤치마크의 실험 결과를 보여줍니다. 이 그래프는 옵션 N_1으로 정규화됩니다. 모든 작업 실행 시간이 비슷하다는 것을 알 수 있습니다. 그들 사이의 차이는 5% 미만이다. TeraSort 워크로드에서는 구성 및 옵션 변경에 따른 성능 향상이나 저하가 없었습니다. 정렬 단계에서는 네트워크를 통해 몇 가지 순서를 섞습니다. 그러나 셔플 읽기 및 셔플 쓰기의 크기는 각각 25MB로 PageRank 및 TC에 비해 상당히 작습니다. 따라서 JVM 힙 구성 및 RDD 캐싱 옵션은 성능에 영향을 미치지 않습니다. 게다가 TeraSort 워크로드는 전이적 폐쇄처럼 반복 작업으로 구성되지 않으므로 이전 단계에서 RDD 캐싱을 수행해도 이점이 없습니다.

4.5. K-Means 클러스터링 실험 분석
1.5GB 데이터세트에 대한 k-평균 클러스터링의 정규화된 작업 완료 시간은 그림 9에 나와 있습니다. k-평균 클러스터링의 목적은 거리 측정(예: 유클리드 거리)을 기반으로 데이터세트에서 k개의 클러스터를 찾는 것입니다. 이 워크로드에서 알고리즘은 k개의 중심점과 각 데이터 포인트 사이의 거리 계산을 반복하여 SSE(오차 제곱합)[24]를 줄입니다. 이 실험에서는 이 프로세스를 8번 반복합니다. 이전 단계에서 필요한 데이터는 각 단계의 중심점과 SSE에 대한 정보이기 때문에 섞이는 데이터의 양이 최소화됩니다. k-평균 클러스터링 워크로드에서 셔플 읽기/쓰기 데이터의 최대 크기는 1.0MB이고 최소 크기는 0.8MB입니다. 여기서는 모든 설정에서 셔플 공간이 충분하기 때문에 셔플 유출이 발생하지 않습니다. 캐싱 옵션이 없는 실험에서는 _1, _2 및 _3 옵션 간에 차이가 없습니다. 왜냐하면 이러한 설정은 RDD를 캐시하지 않으며 세 가지 설정 모두에서 셔플을 수행하기 때문입니다. 공간은 충분합니다.

메인 메모리나 메모리, SSD에 RDD를 캐싱할 경우, RDD를 위한 저장 공간이 많을수록 더 많은 RDD를 저장 공간에 캐싱할 수 있기 때문에 작업 실행 시간 성능이 향상됩니다. 메모리{0}}전용 옵션과 메모리{1}}및_SSD 옵션을 비교한 결과, 메모리{3}}및_SSD 옵션이 더 나은 성능 향상을 보였습니다. 이는 메모리_전용 옵션에서는 M_3 옵션을 사용해도 저장공간이 부족하기 때문입니다. 또한 SSD에 RDD를 캐싱하면 스토리지 메모리 부족 문제가 해결됩니다. 메모리_및_SSD 옵션은 메모리만 사용한 옵션에 비해 성능이 평균 10% 향상되었습니다.
k-평균 클러스터링 워크로드는 셔플 데이터 양의 차이로 인해 PageRank 및 전이적 폐쇄 워크로드와 반대되는 성능 경향을 나타냅니다. 이에 대해서는 다음 하위 섹션에서 더 자세히 논의하겠습니다.
5. 토론 및 요약
5.1. 논의
워크로드 특성과 처리 단계를 토대로 잠재적인 성능 저하 문제의 주요 요인을 분석했습니다. Spark 플랫폼의 성능 최적화 기술을 다양한 워크로드에 적용하는 것과 관련된 광범위한 실험 결과를 요약하면 다음과 같습니다.
• Java 가비지 컬렉션에 의한 성능 저하: 500MB 데이터 세트와 1GB 데이터 세트를 포함하는 PageRank 워크로드에서 RDD를 저장할 JVM 힙의 저장 공간이 부족할 때 GC가 발생합니다. HDFS에서 입력 파일을 읽어 RDD에 캐시하는 Distinct0 단계에서는 GC가 발생합니다. 이러한 GC 문제를 해결하기 위해 구성을 통해 JVM 힙의 저장 공간을 확장합니다. JVM 힙의 저장 공간을 확장할 수 있기 때문에 GC를 줄여 성능을 향상시킬 수 있습니다. 그림 3과 5에서는 동일한 RDD 캐싱 옵션을 사용하는 경우 _3 구성이 Distinct0 단계에서 최고의 성능을 보여줍니다. 또한 1GB 데이터 세트를 사용하는 PageRank에서는 메모리 부족으로 인해 flatMap 단계에서 일부 옵션이 실패합니다. GC 오버헤드가 너무 많이 증가하여 단계가 실패하거나 무한 루프에 빠집니다. 따라서 우리는 이 문제를 해결하기 위해 SSD로 클러스터를 구성합니다. 그림 6에서 볼 수 있듯이 M&S_1와 S_1에서 볼 수 있듯이 메모리만 사용하여 실패한 작업에서 성능 향상과 성공을 보여줍니다.
• 셔플 유출로 인한 성능 저하: 500MB 데이터 세트와 1GB 데이터 세트가 있는 PageRank 워크로드의 flatMap 단계에서 M&S_1 옵션이 셔플 양이 가장 적기 때문에 최고의 성능을 보이는 것을 볼 수 있습니다. 유출(그림 4: M&S_1는 N_1보다 30% 빠릅니다. 그림 6: M&S_1는 N_3보다 40% 빠릅니다). PageRank에는 많은 셔플 작업이 있습니다. 따라서 JVM 힙의 셔플 공간이 네트워크를 통해 데이터를 셔플하기에 충분하지 않으면 셔플 유출이 발생합니다. 따라서 셔플 유출을 줄이기 위해서는 JVM 힙의 셔플 공간을 확장하는 것이 성능 향상의 핵심 요소가 됩니다.
또한 RDD를 메모리와 SSD에 모두 저장하여 성능을 향상시킬 수 있습니다. 이렇게 하면 실행기가 JVM 힙의 셔플 메모리를 확장하여 셔플 유출을 줄일 수 있습니다. 더 많은 반복이 이루어진다면 flatMap 단계에서의 성능이 성능 향상의 핵심 포인트가 될 것입니다. 1GB 데이터 세트 실험에서는 RDD가 SSD에만 캐시되고 실행기에 충분한 힙 메모리가 있기 때문에 S_3의 작업 실행 시간이 가장 좋은 옵션입니다. 따라서 S_3 옵션에서는 Distinct 단계가 다른 옵션보다 빠릅니다. 그러나 반복 횟수가 증가하면 flatMap 단계가 작업 실행 시간에 영향을 미칩니다. 따라서 이 경우 M&S_1 옵션이 뛰어난 성능을 발휘할 수 있습니다. 이러한 분석을 통해 셔플이 작업 완료 시간에 중요한 영향을 미친다는 것을 확인할 수 있습니다. 따라서 JVM 힙의 셔플 메모리를 확장하고 메모리와 SSD 모두에서 RDD를 캐시하여 셔플 유출을 방지하기 위한 충분한 셔플 메모리 공간을 확보해야 합니다.
• 셔플 읽기 차단 시간에 따른 성능 저하: TC 워크로드에 셔플 읽기 차단 시간이 있습니다. 이는 스테이지에 많은 작업이 있고 각 작업이 네트워크를 통해 이전 RDD를 읽어야 할 때 발생합니다. TC 실험 결과(그림 7), M&S 옵션이 M 옵션보다 빠르다. 동일한 RDD 캐싱 옵션에서 JVM 힙의 셔플 공간을 확장하는 것이 저장 공간을 확장하는 것보다 빠르다. 성능이 향상된 이유는 JVM 힙의 셔플 공간을 확장하여 각 작업에서 셔플 읽기 차단 시간이 줄어들기 때문입니다.
5.2. 요약: 가장 좋은 방법은 무엇입니까?
종합적인 실험 결과에는 모든 워크로드를 향상시킬 수 있는 단일 최상의 설정이 없습니다. 이는 각 워크로드가 작업 수명 동안에도 서로 다른 특성을 갖기 때문입니다. 그러나 우리는 다음과 같이 다양한 대상 워크로드를 고려하여 분산형 인메모리 컴퓨팅 플랫폼의 구성을 최적화하는 방법을 제안할 수 있습니다.
• Spark JVM 힙 구성 - 셔플 영역 vs. 스토리지 영역: 4가지 워크로드의 실험 결과에 따르면 워크로드 특성에 따른 성능 차이를 관찰할 수 있습니다. 예를 들어 페이지랭크(PageRank)는 셔플 데이터량이 많은 대표적인 예이므로 셔플 부분에 더 많은 메모리를 할당할수록 전체적인 성능이 향상됩니다. 그러나 k-평균 클러스터링의 경우 셔플 메모리와 달리 저장 메모리에 더 많이 할당할수록 실행 시간이 덜 필요합니다. 따라서 워크로드 특성에 따라 JVM 메모리 할당 비율을 동적으로 조정할 수 있다면 전체 실행 시간을 최적화할 수 있다. Hadoop YARN [25]을 사용하면 다양한 유형의 클러스터(구성)에 작업을 할당할 수 있으므로 이 아이디어를 대규모 Hadoop 클러스터에 적용하여 다양한 유형의 작업에 대한 메모리 특성을 충족할 수 있습니다.
• RDD 캐싱 정책 - 메모리 대 SSD: 대부분의 경우 SSD 지원 메모리 캐싱은 모든 RDD가 실제 기본 메모리에 들어갈 수 없는 한 최고의 성능을 보여줍니다. 따라서 SSD 지원 메모리 캐싱 정책은 클러스터의 단일 노드에서 충족할 수 없는 상당한 양의 주 메모리가 필요한 까다로운 워크로드에 대해 실행 가능한 선택이 될 수 있습니다.
6. 결론
본 논문에서는 사용 가능한 메인 메모리가 부족한 상용 서버 기반 컴퓨팅 클러스터에서 실행되는 Spark 시스템의 성능 저하에 대한 주요 요인을 조사했습니다. 실험과 분석을 거쳐 전반적인 성능을 향상시킬 수 있는 대안을 제시했습니다.
Java 가비지 수집은 물리적 메모리 부족으로 인해 JVM 힙의 저장 공간이 부족한 경우 발생합니다. Java GC는 작업이 가비지 수집을 기다리도록 하여 전체 작업 완료 시간을 늘립니다. 셔플 유출은 셔플 단계 중에 JVM 힙의 셔플 공간이 부족할 때 발생합니다. 셔플 유출은 셔플 공간 부족으로 인해 중간 셔플 데이터를 디스크에 유출하기 위해 직렬화를 수행하기 위한 CPU 오버헤드를 증가시킵니다. TC 워크로드 실험에서 셔플 읽기 차단 시간은 셔플 공간이 부족하기 때문에 작업이 네트워크를 통해 셔플 데이터를 읽을 때까지 기다리게 만듭니다. 이러한 모든 요소는 잠재적으로 전체 작업 완료 시간을 증가시켜 Spark 시스템의 성능에 심각한 영향을 미칠 수 있습니다.
이러한 문제를 해결하기 위해 우리는 SSD로 클러스터를 구성하고 SSD를 활용하여 메모리의 저장 공간을 보완함으로써 메모리와 SSD 모두에 RDD를 별도로 캐시합니다. 또한 셔플 공간 확장을 위해 JVM 힙 구성을 조정합니다. 그 결과, PageRank 워크로드의 경우 30% 성능 향상, TC 워크로드의 경우 42% 성능 향상을 달성할 수 있었습니다. 우리는 셔플 스필이 성능 저하의 주요 요인이 될 수 있음을 확인했으며, 여러 번의 반복과 셔플링으로 구성된 워크로드에서 셔플 공간을 확장하면 상당한 성능 향상을 제공할 수 있음을 실험을 통해 보여주었습니다. 또한 작업의 다양한 메모리 사용 패턴이 JVM의 스토리지/셔플 메모리 비율 할당에 따라 총 실행 시간에 영향을 미칠 수 있음을 발견했습니다. PageRank와 k-means 클러스터링의 성능 분석에 따르면, 워크로드 특성에 잘 맞춰진 JVM의 메모리 할당은 작업 완료 시간을 크게 향상시킬 수 있습니다.
이러한 결과를 Spark 플랫폼에 통합하는 것은 향후 작업 중 하나가 될 것입니다. 예를 들어, 셔플 데이터의 양을 기준으로 워크로드를 특성화할 수 있는 경우 최적화된 구성을 자동으로 적용하여 대상 워크로드의 처리 속도를 높일 수 있습니다. 따라서 이기종 서버 구성에서 워크로드 메모리 사용량 인식 스케줄링 시스템을 개발하면 Spark 기반 클러스터의 전반적인 성능을 향상시킬 수 있습니다.
저자 기여:
Conceptualization, JL (이재환); 방법론, JL(이재환) 및 JC; 소프트웨어, JC 및 JL(이재현); 검증, JC, JL(이재현) 및 JL(이재환); 조사, JL(이재환) 및 J.-SK; 자원, JL(이재환) 및 J.-SK; 데이터 큐레이션, JC 및 JL(이재현); 집필—원고 준비, JC 및 JL(이재현); 집필-검토 및 편집, JL(이재환) 및 J.-SK; 시각화, JL(이재현); 감독, JL(이재환) 및 J.-SK; 프로젝트 관리, JL(이재환) 및 J.-SK; 펀딩 인수, JL(이재환). 모든 저자는 출판된 원고 버전을 읽고 이에 동의했습니다.

자금:
본 연구는 과학기술정보통신부, 경기도 GRRC 사업(No. GRRC-KAU{)의 지원을 받는 한국연구재단(NRF)을 통한 기초과학연구사업(NRF-2020R1F1A1072696)의 지원으로 수행되었습니다. {5}}B01, "360VR 서비스를 위한 영상 및 공간 융합 플랫폼에 관한 연구") 및 ITRC(정보기술연구센터) 지원 프로그램(IITP-2021-2018-0-01423).
기관 검토 위원회 성명:
해당되지 않습니다.
사전 동의서:
해당되지 않습니다.
데이터 가용성 설명:
요청 시 이용 가능합니다.
이해 상충:
저자는 이해 상충을 선언하지 않습니다.
참고자료
1. 딘, J.; Ghemawat, S. MapReduce: 대규모 클러스터의 데이터 처리가 단순화되었습니다. 커뮤니케이터 ACM 2008, 51, 107–113. [상호참조]
2. Apache Hadoop 프로젝트: 안정적이고 확장 가능한 분산 컴퓨팅을 위한 오픈 소스 소프트웨어. 온라인 이용 가능: https: //hadoop.apache.org/(2021년 9월 10일 액세스).
3. Shvachko, K.; 쿠앙, H.; 라디아, S.; Chansler, R. Hadoop 분산 파일 시스템. 2010 IEEE 26차 대량 저장 시스템 및 기술 심포지엄(MSST) 간행물, 미국 네바다주 인클라인 빌리지, 2010년 5월 3~7일; 1~10페이지.
4. 자하리아, M.; 초두리, M.; 프랭클린, MJ; 쉔커, S.; Stoica, I. Spark: 작업 세트를 사용한 클러스터 컴퓨팅. 핫클라우드 2010, 10, 95.
5. 오스터하우트, K.; 라스티, R.; 라트나사미, S.; 쉔커, S.; Chun, BG 데이터 분석 프레임워크의 성능을 이해합니다. 2015년 5월 4~6일 미국 캘리포니아주 오클랜드에서 열린 네트워크 시스템 설계 및 구현(NSDI)에 관한 제12차 USENIX 심포지엄 진행 중; 293~307페이지.
6. 싱, W.; Ghorbani, A. Weighted PageRank 알고리즘. 통신 네트워크 및 서비스 연구에 관한 IEEE 제2차 연례 컨퍼런스 진행 과정(캐나다 프레더릭턴, 2004년 5월 21일); 305~314쪽.
7. ST 차크라다르; 아그라왈, 버지니아주; Rothweiler, SG 테스트 생성을 위한 전이적 폐쇄 알고리즘입니다. IEEE 트랜스. 계산 지원 Des. 적분 회로 시스템 1993, 12, 1015-1028. [상호참조]
8. O'Malley, O. Apache Hadoop의 테라바이트 정렬. 야후. 2008년 5월. 1~3페이지. 온라인 이용 가능: http://sortbenchmark.org/ YahooHadoop.pdf(2021년 9월 10일 액세스)
9. K-평균 클러스터링. 온라인 이용 가능: https://en.wikipedia.org/wiki/K-means_클러스터링(2021년 9월 10일 액세스)
10. 자하리아, M.; 초두리, M.; 다스, T.; 데이브, A.; 마, J.; 맥컬리, M.; 프랭클린, MJ; 쉔커, S.; Stoica, I. 탄력적인 분산 데이터세트: 인메모리 클러스터 컴퓨팅을 위한 내결함성 추상화. 네트워크 시스템 설계 및 구현(NSDI)에 관한 제9차 USENIX 심포지엄 간행물(미국 캘리포니아주 새너제이, 2012년 4월 25~27일) 15~28쪽.
11. 데이비슨, A.; 또는 A. Spark에서 셔플 성능 최적화 기술 보고서; 버클리-캘리포니아 대학교 전기 공학 및 컴퓨터 과학과: 버클리, 캘리포니아, 미국, 2013.
12. 니콜라에, B.; 코스타, 차; 미세일, C.; 카트리니스, K.; Park, Y. 적응형 I/O를 활용하여 빅 데이터 분석을 위한 집단 데이터 셔플링 패턴 최적화. IEEE 트랜스. 병렬 배포. 시스템. 2017, 28, 1663-1674. [상호참조]
13. 장, H.; 조비; 세이페, E.; 칭, A.; Freedman, MJ Riffle: 대규모 데이터 분석을 위해 최적화된 Shuffle 서비스. 제13차 EuroSys 회의 진행 중; 유로시스 '18; 컴퓨팅 기계 협회: 뉴욕, 뉴욕, 미국, 2018. [CrossRef]
For more information:1950477648nn@gmail.com






