Spark在Parquet格式上与Spark在Hive(Parquet格式)上的区别

3
我们的用例是对整个数据集(数十亿行)进行大量处理的狭长表格(15个字段)。我想知道哪种组合可以提供更好的性能:
环境:CDH5.8 / Spark 2.0
1. 在Hive表上使用Spark(作为parquet格式) 2. 在行文件(parquet)上使用Spark

关于Scala lambdas比SparkSQL表达式慢的问题已经有所了解(SparkSQL表达式直接使用标量类型,无需往返转换为对象),但通常差距微乎其微。如果我没记错的话,ORC矢量化读取器将在Spark 2.3中推出,而Parquet已经支持矢量化。除此之外...我是一个老SQL用户,对于Scala混成表达式感到荒谬,就像那么多香肠串一样,但这只是我的个人观点(基于集合的语义,宝贝!) - undefined
1
SparkSQL在行文件(parquet或ORC)上运行。什么是行文件?ORC是列存储对吗? - undefined
2个回答

3

如果没有您的具体产品和使用情况的其他上下文,我会推荐使用SparkSql在Hive表上进行翻译,其原因如下:

  1. 相对于核心Spark,sparksql通常更好,因为databricks在sparksql中编写了不同的优化,这是更高层次的抽象,并且具有优化代码的能力(请阅读Project Tungsten)。在某些情况下,手动编写的Spark核心代码可能更好,但这需要程序员深入理解内部机制。此外,sparksql有时受到限制,无法控制低级机制,但您可以随时回退到使用core rdd。

  2. Hive而不是文件 - 我假设使用外部metastore的Hive。Metastore保存您的“表”的分区定义的定义(在文件中可能是一些目录)。这是良好性能的最重要部分之一。例如,当使用文件时,Spark将需要加载此信息(可能需要时间 - 例如,S3列表操作非常缓慢)。因此,metastore允许Spark以简单快速的方式获取此信息。


3

这里只有两个选项:文件上的Spark或Hive上的Spark。SparkSQL适用于两者,你应该优先使用数据集API,而不是RDD。

如果你能自己定义数据集模式,那么Spark读取原始HDFS文件将会更快,因为你可以避免额外跳转到Hive元存储的步骤。

当我几年前(使用Spark 1.3)进行了一个简单的测试时,我注意到提取100,000行作为CSV文件比使用相同的LIMIT进行的SparkSQL Hive查询要快几个数量级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接