北风网Hadoop套餐教程 Hive 入门实战:Mysql+Hive

来源:互联网 发布:淘宝商品按什么分类 编辑:程序博客网 时间:2024/04/28 09:08


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。
 

 

0 0
原创粉丝点击