이 문서에서는 Azure HDInsight에서 최상의 성능을 위해 Apache Spark 클러스터의 구성을 최적화하는 방법을 설명합니다.
개요
조인 또는 셔플에서 느린 작업이 있는 경우 원인은 데이터 왜곡일 수 있습니다. 데이터 왜곡은 작업 데이터의 비대칭을 의미합니다. 예를 들어 지도 작업은 20초가 걸릴 수 있습니다. 그러나 데이터를 조인하거나 순서를 섞는 작업을 실행하는 데는 몇 시간이 걸립니다. 데이터 편향을 해결하려면 전체 키에 솔트 값을 적용하거나 일부 키 하위 집합에만 분리된 솔트 값을 사용해야 합니다. 격리된 솔트를 사용하는 경우 맵 조인에서 솔트된 키의 하위 집합을 격리하도록 추가로 필터링해야 합니다. 또 다른 옵션으로는 버킷 열을 도입한 후 해당 버킷에서 먼저 집계하는 것입니다.
조인 속도가 느린 또 다른 요인은 조인 유형일 수 있습니다. 기본적으로 Spark는 조인 형식을 SortMerge 사용합니다. 이 유형의 조인은 큰 데이터 집합에 가장 적합합니다. 그러나 병합하기 전에 먼저 데이터의 왼쪽과 오른쪽을 정렬해야 하므로 계산 비용이 많이 듭니다.
조인 Broadcast 은 더 작은 데이터 집합에 가장 적합하거나 조인의 한쪽이 다른 쪽보다 훨씬 작은 위치에 가장 적합합니다. 이 조인 유형은 한쪽을 모든 실행기에 브로드캐스트하므로 일반적으로 브로드캐스트에 더 많은 메모리가 필요합니다.
구성에서 조인 유형을 설정 spark.sql.autoBroadcastJoinThreshold하여 변경하거나 DataFrame API(dataframe.join(broadcast(df2)))를 사용하여 조인 힌트를 설정할 수 있습니다.
// Option 1
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1*1024*1024*1024)
// Option 2
val df1 = spark.table("FactTableA")
val df2 = spark.table("dimMP")
df1.join(broadcast(df2), Seq("PK")).
createOrReplaceTempView("V_JOIN")
sql("SELECT col1, col2 FROM V_JOIN")
버킷 테이블을 사용하는 경우, Merge 조인이라는 세 번째 조인 유형을 사용할 수 있습니다. 올바르게 사전에 분할되고 사전에 정렬된 데이터 세트는 조인의 SortMerge 비용이 많이 드는 정렬 단계를 건너뛰게 됩니다.
조인 순서는 특히 더 복잡한 쿼리에서 중요합니다. 가장 선택적인 조인으로 시작합니다. 가능한 경우 집계 후 행 수를 증가시키기 위해 조인을 이동하십시오.
Cartesian 조인을 위한 병렬 처리를 관리하려면 중첩 구조체와 윈도잉을 추가하고 Spark 작업에서 하나 이상의 단계를 건너뛸 수 있습니다.
작업 실행 최적화
- 데이터를 두 번 이상 사용할 경우, 필요에 따라 캐시하십시오.
- 변수를 모든 실행기에 브로드캐스트합니다. 변수는 한 번만 직렬화되어 조회 속도가 빨라집니다.
- 드라이버에서 스레드 풀을 사용하면 많은 작업에서 더 빠른 작업을 수행할 수 있습니다.
실행 중인 작업을 정기적으로 모니터링하여 성능 문제를 모니터링합니다. 특정 문제에 대한 더 많은 인사이트가 필요한 경우 다음 성능 프로파일링 도구 중 하나를 고려하세요.
- Intel PAL 도구 는 CPU, 스토리지 및 네트워크 대역폭 사용량을 모니터링합니다.
- Oracle Java 8 Mission Control 은 Spark 및 실행기 코드를 프로파일합니다.
Spark 2.x 쿼리 성능의 핵심은 전체 단계 코드 생성에 따라 달라지는 텅스텐 엔진입니다. 경우에 따라 전체 단계 코드 생성을 사용하지 않도록 설정할 수 있습니다. 예를 들어, 변경할 수 없는 형식(string)을 집계 식에서 사용할 경우, SortAggregate 대신 HashAggregate가 나타납니다. 예를 들어 성능을 향상시키려면 다음을 시도한 다음 코드 생성을 다시 사용하도록 설정합니다.
MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))