【问题标题】:Difference between Alluxio(Tachyon) and Tungsten in Spark?Spark中Alluxio(Tachyon)和Tungsten的区别?
【发布时间】:2019-03-09 18:58:21
【问题描述】:

Tachyon 是与 Spark 分开开发的分布式内存存储系统,可在 Spark 应用程序期间用作堆外持久性存储

Tungsten 是一个新的 Spark SQL 组件,它通过直接在字节级别工作来提供更高效的 Spark 操作。由于 Tungsten 不再依赖于处理 Java 对象,我们可以使用堆内(在 JVM 中)或堆外存储

在堆外模式下,两者都减少了垃圾收集开销,因为数据不存储为 Java 对象。

那么我是否可以简单地认为 Tachyon 为一般 RDD 带来了好处,而 spark-sql 则从 Tungsten 中受益?

假设以下代码

val df = spark.range(10)

val rdd = df.rdd

df.persist(StorageLevel.OFF_HEAP) // in Tungsten format(bytes)?

df.show

rdd.persist(StorageLevel.OFF_HEAP) // in Tachyon storage ?

rdd.count

【问题讨论】:

    标签: apache-spark apache-spark-sql rdd alluxio


    【解决方案1】:

    Alluxio 获得了内存速度读/写操作的好处。 Spark 能够从 Alluxio 读取数据(在内存存储系统中)。这样可以避免来自硬盘的输入/输出 (IO)(任何文件系统,如 HDFS 等位于硬盘上)。

    Tungsten- 是 spark 的后端优化引擎。编写的数据帧/数据集 API 或 Spark SQL 中的代码由 Catalyst Optimizer 以逻辑/优化逻辑计划的形式进行优化。一旦这个阶段结束,tungsten 优化引擎将接管并负责动态生成代码(称为“代码生成”),该代码针对分布式环境的执行进行了高度优化。

    对我来说,两者都有不同的用途,我更愿意将它们分开对待。

    希望在一定程度上有所帮助。

    【讨论】:

    • 谢谢,Alluxio 用作内存存储,而 Tungsten 是优化引擎。这两个应该分开考虑。
    【解决方案2】:

    Spark 与 Alluxio 和 Tungsten 交互以获取不同阶段的数据。

    对于 Spark,Alluxio 是一个外部分布式存储系统,类似于 HDFS。 Spark 通过文件系统接口与 Alluxio 交互(参见下面的示例)。它与 Spark 访问 HDFS 或本地文件系统的接口基本相同,只是存储服务是由 Alluxio 提供的,它可以利用内存作为存储介质。

    // save data as text file to Alluxio
    > rdd.saveAsTextFile("alluxio://localhost:19998/rdd1")
    // read data as text file from Alluxio
    > rdd = sc.textFile("alluxio://localhost:19998/rdd1")
    // save data as object file to Alluxio
    > rdd.saveAsObjectFile("alluxio://localhost:19998/rdd2")
    // read data as object file from Alluxio
    > rdd = sc.objectFile("alluxio://localhost:19998/rdd2")
    

    Spark 仅在读取输入数据文件和写入输出文件的阶段与 Alluxio 交互。

    Tungsten 是 Spark 的内部数据表示,旨在提高内存和 CPU 的效率。本质上,由于内存空间和 GC 开销,JVM 对象的默认内存布局被认为是低效的 Spark 应用程序(请参阅 databricks 中关于 Project Tungsten 的blog)。 Tungsten 帮助 Spark 直接处理来自二进制数据格式的数据,而无需打扰 JVM 来构造 JVM 对象。

    因此,Spark 应用程序可能会从 Alluxio 读取输入文件——Alluxio 在不了解这些字节的情况下向 Spark 发送字节,然后根据 Tungsten 定义的协议解析数据并在 Spark 内部表示。

    【讨论】:

      【解决方案3】:

      简而言之,您的两个陈述都不正确:

      • 自 Spark 1.6 OFF_HEAP 存储不再使用 Alluxio,而是使用 Spark 的内部堆外存储。参见例如 SPARK-16025。
      • Spark SQL 中的所有存储模式都以内部二进制格式存储数据,可以使用spark.sql.inMemoryColumnarStorage.* 属性进一步配置。

      【讨论】:

      • 谢谢,我通过了 JIRA,现在 rdd 使用内部堆外存储。对于第二条语句,我阅读了一些文档,知道它是柱状内部字节格式,并且 Tungsten 充当优化器,可以直接在运行中的二进制格式上工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      相关资源
      最近更新 更多