【问题标题】:pandasUDF and pyarrow 0.15.0pandasUDF 和 pyarrow 0.15.0
【发布时间】:2020-02-04 22:57:09
【问题描述】:

我最近开始在 EMR 集群上运行的许多 pyspark 作业中遇到一堆错误。错误是

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)...

它们似乎都发生在 pandas 系列的 apply 函数中。我发现的唯一变化是pyarrow 已在周六(05/10/2019)更新。测试似乎适用于 0.14.1

所以我的问题是,是否有人知道这是否是新更新的 pyarrow 中的错误,或者是否有一些重大变化会使 pandasUDF 在未来难以使用?

【问题讨论】:

    标签: pandas apache-spark pyspark pyarrow


    【解决方案1】:

    这不是错误。我们在 0.15.0 中进行了一项重要的协议更改,这使得 pyarrow 的默认行为与 Java 中的旧版本 Arrow 不兼容——您的 Spark 环境似乎使用的是旧版本。

    你的选择是

    • 在您使用 Python 的位置设置环境变量 ARROW_PRE_0_15_IPC_FORMAT=1
    • 现在降级到 pyarrow

    希望 Spark 社区能够尽快升级到 Java 0.15.0,这样这个问题就会消失。

    这在http://arrow.apache.org/blog/2019/10/06/0.15.0-release/中讨论

    【讨论】:

    • 如果我使用 AWS EMR,我应该在哪里定义环境变量?我把它放在软件配置分类spark-env.export。但这似乎并没有解决问题
    • 所以我选择将pyarrow降级到0.14.0,看来可以了。但还是更喜欢用第一种方法。
    【解决方案2】:

    在 Spark 中尝试以下附录:

    spark-submit --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 
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2018-12-23
      • 2021-04-08
      • 2017-09-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多