2015-04-07 142 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。如果你有代碼,請給我。 –