无法将 Spark 作为 Hive 执行引擎

Posted

技术标签:

【中文标题】无法将 Spark 作为 Hive 执行引擎【英文标题】:Not able to make Spark as Hive execution engine 【发布时间】:2020-06-19 06:57:43 【问题描述】:

我正在使用 Hive 3.1.2 和 Spark 2.4.5(Ubuntu 18.04 上的 Hadoop 3) 运行查询时出现以下错误

0: jdbc:hive2://localhost:10000> 从retail_db.orders 中选择count(1); 错误:处理语句时出错:FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.spark.SparkTask 返回代码 30041。未能为 Spark 会话 4aa97085-8a23-4ad8-a8c6-b701d41d7110 创建 Spark 客户端(状态=42000,代码=30041)

日志: 2020-06-19 12:18:28,704 INFO [HiveServer2-Background-Pool: Thread-72] ql.Driver:并发模式已禁用,未创建锁管理器 2020-06-19 12:18:28,731 错误 [HiveServer2-Background-Pool: Thread-72] 操作。操作:运行配置单元查询时出错: org.apache.hive.service.cli.HiveSQLException:处理语句时出错:FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.spark.SparkTask 返回代码 30041。无法为 Spark 会话 4aa97085-8a23-4ad8-a8c6-b701d41d7110 创建 Spark 客户端 在 org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:335) 在 org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:226) 在 org.apache.hive.service.cli.operation.SQLOperation.access$700(SQLOperation.java:87) 在 org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:316) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729) 在 org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork.run(SQLOperation.java:329) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748) 原因:org.apache.hadoop.hive.ql.metadata.HiveException:无法为 Spark 会话 4aa97085-8a23-4ad8-a8c6-b701d41d7110 创建 Spark 客户端 在 org.apache.hadoop.hive.ql.exec.spark.session.SparkSessionImpl.getHiveException(SparkSessionImpl.java:221) 在 org.apache.hadoop.hive.ql.exec.spark.session.SparkSessionImpl.open(SparkSessionImpl.java:92) 在 org.apache.hadoop.hive.ql.exec.spark.session.SparkSessionManagerImpl.getSession(SparkSessionManagerImpl.java:115) 在 org.apache.hadoop.hive.ql.exec.spark.SparkUtilities.getSparkSession(SparkUtilities.java:136) 在 org.apache.hadoop.hive.ql.exec.spark.SparkTask.execute(SparkTask.java:115) 在 org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:205) 在 org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:97) 在 org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:2664) 在 org.apache.hadoop.hive.ql.Driver.execute(Driver.java:2335) 在 org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:2011) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1709) 在 org.apache.hadoop.hive.ql.Driver.run(Driver.java:1703) 在 org.apache.hadoop.hive.ql.reexec.ReExecDriver.run(ReExecDriver.java:157) 在 org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:224) ... 11 更多 引起:java.lang.NoClassDefFoundError: org/apache/spark/SparkConf 在 org.apache.hadoop.hive.ql.exec.spark.HiveSparkClientFactory.generateSparkConf(HiveSparkClientFactory.java:263) 在 org.apache.hadoop.hive.ql.exec.spark.RemoteHiveSparkClient.(RemoteHiveSparkClient.java:98) 在 org.apache.hadoop.hive.ql.exec.spark.HiveSparkClientFactory.createHiveSparkClient(HiveSparkClientFactory.java:76) 在 org.apache.hadoop.hive.ql.exec.spark.session.SparkSessionImpl.open(SparkSessionImpl.java:87)

【问题讨论】:

【参考方案1】:

根据这个错误:Caused by: java.lang.NoClassDefFoundError: org/apache/spark/SparkConf

Hive 找不到 Spark 类。 如果您使用的是 Cloudera,则可以使用以下命令添加它们:

cd /opt/cloudera/parcels/CDH/lib;
cp  spark/jars/*scala-lib* hive/lib/;
cp  spark/jars/*spark-core* hive/lib/;
cp  spark/jars/*spark-netw*  hive/lib/;
cp  spark/jars/chill-java*.jar  hive/lib/;
cp  spark/jars/jackson-module-*  hive/lib/;
cp  spark/jars/jersey-server-*.jar  hive/lib/;
cp  spark/jars/json4s-ast_*.jar  hive/lib/;
cp  spark/jars/kryo-shaded-*.jar  hive/lib/;
cp  spark/jars/minlog-*.jar  hive/lib/;
cp  spark/jars/scala-xml_*.jar  hive/lib/;
cp  spark/jars/spark-launcher_*.jar  hive/lib/;
cp  spark/jars/spark-network-shuffle_*.jar  hive/lib/;
cp  spark/jars/spark-launcher_*.jar  hive/lib/;
cp  spark/jars/spark-unsafe_*.jar  hive/lib/;
cp  spark/jars/xbean-asm7-shaded-*.jar  hive/lib/;

您可以在这里找到更多信息:https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started 在配置 Hive 部分。

【讨论】:

以上是关于无法将 Spark 作为 Hive 执行引擎的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark:我如何理解和控制我的查询是在 Hive 引擎还是 Spark 引擎上执行的?

电商数仓数仓环境搭建

Spark2.0.0源码编译

Hive on Spark

在 Spark 上打印查询 Hive 的物理计划

hive 使用同一个session执行不同的sql注意事项