hive -- hive + hiveclient (hive 客户端)

来源:互联网 发布:linux openssl 升级 编辑:程序博客网 时间:2024/05/16 19:17
 五个节点的hadoop服务器集群搭建完成后,得想办法提高开发效率,mapreduce 我不是高手,写起来有点麻烦,公司业务不等人,还是决定上hive。

      话说想玩好hadoop 还得学精mapreduce ,或许我把这个任务往后放放。

      废话不多说,接下来介绍下hive 的安装和实际应用。

      hive 安装:

      本人hadoop 用的就是cloudera 的release 当然hive 也不例外。

      所以安装很简单:

      Debian 上安装:

 

Java代码  收藏代码
  1. $ sudo apt-get install hadoop-hive  
  

 

   redhat/centos 上安装:

 

Java代码  收藏代码
  1. $ sudo yum install hadoop-hive  

 

    启动hive 控制台:

 

 

Java代码  收藏代码
  1. $ hive  
  2. hive>  

okay,可以使用hive 了  你可以参照hive 的wiki 里的介绍(很全面)玩一玩hive 的操作

http://wiki.apache.org/hadoop/Hive

玩了会儿了,该干正事了。

hive 默认带的是derby 数据库来存放创建的表信息(只存放表结构,内容放到hdfs里)

derby毕竟是嵌入式数据库,作正式应用不安全。幸好hive支持mysql,于是安装mysql

我用的是centos 安装自然很简单:

 

Java代码  收藏代码
  1. yum install mysql-server  

 

 启动mysql:

  /etc/init.d/mysqld start

 

 为hadoop/hive 创建mysql用户:

 

Java代码  收藏代码
  1. mysql  
  2. mysql> CREATE USER 'hadoop'@'centos1' IDENTIFIED BY 'hadoop';  
  3. mysql> GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'centos1' WITH GRANT OPTION;  
  4. mysql> exit  

  测试是否成功:

 

 

Java代码  收藏代码
  1. su - hadoop  
Java代码  收藏代码
  1. mysql -h centos1 -u hadoop -p  

 

  okay 现在我们成功安装了hive 下面我们修改hive 的配置让hive使用mysql  
  如果你用的cloudera 的话:

vi /etc/hive/conf/hive-site.xml

 

 

然后改成这样:
  
Java代码  收藏代码
  1. <property>  
  2.   <name>hive.metastore.local</name>  
  3.   <value>true</value>  
  4. </property>  
  5.   
  6. <property>  
  7.   <name>javax.jdo.option.ConnectionURL</name>  
  8.   <value>jdbc:mysql://centos1:3306/hive?createDatabaseIfNotExist=true</value>  
  9. </property>  
  10.   
  11. <property>  
  12.   <name>javax.jdo.option.ConnectionDriverName</name>  
  13.   <value>com.mysql.jdbc.Driver</value>  
  14. </property>  
  15.   
  16. <property>  
  17.   <name>javax.jdo.option.ConnectionUserName</name>  
  18.   <value>hadoop</value>  
  19. </property>  
  20.   
  21. <property>  
  22.   <name>javax.jdo.option.ConnectionPassword</name>  
  23.   <value>hadoop</value>  
  24. </property>  

 okay, 现在启动 hive:

$hive

 

用的就是mysql 数据库存放表结构了。 

你会惊奇地发现之前玩的那些表都没了,就让它们长眠在derby里吧!

 

集群搭建完毕,于是乎实际应用来了。

由于scribe 用的时间不长,产生的日志量还少,我们需要对过去三个月的cookie访问数据进行一个分析。

怎么办? 写个java程序吧数据库里的数据导进来(scribe之前 ,还是吧所有日志写到数据库中的,可想而知查询得多慢)

导出了15G的数据(3各月cookie访问记录)

下面就有个不能满足的需求了:要求把分析结果放回到mysql 数据库中方便管理人员查看

你懂的, linux控制台操作的hive 是不可能把结果数据放进mysql的(就我的能力而言。) 只能打印到控制台或者写入文件

 

于是乎想到了hive 是有jdbc 客户端的

 

首先启动hive server:

 

Java代码  收藏代码
  1. hive --service hiveserver 50031(端口号)  

好了服务启动了,等待客户端连接并执行客户端代码。

 

hive 支持多种客户端,jdbc odbc php python 等等 想了解的可以去wiki 看看。

 

 

okay 用eclipse 写hive 吧~  这回熟悉了吧

在eclipse 中创建一个新的javaproject 

把hive/lib 下的所有jar copy到项目的lib目录下 另外再加一个mysql-connector-5.*.*.jar 用来把数据写入mysql

废话不说 ,贴代码:

 

Java代码  收藏代码
  1. package com.hive;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.sql.Connection;  
  5. import java.sql.ResultSet;  
  6. import java.sql.Statement;  
  7. import java.sql.DriverManager;  
  8.   
  9. public class HiveJdbcClient {  
  10.     private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";  
  11.   
  12.     /** 
  13.      * @param args 
  14.      * @throws SQLException 
  15.      */  
  16.     public static void main(String[] args) throws SQLException {  
  17.         try {  
  18.             Class.forName(driverName);  
  19.         } catch (ClassNotFoundException e) {  
  20.             // TODO Auto-generated catch block  
  21.             e.printStackTrace();  
  22.             System.exit(1);  
  23.         }  
  24.         Connection con = DriverManager.getConnection(  
  25.                 "jdbc:hive://192.168.3.201:50031/defalt""hadoop",  
  26.                 "masterninja");  
  27.         Statement stmt = con.createStatement();  
  28.         ResultSet res = stmt  
  29.                 .executeQuery("select  cookie_id ,COUNT(cookie_id)count  from cookie_info where uid=5779665 group by cookie_id ORDER BY count DESC limit 20");  
  30.         while (res.next()) {  
  31.             System.out.println(res.getString(1) +"         "+ res.getInt(2));  
  32.         }  
  33.     }  
  34. }  

 我这里只是把结果集打印出来了  没有写入mysql (贴的只是测试代码)

写好后运行就成。如果您公司的服务器与外网是隔离的(我们公司就是)

就把程序打个jar 上传到服务器集群中的一台上(起码能访问到hiveserver 的)

运行java -jar XXX.jar

你会发现hive server 的那台机器开始在linux控制台打印了...

成功~

 

若有疑问欢迎交流。

 

原创粉丝点击