1,本例将hadoop的错误日志经过Hive导入到mysql中。这里不讨论实验的实际意义,目的是通过调用Hive的java API,加深对Hive的理解,熟悉Hive的运用。
2,实验的逻辑:
2.1,将hadoop的日志交由Hive数据仓库管理。
2.2,由Hive数据仓库对日志数据进行清理,将error级别的日志信息导入到mysql数据库中。
逻辑上其实及其简单:将hadoop日志导入到Hive 中,将Hive中的部门日志导入到mysql中。
3,实验详细步骤:
3.1,创建java工程,导入hive安装包下lib中的所有jar包,导入hadoop的核心包,导入mysql的驱动包。
3.2新建两个类HiveUtil和MysqlUtil,分别用来操作Hive和mysql。
HiveUtil中包含五个函数:获取Hive数据仓库的连接、创建数据表、向数据库表中导入数据、查询、关闭数据仓库连接。
package cn.lcy.hive;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class HiveUtil {
<span style="color:#ff0000;"> private static java.sql.Connection hiveConn=null;
//连接Hive数据仓库,注意Hive数据仓库的驱动和连接字符串
</span> public static Connection getHiveConn(){
if(hiveConn==null){
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
hiveConn=DriverManager.getConnection("jdbc:hive://hadoop0:10000/default","","");
} catch (Exception e) {
e.printStackTrace();
}
}
return hiveConn;
}
<span style="color:#ff0000;">//创建数据仓库表
</span> public static void createTable(String hiveSql){
try {
Statement stmt = hiveConn.createStatement();
stmt.executeQuery(hiveSql);
} catch (SQLException e) {
e.printStackTrace();
}
}
<span style="color:#ff0000;"> //向数据仓库中载入数据
</span> public static void loadData(String hiveSql){
try {
Statement stmt = hiveConn.createStatement();
stmt.executeQuery(hiveSql);
} catch (SQLException e) {
e.printStackTrace();
}
}
<span style="color:#ff0000;">//根据条件查询数据
</span> public static ResultSet queryHive(String hiveSql){
try {
Statement stmt = hiveConn.createStatement();
ResultSet querySet=stmt.executeQuery(hiveSql);
return querySet;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
<span style="color:#ff0000;">//关闭连接
</span> public static void closeHiveConnection(){
if(hiveConn!=null){
try {
hiveConn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
MysqlUtil包含三个函数:获取mysql数据库的连接、从Hive数据仓库中导入符合条件的数据、关闭数据连接。
package cn.lcy.hive;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MysqlUtil {
private static Connection conn=null;
//连接mysql数据库
public static Connection getConn(){
if(conn==null){
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://hadoop0:3306/hive?useUnicode=true&characterEncoding=GBK","root","admin");
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
//查询Hive中的数据并导入到mysql数据库中
public static void loadDataFromHive(String hiveSql){
ResultSet queryResultFromHive = HiveUtil.queryHive(hiveSql);
List<HadoopLogInfo> list=new ArrayList<HadoopLogInfo>();
HadoopLogInfo logInfo=null;
try {
while(queryResultFromHive.next()){
logInfo=new HadoopLogInfo();
logInfo.setDate(queryResultFromHive.getString(1));
logInfo.setTime(queryResultFromHive.getString(2));
logInfo.setLog_level(queryResultFromHive.getString(3));
logInfo.setLog_from(queryResultFromHive.getString(4));
logInfo.setLog_info(queryResultFromHive.getString(5)+queryResultFromHive.getString(6)
+queryResultFromHive.getString(7));
list.add(logInfo);
}
} catch (SQLException e) {
e.printStackTrace();
}
Connection conn=getConn();
try {
String sql = "insert into hadooplog(logdate,logtime,loglevel,logfrom,loginfo) values(?,?,?,?,?)";
PreparedStatement prepareStatement = conn.prepareStatement(sql);
for(HadoopLogInfo logInfo2:list){
prepareStatement.setString(1, logInfo2.getDate());
prepareStatement.setString(2, logInfo2.getTime());
prepareStatement.setString(3, logInfo2.getLog_level());
prepareStatement.setString(4, logInfo2.getLog_from());
prepareStatement.setString(5, logInfo2.getLog_info());
}
prepareStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void closeMysqlConnection(){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Main函数:
package cn.lcy.hive;
public class Hive2Mysql {
public static void main(String[] args) {
//连接Hive数据仓库
HiveUtil.getHiveConn();
//创建表
HiveUtil.createTable("create table if not exists loghadoop (datelog string,time string,loglevel string ,logfrom
string,info1 string ,info2 string,info3 string)row format delimited fields terminated by ' '");
//向表中加载数据
HiveUtil.loadData("load data local inpath '/usr/local/testdata/testlog' into table loghadoop");
//连接mysql数据仓库
MysqlUtil.getConn();
//查询Hive数据库并加载到mysql中。这里要注意作为查询条件的类的值要用引号包起来。
MysqlUtil.loadDataFromHive("select *from loghadoop where loglevel=<span style="color:#ff0000;">'</span>"+args[0<span style="color:#ff0000;">]+"'");
</span> HiveUtil.closeHiveConnection();
MysqlUtil.closeMysqlConnection();
System.out.println("ok....task completed!");
}
}
要注意的是:连接Hive数据库之前要启动HiveServer,执行命令nohub hive --service hiveserver,启动hiveserver,执行命令之后,好像不动了,没有反应了,这是正常的,这是Hive的一个bug。如果不启动HiveServer直接去连接会报连接失败,连接被refused。