如何使用配置单元支持创建sparksession(因“未找到配置单元类”而失败)?

3okqufwl  于 2021-06-25  发布在  Hive
关注(0)|答案(10)|浏览(321)

尝试运行以下代码时出错:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class App {
  public static void main(String[] args) throws Exception {
    SparkSession
      .builder()
      .enableHiveSupport()
      .getOrCreate();        
  }
}

输出:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found.
    at org.apache.spark.sql.SparkSession$Builder.enableHiveSupport(SparkSession.scala:778)
    at com.training.hivetest.App.main(App.java:21)

如何解决?

c8ib6hqw

c8ib6hqw1#

在我的情况下,我必须检查
包括具有“提供”范围的依赖项
在intellij中的“我的运行/调试配置”下

uxhixvfz

uxhixvfz2#

尽管所有最重要的答案都是正确的,但是你仍然面临问题,那么请记住问题中描述的错误仍然可能发生,即使你在pom中提到了jar。
为了解决此问题,请确保所有依赖项的版本应相同,并且作为标准实践,为spark版本和scala版本维护一个全局变量,并替换这些值以避免由于不同版本而产生任何冲突。
仅供参考:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xxx.rehi</groupId>
    <artifactId>Maven9211</artifactId>
    <version>1.0-SNAPSHOT</version>
<properties>
    <scala.version>2.12</scala.version>
    <spark.version>2.4.4</spark.version>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_${scala.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>

</dependencies>
</project>
j0pj023g

j0pj023g3#

向maven项目添加以下依赖项。

<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.11</artifactId>
        <version>2.0.0</version>
</dependency>
yptwkmov

yptwkmov4#

[更新我的答案]这个关于stackoverflow的答案是正确答案链接。
我还面临使用hivesupport构建和运行spark的问题。基于上述答案,我在spark2.12.8项目中做了以下工作。
已将my build.sbt更新为以下内容
手动删除.idea/库中的文件
在sbtshell窗口中单击“刷新所有sbt项目”按钮(我正在使用intellij)
我现在可以运行项目没有任何问题。

libraryDependencies += "junit" % "junit" % "4.12" % Test
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.4.2",
  "org.apache.spark" %% "spark-sql" % "2.4.2",
  "org.apache.spark" %% "spark-hive" % "2.4.2" % "provided",
  "org.scalatest" %% "scalatest" % "3.0.3" % Test
)
t1rydlwq

t1rydlwq5#

我查看了源代码,发现尽管有hivesessionstate(在spark hive中),但还需要另一个类hiveconf来启动sparksession。而且hiveconf不包含在spark-hive*jar中,也许您可以在与hive相关的jar中找到它并将它放在类路径中。

nwlls2ji

nwlls2ji6#

sbt使用
// https://mvnrepository.com/artifact/org.apache.spark/spark-hive

libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.1.0"

我们使用了spark-core-2.1.0和spark-sql-2.1.0

yvfmudvl

yvfmudvl7#

我的spark2.4.1依赖项的完整列表在这里

<dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.12</artifactId>
      <version>2.4.1</version>
  </dependency>

  <dependency>
      <groupId>org.apache.calcite</groupId>
      <artifactId>calcite-avatica</artifactId>
      <version>1.6.0</version>
  </dependency>
  <dependency>
      <groupId>org.apache.calcite</groupId>
      <artifactId>calcite-core</artifactId>
      <version>1.12.0</version>
  </dependency>
  <dependency>
      <groupId>org.spark-project.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.2.1.spark2</version>
  </dependency>
  <dependency>
      <groupId>org.spark-project.hive</groupId>
      <artifactId>hive-metastore</artifactId>
      <version>1.2.1.spark2</version>
  </dependency>
  <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.6.7</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.6.7.1</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.6.7</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
  <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>3.0.9</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.codehaus.janino/commons-compiler -->
  <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>commons-compiler</artifactId>
      <version>3.0.9</version>
  </dependency>
ev7lccsx

ev7lccsx8#

我也有同样的问题。我可以通过添加以下依赖项来解决它(我通过参考spark-hive 2.11 mvn存储库页面的编译依赖项部分解决了此列表:

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_${scala.binary.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.calcite</groupId>
            <artifactId>calcite-avatica</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.calcite</groupId>
            <artifactId>calcite-core</artifactId>
            <version>1.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.spark-project.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1.spark2</version>
        </dependency>
        <dependency>
            <groupId>org.spark-project.hive</groupId>
            <artifactId>hive-metastore</artifactId>
            <version>1.2.1.spark2</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

其中scala.binary.version=2.11和spark.version=2.1.0

<properties>
      <scala.binary.version>2.11</scala.binary.version>
      <spark.version>2.1.0</spark.version>
    </properties>
igetnqfo

igetnqfo9#

确保您正在通过spark submit脚本运行jar:

${SPARK_HOME}/bin/spark-submit <settings> <your-jar-name>

它是一个脚本,加载到所需的类中,并在执行jar之前提供scala支持。
另外,正如其他人所提到的,请确保您也加载了所需的依赖项。
示例:运行spark会话

pom.xml
---
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-hive_2.11</artifactId>
  <version>2.4.4</version>
  <scope>compile</scope>
</dependency>

Test.java
---
SparkSession spark = SparkSession
    .builder()
    .appName("FeatureExtractor")
    .config("spark.master", "local")
    .config("spark.sql.hive.convertMetastoreParquet", false)
    .config("spark.submit.deployMode", "client")
    .config("spark.jars.packages", "org.apache.spark:spark-avro_2.11:2.4.4")
    .config("spark.sql.warehouse.dir", "/user/hive/warehouse")
    .config("hive.metastore.uris", "thrift://hivemetastore:9083")
    .enableHiveSupport()
    .getOrCreate();

那么要通过spark执行这个代码:

bin/spark-submit \
--class com.TestExample \
--executor-memory 1G \
--total-executor-cores 2 \
test.jar

感谢@lamber ken帮助我解决这个问题。
更多信息:
spark文档:提交应用程序
异常无法使用配置单元支持示例化sparksession,因为找不到配置单元类

368yc8dk

368yc8dk10#

热释光;博士,你必须确保spark sql spark-hive 依赖项和所有可传递的依赖项在运行时都可以在sparksql应用程序的类路径上使用(而不仅仅是编译所需的构建时间)。
换句话说,你必须 org.apache.spark.sql.hive.HiveSessionStateBuilder 以及 org.apache.hadoop.hive.conf.HiveConf spark应用程序类路径上的类(与sbt或maven关系不大)。
前者 HiveSessionStateBuilder 是的一部分 spark-hive 依赖关系(包括所有可传递的依赖关系)。
后者 HiveConf 是的一部分 hive-exec 依赖关系(即上述的可传递依赖关系 spark-hive 依赖关系)。

相关问题