java jdbc hadoop hive mapr

java - Conexión a la Maper Hrop remota a través de JDBC



hadoop hive (6)

Esta pregunta es similar, pero no es lo mismo, ya que Hive JDBC getConnection no regresa . Sin embargo, esto se trata de una conexión remota. También el metastore está presente en el directorio en el que se inició hiveserver2.

Tenemos un clúster mapr en ejecución en una máquina remota. Me gustaría conectarme a Hive en este clúster utilizando Java JDBC.

Por lo tanto, comenzamos el servidor de colmena:

/opt/mapr/hive/hive-0.11/bin/hiveserver2

La salida del proceso del servidor no contiene ningún mensaje de error. Escucha en el puerto 10000 según lo informado por netstat.

Intento conectarme al servidor como se describe en https://cwiki.apache.org/confluence/display/Hive/HiveClient , reemplazando localhost por el nombre del servidor donde se ejecuta hiveserver2:

Connection con = DriverManager.getConnection("jdbc:hive://myserver.example.com:10000/default", "", "");

Sin embargo, el programa depende exactamente de esta afirmación. Parece que no tiene conexión.

¿Posiblemente necesito proporcionar un nombre de usuario y una contraseña?

Inicialmente, utilicé el controlador org.apache.hadoop.hive.jdbc.HiveDriver.

Sin embargo, parece que debería usar el controlador org.apache.hive.jdbc.HiveDriver si el servidor de hive2 se está ejecutando. Ahora recibo la siguiente excepción:

Exception in thread "main" java.sql.SQLException: Could not establish connection to jdbc:hive2://myserver.example.com:10000/default: Required field ''client_protocol'' is unset! Struct:TOpenSessionReq(client_protocol:null) at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:246) at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:132) at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105) at java.sql.DriverManager.getConnection(DriverManager.java:579) at java.sql.DriverManager.getConnection(DriverManager.java:221) at HiveJdbcClient.main(HiveJdbcClient.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: org.apache.thrift.TApplicationException: Required field ''client_protocol'' is unset! Struct:TOpenSessionReq(client_protocol:null) at org.apache.thrift.TApplicationException.read(TApplicationException.java:108) at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71) at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:144) at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:131) at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:237) ... 10 more


Creo que debes especificar el nombre de usuario. También debe ser hive2 no colmena ya que está utilizando hiveserver2. Intenta modificar tu url de conexión:

Connection con = DriverManager.getConnection("jdbc:hive2://myserver.example.com:10000/default", "<user>", "");

Se da en el enlace Hive2

Espero que esto ayude...!!!


Tuve el mismo problema y pude solucionarlo agregando la dependencia correcta a mi archivo pom.xml. Estaba obteniendo el último lanzamiento de apache de colmena de maven central y cambié al uso del lanzamiento cdh4 del repositorio de cloudera. Entonces, lo que está viendo puede ser un síntoma de tener una dependencia incorrecta de hive-jdbc. Aquí está el fragmento de maven que agregué a mi archivo pom:

<repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> ... <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>0.10.0-cdh4.3.2</version> </dependency>

Aquí hay un enlace sobre el repositorio cloudera .

Además, agregar "; auth = noSasl" a la URL hizo que mi aplicación se bloqueara, así que la eliminé.


También tuve el mismo problema. Verifique si el servidor es accesible desde el cliente en el puerto 10000 (el servidor y el puerto están habilitados, ningún firewall está restringiendo) también verifique que el servidor de colmena esté funcionando. si es así, entonces debería funcionar. el siguiente código funciona para mí para mapr hive.

si tiene alguna consulta relacionada con mapr, consulte answers.mapr.com, esta contiene la mayor parte de la información que podría estar requiriendo.

import java.sql.SQLException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.sql.DriverManager; import org.apache.log4j.Logger; import java.io.*; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.SequenceFile.*; import org.apache.hadoop.io.SequenceFile.Writer; import org.apache.hadoop.io.*; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.io.Writable; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.*; public class HiveJdbcClient { //private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; /** * @param args * @throws SQLException **/ private static Logger mLogger = Logger.getLogger(HiveJdbcClient.class); private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { HiveJdbcClient myJob = new HiveJdbcClient(); myJob.execute(); } public void execute() throws SQLException { //mLogger.info("Start HiveJob"); System.out.println("Start HiveJob"); try { Class.forName(driverName); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } Connection con = DriverManager.getConnection("jdbc:hive://myserver:10000/default", "", ""); Statement stmt = con.createStatement(); String sql = "SHOW TABLES"; //String tableName = "testHiveDriverTable"; // ResultSet res1 = stmt.executeQuery("create table " + tableName + " (key int, value string)"); System.out.println("Running: " + sql); ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1)); } //mLogger.info("HiveJob executed!"); System.out.println("HiveJob executed!"); } }



En mi caso, agregando el ;auth=noSasl a la cadena de conexión JDBC resolvió la interminable espera de la conexión.

jdbc:hive2://server:10000/default;auth=noSasl