Spark-sql CLI 在运行查询时仅使用 1 个执行程序

Posted

技术标签:

【中文标题】Spark-sql CLI 在运行查询时仅使用 1 个执行程序【英文标题】:Spark-sql CLI use only 1 executor when running query 【发布时间】:2015-01-22 03:10:44 【问题描述】:

我将使用 spark-sql cli 替换 hive cli shell,并按照命令运行 spark-sql cli,(我们在 yarn Hadoop 集群上使用,hive-site.xml 已经复制到/conf)

.> 火花-sql 然后shell打开,工作正常,

然后我执行类似的查询,

./spark-sql>select devicetype, count(*) from mytable group by devicetype;

命令执行成功,结果正确。但我注意到性能很慢。

从 Spark 作业 ui http://myhost:4040,我注意到只有 1 个 Executor 标记为已使用,所以这可能是原因。

我尝试修改spark-sql脚本并在exec命令中添加-num-executors 500,但没有帮助。

所以任何人都可以帮助解释为什么?

谢谢。

【问题讨论】:

【参考方案1】:

参考文档:http://spark.apache.org/docs/latest/sql-programming-guide.html

spark-sql 是一个只能在本地模式下工作的 SQL CLI 工具,这就是为什么你只能看到一个执行器

如果您想拥有 SQL 的集群版本,您应该启动 thriftserver 并使用 beeline 工具(与 Spark 一起提供)通过 JDBC 连接到它。您可以在官方文档http://spark.apache.org/docs/latest/sql-programming-guide.html

Running the Thrift JDBC/ODBC server一章中找到描述

开始:

export HIVE_SERVER2_THRIFT_PORT=<listening-port>
export HIVE_SERVER2_THRIFT_BIND_HOST=<listening-host>
./sbin/start-thriftserver.sh \
  --master <master-uri> \
  ...

连接:

./bin/beeline
beeline> !connect jdbc:hive2://<listening-host>:<listening-port>

【讨论】:

非常感谢您的回答。我尝试看到直线使用 M/R 作业来运行 sql 而不是 spark 作业。我想要的是使用火花来运行这项工作。所以目前没有办法做到这一点? 首先,你确定你已经启动了thrift server来使用Spark吗? start-thriftserver.sh 应该位于 Spark 目录中。其次,你确定你在beeline中指定了正确的端口并且没有连接到Hive吗?可以肯定的是,如果 Hive thriftserver 在同一台机器上运行,我建议您停止它 我们的用户不愿意迁移到使用beeline,他们以前使用hive查询,因​​为spark-sql很好兼容hive,所以我不得不回到spark-sql。我看到当输入 spark-sql --help 时,它说有像 --num-executors 这样的参数,因为它只能在本地模式下工作,为什么它有这个但不能工作? 你没有抓住重点。 “Spark-sql”工具仅用于调试目的,不用于生产用途。使用 Spark Thrift 服务器,您可以启动类似于 DBMS 引擎的东西 - Spark + JDBC 接口的集群。之后,您的用户可以使用任何工具连接到它(例如 Squirrel),您没有义务使用 Beeline。他们可以在那里直接使用 HiveQL 其实用户可以添加 --master yarn 来启动 yarn 客户端模式【参考方案2】:

直线 \> !connect jdbc:hive2://localhost:10002/default;transportMode=http;httpPath=cliservice

10002 是我的 spark thrift 服务器端口。

把它改成你的。 您可以从您的 thrift 日志中找到您的 thrift 端口。

【讨论】:

以上是关于Spark-sql CLI 在运行查询时仅使用 1 个执行程序的主要内容,如果未能解决你的问题,请参考以下文章

Spark-SQL CLI:未调用 SupportsPushDownFilters.pushFilters

spark-sql(spark sql cli)客户端集成hive

java+spark-sql查询excel

打字机。通过日期查询时仅使用日期部分并排除时间戳部分

如何在使用 opsworks 部署时仅在特定层中的第一个实例上运行命令?

链式 REPLACE 函数在一次查询执行时仅替换一个值