如何使用Hive支持创建SparkSession(未通过"找不到Hive类")?

时间:2016-09-12 06:31:16

标签: java apache-spark hive apache-spark-sql

当我尝试运行此代码时,我收到此错误。

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 {
        String warehouseLocation = "file:" + System.getProperty("user.dir") + "spark-warehouse";
        SparkSession spark = SparkSession
          .builder().master("local")
          .appName("Java Spark Hive Example")
          .config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport()
          .getOrCreate();

        String path = "/home/cloudera/Downloads/NetBeansProjects/sparksql1/src/test/Employee.json";

        spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)");
        spark.sql("LOAD DATA LOCAL INPATH '"+path+"' INTO TABLE src");



        //load from HDFS

         Dataset<Row> df = spark.read().json(path);

         df.registerTempTable("temp_table");

         spark.sql("create table TEST.employee as select * from temp_table");

         df.printSchema();
         df.show();

        }
}

输出:

  

线程中的异常&#34; main&#34; java.lang.IllegalArgumentException:无法使用Hive支持实例化SparkSession,因为找不到Hive类。       在org.apache.spark.sql.SparkSession $ Builder.enableHiveSupport(SparkSession.scala:778)       在com.training.hivetest.App.main(App.java:21)

如何解决?

9 个答案:

答案 0 :(得分:26)

将以下依赖项添加到您的maven项目。

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

答案 1 :(得分:3)

tl; dr 您必须确保在Spark SQL应用程序的CLASSPATH上的运行时中可以使用Spark SQL的spark-hive依赖项和所有传递依赖项(不是仅编译所需的构建时间)。


换句话说,您必须在Spark应用程序的CLASSPATH上具有org.apache.spark.sql.hive.HiveSessionStateBuilderorg.apache.hadoop.hive.conf.HiveConf类(与sbt或maven无关)。

HiveSessionStateBuilderspark-hive依赖项(包括所有传递性依赖项)的一部分。

后一个HiveConfhive-exec依赖项的一部分(这是上述spark-hive依赖项的传递性依赖项)。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我遇到了同样的问题。我可以通过添加以下依赖项来解决它。 (我通过引用compile dependencies section of spark-hive_2.11 mvn repository page)来解析此列表:

this.props.item === {"user_id":1,"stuff":"more stuff"}

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

 <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>

答案 4 :(得分:1)

确保您正在通过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 Documentation: Submitting Applications

Exception Unable to instantiate SparkSession with Hive support because Hive classes are not found

答案 5 :(得分:0)

我的Spark 2.4.1依赖关系的完整列表在这里

limit_req_zone $http_authorization_key ...

答案 6 :(得分:0)

[更新我的答案]关于StackOverflow的答案正确-answer link

我还遇到了使用HiveSupport构建和运行Spark的问题。基于以上答案,我在Spark 2.12.8项目中进行了以下操作。

  1. 将我的build.sbt更新为以下内容
  2. 手动删除.idea / libraries中的文件
  3. 在SBT Shell窗口中单击“刷新所有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
)

答案 7 :(得分:0)

对于 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

答案 8 :(得分:0)

就我而言,我必须检查

包括具有“已提供”范围的依赖项

在我的intellij中的运行/调试配置