Spark中的Alluxio(Tachyon)和Tungsten之间的区别?

时间:2018-10-04 11:39:49

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

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

3 个答案:

答案 0 :(得分:2)

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

Tungsten-是spark的后端优化引擎。 Catalyst Optimizer以逻辑/优化逻辑计划的形式对数据框架/数据集API或Spark SQL中编写的代码进行了优化。一旦结束此阶段,钨优化引擎将接管并负责即时生成高度优化的代码(称为“代码生成”),以便在分布式环境中执行。

对我来说,这两种服务都有不同的用途,我更愿意分别对待它们。

希望它会有所帮助。

答案 1 :(得分:2)

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

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

const routes = [
  {
    path: '/search/:id',
    name: 'Search',
    component: () => import(/* webpackChunkName: "search" */ './views/Search.vue'),
    props: true,
  }
]

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

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

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

答案 2 :(得分:1)

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

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