spark2:调用sparksession enablehivesupport()时它是如何工作的

cidc1ykv  于 2021-06-26  发布在  Hive
关注(0)|答案(4)|浏览(985)

我的问题很简单,但不知何故,我无法通过阅读文档找到一个明确的答案。
我让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。

brc7rcf0

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作业。

q0qdq0h2

q0qdq0h22#

设置 enableHiveSupport 但这并不意味着查询是在配置单元中计算的。
只是关于Hive目录。如果你使用 enableHiveSupport ,则可以:
向/从配置单元持久元存储写入和读取
使用hive的UDF
使用Hive的serde
所有这些都直接与目录连接,而不是执行本身
历史上,hiveql解析也是使用hive完成的,但现在spark不调用hive就完成了
我应该声明使用spark.sql([hiveql query])执行的查询的时间性能是指spark或hive。
如上所述,这是Spark的性能

pbgvytdp

pbgvytdp3#

spark知道两个目录,hive和in memory。如果你设置 enableHiveSupport() ,那么 spark.sql.catalogImplementation 设置为 hive ,否则为 in-memory . 所以如果你启用Hive支持, spark.catalog.listTables().show() 将显示配置单元元存储区中的所有表。
但这并不意味着hive用于查询*,它只是意味着spark与hive元存储进行通信,执行引擎总是spark。

  • 实际上有一些函数 percentilepercentile_approx 它们是本地的Hive。
vsaztqbk

vsaztqbk4#

有三个执行引擎,mapreduce,tez和spark。
使用配置单元执行查询时,可以选择使用上述引擎之一。通常,管理员必须将其中一个引擎设置为默认引擎。

set hive.execution.engine=tez;

当您使用spark执行查询时,它将使用spark引擎来执行查询。
然而,如果你在做性能分析,时间不是你唯一应该测量的,内存和cpu也应该测量。

相关问题