Hadoop Spark在个人记录查找中的性能

Hadoop Spark在个人记录查找中的性能,hadoop,apache-spark,pyspark,spark-dataframe,pyspark-sql,Hadoop,Apache Spark,Pyspark,Spark Dataframe,Pyspark Sql,我正在进行一项性能测试,比较Spark SQL和Tez上的Hive对现有内部Hive表的查询。在整个测试中,SCAPK显示的查询执行时间比Tez上的蜂箱快或快。这些结果与许多例子是一致的。然而,有一个明显的例外是,查询涉及在单个记录级别进行基于键的选择。在这个例子中,Spark明显比Tez上的Hive慢 在互联网上研究了这个话题之后,我没有找到一个满意的答案,我想向SO社区介绍这个例子,看看这是一个与我们的环境或数据相关的一次性案例,还是一个与Spark相关的更大模式 Spark 1.6.1 S

我正在进行一项性能测试,比较Spark SQL和Tez上的Hive对现有内部Hive表的查询。在整个测试中,SCAPK显示的查询执行时间比Tez上的蜂箱快或快。这些结果与许多例子是一致的。然而,有一个明显的例外是,查询涉及在单个记录级别进行基于键的选择。在这个例子中,Spark明显比Tez上的Hive慢

在互联网上研究了这个话题之后,我没有找到一个满意的答案,我想向SO社区介绍这个例子,看看这是一个与我们的环境或数据相关的一次性案例,还是一个与Spark相关的更大模式

Spark 1.6.1 Spark配置:执行器2,执行存储器32G,执行器核心4

数据位于内部配置单元表中,该表存储为使用zlib压缩的ORC文件类型。压缩文件的总大小约为2.2 GB

这是查询代码

#Python API    
#orc with zlib key based select
dforczslt = sqlContext.sql("SELECT * FROM dev.perf_test_orc_zlib WHERE test_id= 12345678987654321")
dforczslt.show()
完成此查询的总时间超过400秒,而在Tez上使用Hive大约需要6秒。我还尝试通过SQL上下文配置使用谓词下推,但这并没有显著提高性能。同样,当使用拼花进行同样的测试时,查询时间也与蜂箱相当。我确信还有其他解决方案可以提高查询的性能,比如使用RDDV。数据帧等,但我真的想了解Spark是如何与ORC文件交互的,这导致了这种差距


请告诉我是否可以就上面列出的任何讨论点提供更多说明。

以下步骤可能有助于提高Spark SQL查询的性能

通常,Hive占用整个Hadoop集群的内存,该内存明显大于executer内存(这里2*32=64 GB)。节点的内存大小是多少

此外,与配置单元查询生成的map/reduce作业数量相比,执行器的数量似乎更少(2)。以2的倍数增加执行器的数量可能有助于提高性能

在SparkSQL和Dataframe中,使用手动管理内存(wown)的优化执行现在在默认情况下与代码生成一起启用 用于表达式计算。如果尚未启用,则可以通过将spark.sql.worth.enabled设置为true来启用此功能

sqlContext.setConf("spark.sql.tungsten.enabled", "true")
sqlContext.setConf("spark.sql.orc.filterPushdown", "true")
ORC格式的列性质有助于避免读取不必要的列。但是,即使查询具有WHERE子句filter,我们仍在读取不必要的行。ORC谓词下推将通过其内置索引提高性能。这里,默认情况下,在Spark SQL中禁用ORC谓词下推,需要显式启用

sqlContext.setConf("spark.sql.tungsten.enabled", "true")
sqlContext.setConf("spark.sql.orc.filterPushdown", "true")
我建议你做更多的研究,找到潜在的性能阻滞剂(如果有的话)