我的问题很简单,但不知何故,我无法通过阅读文档找到一个明确的答案。
我让spark2在cdh5.10集群上运行。还有Hive和元存储。
我在spark程序中创建一个会话,如下所示:
SparkSession spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
假设我有以下hiveql查询:
spark.sql("SELECT someColumn FROM someTable")
我想知道是否:
在引擎盖下,此查询被转换为配置单元mapreduce原语,或者
对hiveql的支持仅限于语法级别,sparksql将在幕后使用。
我正在做一些性能评估,我不知道是否应该声明使用 spark.sql([hiveQL query])
请参阅spark或hive。
4条答案
按热度按时间brc7rcf01#
在引擎盖下,此查询被转换为hive mapreduce原语,或者对hiveql的支持仅在语法级别上,spark sql将在引擎盖下使用
我在hivemetastore上使用sparksql。验证查询是否转换为map/reduce的方法是检查:a。打开配置单元控制台并运行一个带有一些过滤器的简单select查询。现在转到Yarn资源管理器。您将看到一些map/reduce作业由于查询执行而被解雇。b。使用hivecontext运行sparksql并执行相同的sql查询。sparksql将利用hive的元存储信息,而不触发map/reduce作业。转到yarn中的资源管理器并验证它。您将只发现sparkshell会话正在运行,并且没有在集群上触发的其他map/reduce作业。
q0qdq0h22#
设置
enableHiveSupport
但这并不意味着查询是在配置单元中计算的。只是关于Hive目录。如果你使用
enableHiveSupport
,则可以:向/从配置单元持久元存储写入和读取
使用hive的UDF
使用Hive的serde
所有这些都直接与目录连接,而不是执行本身
历史上,hiveql解析也是使用hive完成的,但现在spark不调用hive就完成了
我应该声明使用spark.sql([hiveql query])执行的查询的时间性能是指spark或hive。
如上所述,这是Spark的性能
pbgvytdp3#
spark知道两个目录,hive和in memory。如果你设置
enableHiveSupport()
,那么spark.sql.catalogImplementation
设置为hive
,否则为in-memory
. 所以如果你启用Hive支持,spark.catalog.listTables().show()
将显示配置单元元存储区中的所有表。但这并不意味着hive用于查询*,它只是意味着spark与hive元存储进行通信,执行引擎总是spark。
percentile
和percentile_approx
它们是本地的Hive。vsaztqbk4#
有三个执行引擎,mapreduce,tez和spark。
使用配置单元执行查询时,可以选择使用上述引擎之一。通常,管理员必须将其中一个引擎设置为默认引擎。
即
当您使用spark执行查询时,它将使用spark引擎来执行查询。
然而,如果你在做性能分析,时间不是你唯一应该测量的,内存和cpu也应该测量。