Spark 1.5.1无法使用hive jdbc 1.2.0

时间:2015-12-03 13:46:32

标签: apache-spark apache-spark-sql

我试图在独立模式和hive 1.2.0 jdbc版本中使用spark 1.5.1执行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,那么请告诉我兼容版本的hive for spark 1.5.1。

提前谢谢..!

1 个答案:

答案 0 :(得分:6)

据我所知,在使用jdbc连接器直到它上游固定之前,你不幸运气不好; &#34;方法不受支持&#34;在这种情况下,版本不仅仅是版本不匹配,而是在hive jdbc library branch-1.2中明确没有实现,即使您查看hive jdbc master branchbranch-2.0它仍然没有实现:< / p>

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

查看Spark调用网站,isSigned期间Spark 1.5以及master期间会调用resolveTable

那就是说,这很可能是这个&#34;问题的真正原因。遗留下来的是,当与Hive进行交互时,您需要直接连接到Hive Metastore,而不是需要使用jdbc连接器。有关如何执行此操作,请参阅Hive Tables in Spark文档。从本质上讲,您希望将Spark视为等于 /替换Hive,而不是成为Hive的消费者。

通过这种方式,您所做的就是将hive-site.xml添加到Spark的conf/目录中,并确保datanucleus下的lib_managed/jars个广告可用于 var machineScheduling = function(T, finish_time, i, jobs) { var max_jobs = []; (function rec(){ if (i < 0 || T[i-1][0] === 0) { if (jobs.length > max_jobs.length) max_jobs = jobs; return 0; } var new_finish_time = T[i-1][0]; var new_jobs = jobs.slice(); var A = rec(finish_time, i-1, new_jobs); var B = 1+rec(new_finish_time, i-1, new_jobs.push(i)); return Math.max(A, B); })(T, finish_time, T.length, []); }; 所有Spark执行器,然后Spark直接与Hive Metastore对话以获取模式信息,并以适合精确并行化的RDD的方式直接从HDFS获取数据。