2017-12-18 7 views
0

Whole State Code Generation에 대한 기사를 읽은 후 spark는 바이트 코드 최적화를 수행하여 쿼리 계획을 최적화 된 실행 계획으로 변환합니다.스파크는 어떻게 바이트 코드를 기계어 코드 명령어 런타임 변환으로 변환합니까?

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

이제 나의 다음 질문은 여전히 ​​바이트 코드 및 모든 관련이 최적화를 수행 한 후, 아직이 작업을 수행하기 때문에 기계 코드 명령어에 그 바이트 코드 지침의 변환이 가능한 병목이 될 수 있다고 그럴듯 수 있습니다 JIT만으로는 프로세스의 런타임 중에 JIT가 충분한 실행을 가져야합니다.

spark는 최적화 된 바이트 코드 (결과는 whole stage code gen 임)를 기계 코드로 동적/런타임 변환하거나 JIT를 사용하여 해당 바이트 코드 명령어를 기계어 명령어로 변환하는 데 관련이 있습니다. JIT에 의존하는 경우 특정 불확실성이 포함되기 때문입니다.

+0

한 가지 더, 나는 다소 관심 스파크가이 최적화를 수행하지 않는다면이 바이트 코드 최적화를 수행하지 않는 일반 쿼리 엔진과 비교할 때 속도가 느려질 수 있습니다. 왜냐하면 우리는 각 쿼리 유형에 대해 서로 다른 최적화 된 바이트 코드를 생성하기 때문에 SPARK에서는 결코 맞지 않을 수도있는 JIT 최적화 (핫 경로에서)를 반복적으로 사용하는 동일한 코드 세그먼트를 사용하기 때문입니다. –

+0

필자는 링크 된 기사의 저자이기 때문에 _ "전체 주 코드 생성에 대한 기사를 읽은 후 _"에 관심이 있습니다. 나는이 지역을 더 잘 탐구하기 위해 그것들을 읽고 싶다. –

+0

아무런 문제가 없지만 스파크가 기계어 명령 생성을하지 않으면 JIT가 실제로 실행되지 않을 수도 있으므로 어떤 경우에는 느려질 수 있습니다. 말이 돼 ? –

답변

3

스파크는 쿼리 계획을 최적화 된 실행 계획으로 변환하기 위해 바이트 코드 최적화를 수행합니다.

스파크 SQL은 이 아니고은 바이트 코드 최적화를 수행합니다.

스파크 SQL은 CollapseCodegenStages 물리적 준비 규칙을 사용하고 결국 쿼리 계획을 single-method Java source code (해당 Janino compiles)으로 변환하고 바이트 코드를 생성합니다.

그래서 불꽃이 전체 단계 CODEGEN 생성 여부를 확인 WholeStageCodegenExecdoes 최적화 된 바이트 코드의 동적/런타임 변환 JIT의

번호


말하기에 관련된 아무것도하지 않습니다 "생성 된 코드가 너무 깁니다" 또는 그 이상일 수 있습니다 spark.sql.codegen.hugeMethodLimit 스파크 SQL 내부 속성 (기본적으로 8000입니다 the value of HugeMethodLimit in the OpenJDK JVM settings).

전체 스테이지 코드gen에 의해 생성 된 단일 컴파일 된 Java 함수의 최대 바이트 코드 크기. 컴파일 된 함수가이 임계 값을 초과하면 전체 스테이지 코드 건이 현재 쿼리 계획의이 하위 트리에 대해 비활성화됩니다. 기본값은 8000이며 이는 OpenJDK JVM 구현의 한계입니다. CodegenSupport 그렇게 자신의 doConsumedoProduce 방법이 있는지 모든 JIT의 경우하기에 걷어차하지 않을 수 있습니다를 공개한다 검토 지원하는 많은 실제 운영자가 아닌


. 또한

+0

감사합니다 :) :). 그래, 사실 janino는 내부적으로 spark sql에서 최적화 된 바이트 코드를 생성하는 데 사용됩니다. 하지만 실제로 스파크가 기본 코드 최적화를 수행하지 않는다는 사실을 알려 주셔서 감사합니다. –

+0

에는 상한선이있는 것처럼 보이지만 JIT가 스파크로 인해 어떤 경우에는 여전히 차질을하지 않을 지에 대한 질문에는 여전히 대답하지 않습니다. –

관련 문제