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.