Spark 中 Alluxio(Tachyon)和钨的区别?

Difference between Alluxio(Tachyon) and Tungsten in Spark?

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

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

Tungsten-是spark的后端优化引擎。 Catalyst Optimizer 以 logical/optimized 逻辑计划的形式优化了 dataframe/dataset API 或 Spark SQL 中编写的代码。一旦这个阶段结束,tungsten 优化引擎就会接管并负责动态生成代码(称为 'Code gen'),这些代码针对在分布式环境中的执行进行了高度优化。

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

希望对你有所帮助。

简而言之,您的两种说法都不正确:

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

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。本质上,由于内存 space 和 GC 开销,JVM 对象的默认内存布局被认为对 Spark 应用程序来说效率低下(请参阅数据块中 Project Tungsten 上的 blog)。 Tungsten 帮助 Spark 直接处理二进制数据格式的数据,而无需打扰 JVM 来构造 JVM 对象。

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