Spark 1.5.1 不适用于配置单元 jdbc 1.2.0

Spark 1.5.1 not working with hive jdbc 1.2.0

我正在尝试在独立模式下使用 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) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.(JDBCRelation.scala:91) at org.apache.spark.sql.execution.datasources.jdbc.DefaultSource.createRelation(DefaultSource.scala:60) at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:125) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)

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

下面是我在pom.xmljava项目中添加的依赖

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

谁能帮我解决这个问题? 如果有人用过 spark 1.5.1 和 hive jdbc,那么你能告诉我 spark 1.5.1 的 hive 兼容版本吗?

提前谢谢你..!

据我所知,不幸的是,在上游修复 jdbc 连接器之前,您的运气不太好; "Method not supported" 在这种情况下不仅仅是版本不匹配,而且在 hive jdbc library branch-1.2 and even if you look at the hive jdbc master branch or branch-2.0 中明确没有实现它仍然没有实现:

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

查看 Spark 调用站点,isSignedresolveTable 期间在 Spark 1.5 as well as at master 期间被调用。

也就是说,这个 "issue" 仍然存在的真正原因很可能是当与 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 获取数据。