Spark 1.5.1 не работает с кустом jdbc 1.2.0

Я пытаюсь выполнить запрос улья, используя spark 1.5.1 в автономном режиме и версию hive 1.2.0 jdbc.

Вот мой кусок кода:

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

Я использую спарк 1.5.1 в автономном режиме. Версия Hadoop - 2.6. Версия Hive - 1.2.0.

Вот зависимость, которую я добавил в проект Java в pom.xml

<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, подскажите, пожалуйста, совместимую версию hive для spark 1.5.1.

Заранее спасибо..!

1 ответ

Решение

Насколько я могу судить, вам не повезло с точки зрения использования разъема jdbc до тех пор, пока он не будет исправлен в восходящем направлении; "Метод не поддерживается" в этом случае - не просто несоответствие версий, а явное не реализованное в hive jdbc library branch-1.2, и даже если вы посмотрите на основную ветку hive jdbc или branch-2.0, она все еще не реализована:

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

Глядя на сайт Calls Spark, isSigned называется во время resolveTable в Spark 1.5 как и у мастера.

При этом, скорее всего, настоящая причина, по которой остается эта "проблема", заключается в том, что при взаимодействии с Hive ожидается, что вы будете напрямую подключаться к мета-хранилищу Hive, а не возиться с коннекторами jdbc; как это сделать, смотрите документацию Hive Tables в Spark. По сути, вы хотите думать о Spark как о равном/ замене Hive, а не как о потребителе Hive.

Таким образом, почти все, что вы делаете, это добавляете hive-site.xml к вашей искре conf/ каталог и убедитесь, что datanucleus банки под lib_managed/jars доступны для всех исполнителей Spark, а затем Spark обращается непосредственно к метастагу Hive для получения информации о схеме и извлекает данные непосредственно из вашей HDFS таким образом, чтобы их можно было легко распараллеливать в RDD.

Другие вопросы по тегам