更好的蜂巢-火花连接?



我正在审查一个旧的Spark软件,该软件必须并行运行许多小查询和计数(SELECT COUNT(*) FROM t(,并使用直接Hive-SQL。

过去,该软件通过在shell上运行每个Beeline来解决其"并行化查询问题"(sys.process._(。我不能使用现代新鲜的Spark,目前只有Spark v2.2。 下面的片段说明了完整的 SQL 查询方法。

有一种"Spark 方式"可以访问 Hive 并以(很少(更好的性能和更好的 Spark 配置重用来运行 SQL 查询?
没有丢失纯 Hive 或与本机 Hive-Spark 并行化的风险?


说明

package br.com.generaldq.utils
import org.apache.log4j.Logger
object HiveUtils {
val log: Logger = Logger.getLogger(HiveUtils.getClass)
def beelineExec(hql: String, queue: String = "DataQuality"): String = {
// here the beeline call and parameters are fixed, 
// no reuse of Spark configurations.
val serversHive=List("etc:2181", "etc2:2181")
log.info(hql)
val bl =
Seq("beeline", "-u", "'jdbc:hive2://etcEtc","--hiveconf","... ETC...", "-e",
"""+hql+"""
)
import sys.process._
var result =
try {
Process(bl).!!
} catch {
case e: Exception =>
log.error(s"Error '${e}' on executing Hive query.nQuery: ${hql}n")
s"Error on executing Hive query. Query: ${hql}"
}
result
}
}

你没有提到你所在的平台,但在HDP的情况下,你可以使用Spark Warehouse Connector来访问Hive。我希望性能良好,同时仍然利用 Hive 的元数据管理,甚至在表/列级别设置的安全策略。

以下是文档: https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.4/integrating-hive/content/hive_hivewarehouseconnector_for_handling_apache_spark_data.html

如果你没有一个集成的平台,你有时可以通过避免hive来获得性能,而只是提供对Hdfs仓库目录的完全访问权限,当然这可能会产生安全问题。

您可以使用 Hive on Spark 连接来运行 Spark SQL。 https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/admin_hos_oview.html

第二种方法是Spark Thrift服务器 - 参见示例 https://mapr.com/docs/61/Spark/SparkSQLThriftServer.html 如何让它运行(请注意,默认情况下Spark不附带Thrift Server,您可能需要重建Spark才能获得此添加-Phive-thriftserver(。

第三种方法是Apache Livy。Livy的最新版本0.6也增加了节俭服务。 此方法可与本机 Spark Thrift Service 相媲美。

在性能方面,所有这些选项都是相似/相同的。

虽然如果你在CDH5上,CDH5的Hive是硬连线使用Spark 1来运行的,所以当你错过那些Spark 2改进时,会有间接的惩罚。 CDH6 没有这个问题。

请注意,从您的问题中不清楚为什么必须使用 Hive。 你可以直接使用 Spark SQL - 通过上面描述的方法 2 和 3。

如果你必须从Java/Scala应用程序访问Spark SQL,你可以通过Thrift Server/Livy Thrift Server直接与Spark建立JDBC连接。

就性能而言,要记住的另一个方面是预期的并发连接数。Spark 上的 Hive(方法 1(和 Spark Thrift Server(方法 2(为每个用户创建一个单独的 Spark 会话,因此 1( 创建新连接会受到惩罚,2( 就此体系结构可以支持的用户数量而言,它不能很好地扩展。

另一方面,Livy Thrift Server允许利用Spark的FAIR调度程序(基本上,您可以在同一个Spark会话中同时运行多个Spark查询/作业,可能需要手动构建,请参阅 https://github.com/apache/incubator-livy/pull/135(。