2017-12-13 9 views
0

Spark SQL (일명 전체 스테이지 코드 겐)의 전체 단계 코드 생성 최적화를 탐구 해 왔으며 Spark Core의 스테이지 의미의 "무대"가 얼마나 많은지 궁금해하고 있습니다. 스파크 작업)?Spark SQL의 전체 스테이지 코드 생성에서 "스테이지"는 Spark Core의 스테이지와 어떤 관련이 있습니까?

Spark SQL과 Spark Core의 전 단계 코드gen 단계 사이에 기술적 인 관계가 있습니까? 아니면 더 광범위하게 계산에서 "단계"를 나타 내기 위해 사용됩니까?

답변

4

"스테이지"(및 개념) 용어는 RDD 실행, SQL/DataFrame 실행 및 "Wholestage Codegen"에서 동일합니다.

무대

(다음 셔플 또는 등 파일 시스템, 데이터베이스와 같은 최종 출력 위치) 후속 쓰기에 (외부 소스 또는 이전 셔플에서) 읽기에서 좁은 (지도) 모든 작업을 말한다

Wholestage Codegen을 사용하면 가능하면 각 물리적 연산자가 일부 코드를 생성하고 컴파일 된 하나의 큰 Java 함수를 만들기 위해 ("레거 벽돌과 같은 공통 패턴을 기반으로)"융합됩니다 - "f"라고합니다.

그런 다음 실행은 (대략) 필요한 필드/열을 사용하여 RDD[InternalRow]을 취하여 rdd.mapPartitions(f)

또 다른 방법은 SQL UI 탭에 있습니다. "전체"Wholestage Codegen이 달성되면 Exchange 외부 상자 (파란색 셔플)를 제외한 모든 코드가 나타납니다.

2

개념은 비슷하지만 항상 같은 것은 아닙니다.

Spark Core Stage는 셔플 경계 내에있는 연산자 그룹에 해당합니다.

아래 식의 explain() 함수가 전체 스테이지 코드 생성을 위해 확장되었습니다. Explain 출력에서 ​​연산자 주위에 별표 (*)가 있으면 전체 단계 코드 생성이 가능합니다. 다음과 같은 경우 범위, 필터 및 두 집계 모두 전체 단계 코드 생성으로 실행됩니다. 그러나 Exchange는 네트워크를 통해 데이터를 전송하기 때문에 전체 단계 코드 생성을 구현하지 않습니다. 전체 - 무대 - CODEGEN의 경우

spark.range(1000).filter("id > 100").selectExpr("sum(id)").explain() 

== Physical Plan == 
*Aggregate(functions=[sum(id#201L)]) 
+- Exchange SinglePartition, None 
    +- *Aggregate(functions=[sum(id#201L)]) 
     +- *Filter (id#201L > 100) 
     +- *Range 0, 1, 3, 1000, [id#201L] 

는 물리적 준비 규칙이 CODEGEN을 지원하는 계획을 찾아 WholeStageCodegen으로 함께 축소하는 데 사용됩니다 CollapseCodegenStages.

더 나은 아이디어를 얻으려면 다음 링크를 클릭하십시오.

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-whole-stage-codegen.html

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-CollapseCodegenStages.html

https://databricks.com/blog/2016/05/23/apache-spark-as-a-compiler-joining-a-billion-rows-per-second-on-a-laptop.html

+0

케어 _ "는 네트워크를 통해 데이터를 전송하기 때문에 교환, 그러나, 모든 단계의 코드 생성을 구현하지 않습니다."에 정교 _ 어떤 '것 Exchange에 문제가 있습니까? Exchange의 "원치 않는"코드를 만들었던 이유는 무엇입니까? –