복붙노트

[PYTHON] 디버그 모드에서 pyspark를 어떻게 호출 할 수 있습니까?

PYTHON

디버그 모드에서 pyspark를 어떻게 호출 할 수 있습니까?

IntelliJ IDEA를 Apache Spark 1.4와 함께 설치했습니다.

스파크 파이썬 스크립트에 디버그 포인트를 추가하여 쉽게 디버깅 할 수 있기를 바랍니다.

현재 파이크 프로세스를 초기화하기 위해이 비트의 Python을 실행 중입니다.

proc = subprocess.Popen([SPARK_SUBMIT_PATH, scriptFile, inputFile], shell=SHELL_OUTPUT, stdout=subprocess.PIPE)

if VERBOSE:
    print proc.stdout.read()
    print proc.stderr.read()

spark-submit이 결국 myFirstSparkScript.py를 호출하면 디버그 모드가 활성화되지 않고 정상적으로 실행됩니다. 아쉽게도 Apache Spark 소스 코드를 편집하고 사용자 정의 된 사본을 실행하는 것은 용인 할 수없는 해결책입니다.

누구든지 spark-submit 디버그 모드에서 Apache Spark 스크립트를 호출 할 수 있는지 알고 있습니까? 그렇다면 어떻게?

해결법

  1. ==============================

    1.Spark 아키텍처를 고려할 때 내가 원하는대로 당신의 의도를 직접 이해할 수는 없습니다. 서브 프로세스 호출 없이도 드라이버에서 직접 액세스 할 수있는 프로그램의 유일한 부분은 SparkContext입니다. 나머지 부분에서는 하나 이상의 (로컬 모드에서) JVM 인스턴스를 포함하여 서로 다른 통신 계층에 의해 효과적으로 격리됩니다. 이를 설명하기 위해 PySpark Internals 문서의 다이어그램을 사용할 수 있습니다.

    Spark 아키텍처를 고려할 때 내가 원하는대로 당신의 의도를 직접 이해할 수는 없습니다. 서브 프로세스 호출 없이도 드라이버에서 직접 액세스 할 수있는 프로그램의 유일한 부분은 SparkContext입니다. 나머지 부분에서는 하나 이상의 (로컬 모드에서) JVM 인스턴스를 포함하여 서로 다른 통신 계층에 의해 효과적으로 격리됩니다. 이를 설명하기 위해 PySpark Internals 문서의 다이어그램을 사용할 수 있습니다.

    왼쪽 상자에는 로컬로 액세스 할 수 있으며 디버거를 연결하는 데 사용할 수있는 부분이 있습니다. JVM 호출에 가장 제한되어 있기 때문에 PySpark 자체를 실제로 수정하지 않는 한 거기에는 아무 것도 관심이 없습니다.

    오른쪽에있는 일은 원격으로 발생하며 사용하는 클러스터 관리자에 따라 사용자 관점에서 볼 때 거의 블랙 박스입니다. 또한 오른쪽에있는 Python 코드가 JVM API를 호출하는 것 이상의 많은 경우가 있습니다.

    이것은 나쁜 부분이었습니다. 좋은 점은 대부분 원격 디버깅이 필요 없다는 것입니다. 쉽게 조롱 될 수있는 TaskContext와 같은 객체 액세스를 제외하면 Spark 인스턴스를 사용하지 않고도 코드의 모든 부분을 로컬에서 쉽게 실행 / 테스트 할 수 있어야합니다.

    액션 / 변환에 전달하는 함수는 표준 및 예측 가능한 Python 객체를 사용하며 표준 Python 객체를 반환 할 것으로 예상됩니다. 또한 이들이 부작용이 없어야한다는 점이 중요합니다.

    결국 프로그램의 일부분 (대화식으로 액세스 할 수 있고 입출력을 기반으로 테스트 할 수있는 얇은 레이어 및 테스트 / 디버깅을 위해 Spark가 필요없는 "계산 코어")가 필요합니다.

    당신이 여기있는 곳에서 완전히 벗어나지 못했다고 말하는 것입니다.

    (수동으로 실행중인 인터프리터에 디버거를 연결)

    일반 GDB와 PySpark 디버거는 모두 실행중인 프로세스에 연결할 수 있습니다. 이는 PySpark 데몬이나 작업자 프로세스가 시작된 후에 만 ​​수행 할 수 있습니다. 로컬 모드에서는 더미 액션을 실행하여 강제로 실행할 수 있습니다 (예 :

    sc.parallelize([], n).count()
    

    여기서 n은 로컬 모드 (로컬 [n])에서 사용 가능한 "코어"의 수입니다. 유닉스 계열 시스템에서 단계별 절차의 예 :

    이 접근법의 가장 큰 단점은 적절한 순간에 적절한 통역사를 찾았다는 것입니다.

    (디버거 서버에 연결하는 활성 구성 요소 사용)

    PyCharm은 PySpark 작업과 함께 사용할 수있는 Python Debug Server를 제공합니다.

    우선 원격 디버거에 대한 구성을 추가해야합니다.

    파이 손 - 맨홀 (python-manhole)이나 피라미드 (pyrasite)를 포함한 많은 도구들이 PySpark를 사용하기 위해 약간의 노력을 기울여 사용할 수 있습니다.

    노트 :

    물론 로컬 모드와 "원격"(활성) 메소드를 분산 모드로 사용할 수 있습니다 (작업자 노드에 연결하고 로컬 모드와 동일한 단계를 수행 할 수 있음).

  2. from https://stackoverflow.com/questions/31245083/how-can-pyspark-be-called-in-debug-mode by cc-by-sa and MIT license