Consulta en varias tiendas Hive usando Apache Spark


Tengo una aplicación de spark que se conectará con éxito a hive y consultará las tablas de hive usando spark engine.

Para construir esto, acabo de agregar hive-site.xml a classpath de la aplicación y spark leerá el hive-site.xml para conectarse a su metástore. Este método fue sugerido en la lista de correo de spark.

Hasta ahora todo bien. Ahora quiero conectarme a dos tiendas hive y no creo que agregar otro hive-site.xml a mi classpath sea útil. Me referí a bastantes artículos y spark mailing listas pero no pude encontrar a nadie haciendo esto.

Puede alguien sugerir cómo puedo lograr esto?

Gracias.

Documentos referidos:

Author: karthik manchala, 2015-09-22

2 answers

Creo que esto es posible haciendo uso de la capacidad de Spark SQL de conectar y leer datos de bases de datos remotas utilizando JDBC.

Después de una exhaustiva investigación y desarrollo, pude conectarme con éxito a dos entornos hive diferentes utilizando JDBC y cargar las tablas hive como marcos de datos en Spark para su posterior procesamiento.

Detalles del medio ambiente

Hadoop-2.6.0

Apache-hive-2.0.0-bin

Spark-1.3.1-bin-hadoop2. 6

Ejemplo de código Hivmultienvironment.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
    }

También se pueden establecer otros parámetros durante la carga usando SQLContext, como establecer partitionColumn. Detalles encontrados en la sección 'JDBC A otras bases de datos' en el documento de referencia de Spark: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html

Construir ruta desde Eclipse:

introduzca la descripción de la imagen aquí

Lo que no he Probado

Uso de HiveContext for Environment 1 y SQLContext for environment 2

Espero que esto sea útil.

 6
Author: Aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-07 11:01:18

Esto no parece ser posible en la versión actual de Spark. Al leer el código HiveContext en el repositorio de Spark, parece que hive.metastore.uris es algo configurable para muchos Metastores, pero parece ser utilizado solo para redundancia en el mismo metastore, no en metastores totalmente diferentes.

Más información aquí https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

Pero probablemente tendrá que agregar los datos en algún lugar con el fin de trabajar en él al unísono. O puede crear varios contextos de Spark para cada tienda.

Puede intentar configurar hive.metastore.uris para múltiples metastores diferentes, pero probablemente no funcione. Si decide crear múltiples contextos de Spark para cada tienda, asegúrese de establecer spark.driver.allowMultipleContexts, pero esto generalmente se desaconseja y puede conducir a resultados inesperados.

 0
Author: Stephen Carman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 16:48:17