Spark 1.5.1 不适用于 hive jdbc 1.2.0

Posted

技术标签:

【中文标题】Spark 1.5.1 不适用于 hive jdbc 1.2.0【英文标题】:Spark 1.5.1 not working with hive jdbc 1.2.0 【发布时间】:2015-12-03 13:46:31 【问题描述】:

我正在尝试在独立模式下使用 spark 1.5.1 和 hive 1.2.0 jdbc 版本执行 hive 查询。

这是我的一段代码:

private static final String HIVE_DRIVER = "org.apache.hive.jdbc.HiveDriver";
private static final String HIVE_CONNECTION_URL = "jdbc:hive2://localhost:10000/idw";
private static final SparkConf sparkconf = new SparkConf().set("spark.master", "spark://impetus-i0248u:7077").set("spark.app.name", "sparkhivesqltest")
                .set("spark.cores.max", "1").set("spark.executor.memory", "512m");

private static final JavaSparkContext sc = new JavaSparkContext(sparkconf);
private static final SQLContext sqlContext = new SQLContext(sc);
public static void main(String[] args)                 
    //Data source options
    Map<String, String> options = new HashMap<String, String>();
    options.put("driver", HIVE_DRIVER);
    options.put("url", HIVE_CONNECTION_URL);
    options.put("dbtable", "(select * from idw.emp) as employees_name");
    DataFrame jdbcDF =    sqlContext.read().format("jdbc").options(options).load();    
    

我在sqlContext.read().format("jdbc").options(options).load(); 遇到错误

线程“main”java.sql.SQLException 中的异常:方法不受支持 在 org.apache.hive.jdbc.HiveResultSetMetaData.isSigned(HiveResultSetMetaData.java:143)

org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:135) 在 org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.(JDBCRelation.scala:91) 在 org.apache.spark.sql.execution.datasources.jdbc.DefaultSource.createRelation(DefaultSource.scala:60) 在 org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:125) 在 org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)

我在独立模式下运行 spark 1.5.1 Hadoop版本是2.6 Hive 版本是 1.2.0

这是我在 pom.xml 中的 java 项目中添加的依赖项

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>1.5.1</version>
</dependency>

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.10</artifactId>
    <version>1.5.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>1.2.0</version>
    <exclusions>
    <exclusion>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
    </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.2.0</version>
</dependency>

谁能帮我解决这个问题? 如果有人在 hive jdbc 中使用了 spark 1.5.1,那么请告诉我 spark 1.5.1 的 hive 兼容版本。

提前谢谢你..!

【问题讨论】:

【参考方案1】:

据我所知,不幸的是,在上游修复之前,您在使用 jdbc 连接器方面并不走运;在这种情况下,“不支持的方法”不仅仅是版本不匹配,而是在 hive jdbc library branch-1.2 中明确未实现,即使您查看 hive jdbc master branch 或 branch-2.0,它仍然没有实现:

public boolean isSigned(int column) throws SQLException 
  throw new SQLException("Method not supported");

查看 Spark 调用站点,isSigned 在Spark 1.5 和master 中的resolveTable 期间被调用。

也就是说,这个“问题”仍然存在的真正原因很可能是,当与 Hive 交互时,您应该直接连接到 Hive 元存储,而不是需要弄乱 jdbc 连接器;请参阅Hive Tables in Spark 文档了解如何执行此操作。从本质上讲,您希望将 Spark 视为 Hive 的同等/替代品,而不是 Hive 的消费者。

这样,您几乎只需将hive-site.xml 添加到您的Spark 的conf/ 目录并确保lib_managed/jars 下的datanucleus jar 可用于所有Spark 执行程序,然后Spark 直接与Hive 对话用于架构信息的元存储,并以适合并行化 RDD 的方式直接从您的 HDFS 获取数据。

【讨论】:

即使在 2.3 中,现在也不支持 github.com/apache/hive/blob/branch-2.3/jdbc/src/java/org/apache/…。让 Spark 访问 Hive Metastore 的问题是细粒度的访问控制。我们该如何处理?

以上是关于Spark 1.5.1 不适用于 hive jdbc 1.2.0的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Hive 上查找数字不适用于类似查询

Apache Spark - UDF 似乎不适用于 spark-submit

本机库 lz4 不适用于 Spark

Spark 整合hive 实现数据的读取输出

mkString 和 sortByKey 不适用于 Spark 中的数组

Apache Spark:广播连接不适用于缓存的数据帧