PyArrow 0.15.0과 함께 Pandas UDF를 사용할 때 발생하는 호환성 문제

Q·2023년 9월 19일
0

 문제 발생

2023-09-15 16:45:00 ERROR Executor:91 - Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.IllegalArgumentException
        at java.nio.ByteBuffer.allocate(ByteBuffer.java:334)
        at org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543)
        at org.apache.arrow.vector.ipc.message.MessageChannelReader.readNext(MessageChannelReader.java:58)
        at org.apache.arrow.vector.ipc.ArrowStreamReader.readSchema(ArrowStreamReader.java:132)
        at org.apache.arrow.vector.ipc.ArrowReader.initialize(ArrowReader.java:181)
        at org.apache.arrow.vector.ipc.ArrowReader.ensureInitialized(ArrowReader.java:172)
        at org.apache.arrow.vector.ipc.ArrowReader.getVectorSchemaRoot(ArrowReader.java:65)
        at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:162)
        at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:122)
        at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406)
        at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37)
        at org.apache.spark.sql.execution.python.ArrowEvalPythonExec$$anon$2.<init>(ArrowEvalPythonExec.scala:98)
        at org.apache.spark.sql.execution.python.ArrowEvalPythonExec.evaluate(ArrowEvalPythonExec.scala:96)
        at org.apache.spark.sql.execution.python.EvalPythonExec$$anonfun$doExecute$1.apply(EvalPythonExec.scala:127)
        at org.apache.spark.sql.execution.python.EvalPythonExec$$anonfun$doExecute$1.apply(EvalPythonExec.scala:89)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:801)
        at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:801)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
        at org.apache.spark.scheduler.Task.run(Task.scala:121)
        at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:402)
        at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:408)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748
  • PyArrow 0.15.0과 함께 Pandas UDF를 사용하려고 할때 문제가 발생
  • PyArrow 0.15.0 이슈: PyArrow 0.15.0은 Spark 2.4.x와 호환되지 않습니다. 호환되는 버전을 사용해야 합니다.

✅ 해결

  1. 환경 변수 설정: PyArrow 버전 0.15.0 이상을 꼭 사용해야 하는 경우, ARROW_PRE_0_15_IPC_FORMAT=1 환경 변수를 설정하여 이전 IPC (Inter-Process Communication) 형식을 사용할 수 있습니다.

    spark-submit \
    --master yarn \ 
    --deploy-mode cluster \
    **--conf spark.yarn.appExecutorEnv.ARROW_PRE_0_15_IPC_FORMAT=1 \
    --conf spark.yarn.appMasterEnv.ARROW_PRE_0_15_IPC_FORMAT=1 \
    --conf spark.executorEnv.ARROW_PRE_0_15_IPC_FORMAT=1 \**
  2. PyArrow 버전 다운그레이드: 호환성을 유지하기 위해서는 PyArrow의 버전을 다운그레이드하는 것이 좋습니다. 예를 들어, PyArrow 0.14.1을 사용할 수 있습니다.

    pip install pyarrow==0.14.1

요약하자면, 이 문제는 Spark와 PyArrow 간의 버전 호환성 문제입니다. 이를 해결하기 위해 호환되는 버전을 사용하거나, 특정 환경 변수를 설정해야 합니다. 필자는 1번 방법으로 해결했습니다.

✅ 참고 자료

profile
Data Engineer

0개의 댓글