spark example apache-spark hive spark-hive

apache-spark - example - apache hive



Consultando en mĂșltiples tiendas Hive usando Apache Spark (2)

Tengo una aplicación de chispa que se conectará con éxito a colmena y consultará en tablas de colmena utilizando el motor de chispa.

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

Hasta aquí todo bien. Ahora quiero conectarme a dos tiendas de colmenas y no creo que sea útil agregar otro hive-site.xml a mi classpath. Remití bastantes artículos y generé listas de correo pero no pude encontrar a nadie que hiciera esto.

¿Alguien puede sugerir cómo puedo lograr esto?

Gracias.

Documentos referidos:


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

Después de una exhaustiva I + D, pude conectar con éxito dos entornos de colmenas diferentes utilizando JDBC y cargar las tablas de colmenas como marcos de datos en Spark para su posterior procesamiento.

Detalles del entorno

hadoop-2.6.0

apache-hive-2.0.0-bin

spark-1.3.1-bin-hadoop2.6

Código Sample 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 }

Otros parámetros también se pueden establecer durante la carga usando SqlContext, como establecer partitionColumn. Los detalles se encuentran 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

Compilar ruta desde Eclipse:

Lo que no he intentado

Uso de HiveContext para Environment 1 y SqlContext para environment 2

Espero que esto sea útil.


Esto no parece ser posible en la versión actual de Spark. Al leer el código de HiveContext en Spark Repo, parece que hive.metastore.uris es algo configurable para muchos Metastores, pero parece ser usado 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 para trabajar en ello al unísono. O puede crear múltiples Contextos de Chispa para cada tienda.

Podría intentar configurar el hive.metastore.uris para múltiples meta-almacenes diferentes, pero probablemente no funcionará. Si decide crear varios contextos Spark para cada tienda, asegúrese de establecer spark.driver.allowMultipleContexts pero esto generalmente se desaconseja y puede generar resultados inesperados.