2015-04-07 79 views
2

我想使用java代码连接MetaStore。我不知道如何在Hive-Site.xml文件中设置配置设置,以及在何处发布Hive-Site.xml文件。请帮忙。如何在Hive-Site.xml文件中为配置单元Metastore连接设置配置?

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)); 
      } 
     }   

    } 
} 

回答

0

蜂房的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> 

jdbc:mysql://localhost:3306/hive3306是你的MySQL默认端口; hive是我们的配置单元Metastore的mysql数据库名称。 将hiveuser更改为您的mysql配置单元用户名,并将hivepass更改为您的mysql配置单元密码。

做这一步终端,如果你还没有在MySQL创建的蜂巢metastore数据库:

mysql -u root -p

输入您的MySQL root密码。

mysql> create database hive;

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

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

mysql> flush privileges;

这里,hiveuserhivepass你分别给出任何用户名和密码蜂巢metastore。

注意:您需要有的mysql-JDBC-connector.jar$ HIVE_HOME/lib目录$ HADOOP_HOME/lib目录

0

关于蜂房的site.xml这里来自我的测试机器的样品。这是为了在本地主机上安装MySql服务器来设置配置单元Metastore。

<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> 

这个文件,你需要内部<system_path>/apache-hive-x.xx.x-bin/conf目录

地方我没有关于如何在Java中使用此文件太多想法。但是,在Java代码中指定的连接字符串,你可以做到这一点,如下

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); 
    } 
} 
+0

感谢您宝贵的答复。但我试图使用Java代码而不是MySql连接Hive-Metastore。如果你有代码,请给我。 –

相关问题