Подтвердить что ты не робот

Запрос в нескольких хранилищах улей с использованием Apache Spark

У меня есть искровое приложение, которое успешно соединится с улей и запросом на таблицах улей с использованием искрового двигателя.

Чтобы построить это, я просто добавил hive-site.xml в classpath приложения, и искра прочитает hive-site.xml, чтобы подключиться к его метасторе. Этот метод был предложен в списке рассылки.

Пока все хорошо. Теперь я хочу подключиться к двум хранилищам улей, и я не думаю, что добавление другого hive-site.xml в мой путь к классам будет полезным. Я упомянул немало статей и списков рассылок, но не смог найти никого, кто это сделал.

Может кто-нибудь предложить, как я могу это достичь?

Спасибо.

Указанные документы:

4b9b3361

Ответ 1

Я думаю, что это возможно, используя возможности Spark SQL для подключения и чтения данных из удаленных баз данных с помощью JDBC.

После исчерпывающих R и D я смог успешно подключиться к двум различным средам куста, используя JDBC, и загружать таблицы улья как DataFrames в Spark для дальнейшей обработки.

Сведения о средах

Hadoop-2.6.0

апач улей-2.0.0-бен

искровым 1.3.1-бен-hadoop2.6

Пример кода HiveMultiEnvironment.scala

    import org.apache.spark.SparkConf
    import org.apache.spark.sql.SQLContext
    import org.apache.spark.SparkContext
    object HiveMultiEnvironment {
      def main(args: Array[String]) {
        var conf = new SparkConf().setAppName("JDBC").setMaster("local")
        var sc = new SparkContext(conf)
        var sqlContext = new SQLContext(sc)

 // load hive table (or) sub-query from Environment 1

        val jdbcDF1 = sqlContext.load("jdbc", Map(
          "url" -> "jdbc:hive2://<host1>:10000/<db>",
          "dbtable" -> "<db.tablename or subquery>",
          "driver" -> "org.apache.hive.jdbc.HiveDriver",
          "user" -> "<username>",
          "password" -> "<password>"))
        jdbcDF1.foreach { println }

 // load hive table (or) sub-query from Environment 2

        val jdbcDF2 = sqlContext.load("jdbc", Map(
          "url" -> "jdbc:hive2://<host2>:10000/<db>",
          "dbtable" -> "<db.tablename> or <subquery>",
          "driver" -> "org.apache.hive.jdbc.HiveDriver",
          "user" -> "<username>",
          "password" -> "<password>"))
        jdbcDF2.foreach { println }
      }
// todo: business logic
    }

Другие параметры также могут быть установлены во время загрузки с использованием SqlContext, например, для установки partitionColumn. Подробности, найденные в разделе 'JDBC для других баз данных в справочном документе Spark: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html

Построить путь из Eclipse:

введите описание изображения здесь

Что я не пробовал

Использование HiveContext для среды 1 и SqlContext для среды 2

Надеюсь, это будет полезно.

Ответ 2

В текущей версии Spark это не представляется возможным. Чтение кода HiveContext в Spark Repo кажется, что hive.metastore.uris - это то, что настраивается для многих Metastores, но оно, по-видимому, используется только для избыточность через один и тот же метастор, а не совсем разные метасторы.

Более подробная информация здесь https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

Но вам, вероятно, придется собирать данные где-то, чтобы работать над ним в унисон. Или вы можете создать несколько контекстов искры для каждого хранилища.

Вы можете попробовать настроить hive.metastore.uris для нескольких разных метастор, но, вероятно, это не сработает. Если вы решите создать несколько контекстов Spark для каждого хранилища, убедитесь, что вы установили spark.driver.allowMultipleContexts, но это обычно не рекомендуется и может привести к неожиданным результатам.