我们的用例是对整个数据集(数十亿行)进行大量处理的狭长表格(15个字段)。我想知道哪种组合可以提供更好的性能:
环境:CDH5.8 / Spark 2.0
1. 在Hive表上使用Spark(作为parquet格式) 2. 在行文件(parquet)上使用Spark
环境:CDH5.8 / Spark 2.0
1. 在Hive表上使用Spark(作为parquet格式) 2. 在行文件(parquet)上使用Spark
如果没有您的具体产品和使用情况的其他上下文,我会推荐使用SparkSql在Hive表上进行翻译,其原因如下:
相对于核心Spark,sparksql通常更好,因为databricks在sparksql中编写了不同的优化,这是更高层次的抽象,并且具有优化代码的能力(请阅读Project Tungsten)。在某些情况下,手动编写的Spark核心代码可能更好,但这需要程序员深入理解内部机制。此外,sparksql有时受到限制,无法控制低级机制,但您可以随时回退到使用core rdd。
Hive而不是文件 - 我假设使用外部metastore的Hive。Metastore保存您的“表”的分区定义的定义(在文件中可能是一些目录)。这是良好性能的最重要部分之一。例如,当使用文件时,Spark将需要加载此信息(可能需要时间 - 例如,S3列表操作非常缓慢)。因此,metastore允许Spark以简单快速的方式获取此信息。
这里只有两个选项:文件上的Spark或Hive上的Spark。SparkSQL适用于两者,你应该优先使用数据集API,而不是RDD。
如果你能自己定义数据集模式,那么Spark读取原始HDFS文件将会更快,因为你可以避免额外跳转到Hive元存储的步骤。
当我几年前(使用Spark 1.3)进行了一个简单的测试时,我注意到提取100,000行作为CSV文件比使用相同的LIMIT
进行的SparkSQL Hive查询要快几个数量级。