Spark 内置数据管道中 Apache 箭头的常见用例是什么

问题描述

Apache Arrow 的目的是什么?它从一种二进制格式转换为另一种格式,但我为什么需要它?如果我有一个 spark 程序,那么 spark 可以读取 parquet,那么为什么我需要在处理过程中将其转换为另一种格式? 是否要将内存中的数据传递给另一种语言,如 python 或 java,而不必将其写入 text/json 格式?

解决方法

免责声明:这个问题很广泛,我在一定程度上参与了 Apache Arrow 项目,所以我的回答可能/也可能没有偏见。

这个问题很宽泛,就像“我什么时候应该使用 NoSQL?”这样的问题。问题的类型很广泛。这取决于。 此答案基于您已经拥有 Spark 管道的假设。这个答案不是对 Spark Vs 的尝试。箭头(范围更广,我不会碰它)。

许多 Apache Spark 管道永远不需要使用 Arrow。 Spark 与基于 Arrow 的管道不同,它有自己的内存数据帧格式 (https://spark.apache.org/docs/1.6.1/api/java/org/apache/spark/sql/DataFrame.html),据我所知,它不能零复制到 Arrow。因此,从一种格式转换为另一种格式可能会对性能造成某种影响,您所获得的任何好处都必须与之权衡。

你提出了一个很好的例子,那就是切换到其他语言/库。例如,Spark 目前使用 Arrow 来应用 Pandas UDF (https://spark.apache.org/docs/latest/api/python/user_guide/arrow_pandas.html)。在这种情况下,无论何时你要去一个不使用 Spark 内存格式的库(这意味着任何非 Java 库和一些 Java 库),你将不得不在内存格式之间进行转换等等无论如何,您都要为性能损失付出代价,您不妨切换到 Arrow。

Arrow 格式在某些方面比 Spark 格式更快。我不打算在这里列出这些,因为在大多数情况下,好处不会超过使用 Spark -> Arrow 的成本,而且我不知道我有足够的信息来以任何一种全面的方式这样做。相反,我将提供一个具体示例:

Arrow 的一个常见情况是当您需要在同一台机器上的进程之间传输表(或者在它们之间具有非常快的 I/O 通道)。在这种情况下,序列化为 parquet 然后反序列化的成本(Spark 必须这样做才能转到 Spark Dataframe -> Parquet -> Wire -> Parquet -> Spark Dataframe)比节省的 I/O 更昂贵(Parquet 更紧凑比 Spark 数据帧,因此您将在传输中保存一些)。如果您有很多这种类型的通信,那么离开 Spark,在 Arrow 中进行这些传输,然后返回 Spark 可能会有所帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...