Quiero conectar MetaStore utilizando el código de java. No tengo idea de cómo establecer la configuración en Hive-Site.xml archivo y donde voy a publicar la Hive-Site.xml archivo. Por favor, ayudar.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;

public class HiveMetastoreJDBCTest {

    public static void main(String[] args) throws Exception {

        Connection conn = null;
        try {
            HiveConf conf = new HiveConf();
            conf.addResource(new Path("file:///path/to/hive-site.xml"));
            Class.forName(conf.getVar(ConfVars.METASTORE_CONNECTION_DRIVER));
            conn = DriverManager.getConnection(
                    conf.getVar(ConfVars.METASTORECONNECTURLKEY),
                    conf.getVar(ConfVars.METASTORE_CONNECTION_USER_NAME),
                    conf.getVar(ConfVars.METASTOREPWD));

            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(
                "select t.tbl_name, s.location from tbls t " +
                "join sds s on t.sd_id = s.sd_id");
            while (rs.next()) {
                System.out.println(rs.getString(1) + " : " + rs.getString(2));
            }
        }        

    }
}

OriginalEl autor mohit sharma | 2015-04-07

2 Comentarios

  1. 1

    Añadir estas líneas en su hive-site.xml:

    <property>
      <name>hive.metastore.local</name>
      <value>true</value>
    </property>
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://localhost:3306/hive</value>
    </property>
    <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>hiveuser</value>
    </property>
    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>hivepass</value>
    </property>
    

    En jdbc:mysql://localhost:3306/hive, 3306 predeterminado es puerto de mysql; hive es nuestra base de datos mysql nombre de la colmena metastore.
    Cambio hiveuser a tu mysql colmena nombre de usuario y hivepass a tu mysql colmena contraseña.

    Hacer este paso en la terminal, si no ha creado una base de datos para la colmena metastore en mysql:

    mysql -u root -p

    Introduzca su contraseña root de mysql.

    mysql> create database hive;

    mysql> create user 'hiveuser'@'%' IDENTIFIED BY 'hivepass';

    mysql> GRANT all on *.* to 'hiveuser'@localhost identified by 'hivepass';

    mysql> flush privileges;

    Aquí, hiveuser y hivepass son cualquier nombre de usuario y la contraseña que das por colmena metastore respectivamente.

    NOTA: necesita tener mysql-jdbc-connector.jar en $HIVE_HOME/lib y
    $HADOOP_HOME/lib

    OriginalEl autor Rajesh N

  2. 0

    Respecto Hive-site.xml aquí se muestra de mi máquina de ensayo. Esto es para la configuración de la colmena metastore con el servidor MySql instalado en localhost.

    <configuration>
    <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
     <description>metadata is stored in a MySQL server</description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionDriverName</name>
     <value>com.mysql.jdbc.Driver</value>
     <description>MySQL JDBC driver class</description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionUserName</name>
     <value>hive</value>
     <description>user name for connecting to mysql server </description>
    </property>
    <property>
     <name>javax.jdo.option.ConnectionPassword</name>
     <value>123456</value>
     <description>password for connecting to mysql server </description>
    </property>
    </configuration>
    

    Este archivo, usted necesita un lugar dentro de <system_path>/apache-hive-x.xx.x-bin/conf directorio

    Yo no tengo mucha idea acerca de cómo utilizar este archivo en java. Pero al especificar la cadena de conexión en el código java puede hacerlo de la siguiente

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class WriteToHive {
        private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
        static Connection con;
        static Statement stmt;
    
        public WriteToHive() throws SQLException, ClassNotFoundException, Exception {
            try {
                Class.forName(driverName);
            } catch (ClassNotFoundException e){
                e.printStackTrace();
                throw new ClassNotFoundException("No JDBC Hive Driver found");
                //System.exit(1);
            } catch (Exception e) {
                e.printStackTrace();
                throw new Exception(e);
                //System.exit(1);
            }
    
            con = DriverManager.getConnection("jdbc:hive://localhost:10000/rajen","","");
            stmt = con.createStatement();
        }
    
        public static void main(String[] args) throws SQLException {
            try {
                Class.forName(driverName);
            } catch (ClassNotFoundException e){
                e.printStackTrace();
                System.exit(1);
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(1);
            }
            con = DriverManager.getConnection("jdbc:hive://localhost:10000/rajen","","");
            stmt = con.createStatement();
            //Connection con = DriverManager.getConnection("jdbc:hive://","","");
            String tableName = "company_mas_hive_eclipse_trial";
    
            ResultSet res = stmt.executeQuery("use rajen");
    
            String sql = "DROP TABLE IF EXISTS " + tableName;
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
    
            sql = "CREATE TABLE IF NOT EXISTS rajen.company_mas_hive_eclipse_trial (" +
                  "Name string," + 
                  "dateofincorporation string," + 
                  "country string)" +
                  "ROW FORMAT DELIMITED FIELDS TERMINATED BY \",\"";
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
    
            sql = "show tables '" + tableName + "'";
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
    
            if (res.next()){
                System.out.println(res.getString(1));
            }
    
            sql = "describe " + tableName;
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
            System.out.println("=========================================");
            while (res.next()) {
              System.out.println(res.getString(1) + "\t" + res.getString(2));
            }
            System.out.println("=========================================");
    
            //load data into table
            //NOTE: filepath has to be local to the hive server
            //NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
            String filepath = "/home/seo/Refrence_Doc/sampledata/companymas"; //"/rajen/companymas";
            sql = "load data local inpath '" + filepath + "' into table " + tableName;
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
    
            //load data into table
            //NOTE: filepath has to be local to the hive server
            //NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
            filepath = "/rajen/companymas";
            sql = "load data inpath '" + filepath + "' into table " + tableName;
            System.out.println("Running: " + sql);
            //res = stmt.executeQuery(sql);
    
            //select * query
            sql = "select * from " + tableName;
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
            while (res.next()) {
                System.out.println(String.valueOf(res.getString(1)) + "\t" + res.getString(2));
            }
    
            //regular hive query
            sql = "select count(*) from " + tableName;
            System.out.println("Running: " + sql);
            res = stmt.executeQuery(sql);
            while (res.next()) {
                System.out.println(res.getString(1));
            }
        }
    
        public void createTable(String def, String dbname) throws SQLException{
            @SuppressWarnings("unused")
            ResultSet res = stmt.executeQuery("use " + dbname);
            stmt.executeQuery(def);
        }
    
        public static void loadData(String filepath, String tableName) throws SQLException{
            stmt.executeQuery("load data local inpath '" + filepath + "' into table " + tableName);
        }
    }
    
    Gracias por su valiosa respuesta. Pero estoy tratando de conectar a la Colmena Metastore utilizando el código java no de MySql. Si tienes el código por favor me dan.

    OriginalEl autor Rajen Raiyarela

Dejar respuesta

Please enter your comment!
Please enter your name here