Javaコードを使用してMetaStoreに接続したい。Hive-Site.xmlファイルで構成設定を設定する方法と、Hive-Site.xmlファイルを投稿する場所がわからない。お願いします。助けて。
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));
}
}
}
}
これらの行を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>
jdbc:mysql://localhost:3306/Hive
、3306
はデフォルトのmysqlポートです。 Hive
は、Hiveメタストアのmysqlデータベース名です。 hiveuser
をmysqlHiveのユーザー名に変更し、hivepass
をmysqlHiveのパスワードに変更します。
MysqlでHiveメタストアのデータベースを作成していない場合は、ターミナルで次の手順を実行します。
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;
ここで、hiveuser
とhivepass
は、それぞれHiveメタストアに指定するユーザー名とパスワードです。
注:$ Hive_HOME/libおよび$ HADOOP_HOME/libにmysql-jdbc-connector.jarが必要です。
Hive-site.xmlに関しては、ここに私のテストマシンからのサンプルがあります。これは、ローカルホストにインストールされたMySqlサーバーを使用してHiveメタストアをセットアップするためのものです。
<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);
}
}