Spark에서 Python Apache Beam 파이프 라인 실행

Oct 31 2020

여기에서 아파치 빔 (python sdk 사용)을 시도해 보았으므로 간단한 파이프 라인을 만들고 Spark 클러스터에 배포하려고했습니다.

from apache_beam.options.pipeline_options import PipelineOptions
import apache_beam as beam

op = PipelineOptions([
        "--runner=DirectRunner"
    ]
)


with beam.Pipeline(options=op) as p:
    p | beam.Create([1, 2, 3]) | beam.Map(lambda x: x+1) | beam.Map(print)

이 파이프 라인은 DirectRunner와 잘 작동합니다. 따라서 Spark에 동일한 코드를 배포하려면 (이동성은 Beam의 핵심 개념이므로) ...

먼저 여기에PipelineOptions 언급 된대로 편집했습니다 .

op = PipelineOptions([
        "--runner=PortableRunner",
        "--job_endpoint=localhost:8099",
        "--environment_type=LOOPBACK"
    ]
)

job_endpoint명령을 사용하여 실행 하는 빔 스파크 작업 서버 의 도커 컨테이너에 대한 URL입니다 .

docker run --net=host apache/beam_spark_job_server:latest --spark-master-url=spark://SPARK_URL:SPARK_PORT

이것은 잘 작동하지만 Spark에서 다음 오류로 인해 작업이 실패합니다.

20/10/31 14:35:58 ERROR TransportRequestHandler: Error while invoking RpcHandler#receive() for one-way message.

java.io.InvalidClassException: org.apache.spark.deploy.ApplicationDescription; local class incompatible: stream classdesc serialVersionUID = 6543101073799644159, local class serialVersionUID = 1574364215946805297

또한 beam_spark_job_server로그에 다음 경고가 있습니다 .

WARN org.apache.beam.runners.spark.translation.SparkContextFactory: Creating a new Spark Context.

여기서 문제가 어디에 있는지 아십니까? 컨테이너화 된 서비스를 통과하지 않고 스파크에서 Python Beam Pipelines를 실행하는 다른 방법이 있습니까?

답변

2 KennKnowles Nov 04 2020 at 01:12

이는 작업 서버에 포함 된 Spark 클라이언트 버전과 작업을 제출하는 Spark 버전 간의 버전 불일치로 인해 발생할 수 있습니다.