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
答案 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)
简而言之,您的两个陈述都不正确:
OFF_HEAP
起,存储不再使用Alluxio,而是使用Spark的内部堆存储。例如,请参阅SPARK-16025。spark.sql.inMemoryColumnarStorage.*
属性对其进行进一步配置。