首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 云计算 >

云计算实战 (雅量日志管理)hive - hive + hiveclient (hive 客户端)

2012-10-27 
云计算实战 (海量日志管理)hive-- hive + hiveclient (hive 客户端)?? ? ?五个节点的hadoop服务器集群搭建

云计算实战 (海量日志管理)hive -- hive + hiveclient (hive 客户端)

?? ? ?五个节点的hadoop服务器集群搭建完成后,得想办法提高开发效率,mapreduce 我不是高手,写起来有点麻烦,公司业务不等人,还是决定上hive。

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

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

?? ? ?hive 安装:

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

?? ? ?所以安装很简单:

?? ? ?Debian 上安装:

?

$ sudo apt-get install hadoop-hive
??

?

?? ?redhat/centos 上安装:

?

$ sudo yum install hadoop-hive

?

?? ?启动hive 控制台:

?

?

$ hivehive>

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

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

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

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

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

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

?

yum install mysql-server

?

?启动mysql:

??/etc/init.d/mysqld start

?

?为hadoop/hive 创建mysql用户:

?

mysqlmysql> CREATE USER 'hadoop'@'centos1' IDENTIFIED BY 'hadoop';mysql> GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'centos1' WITH GRANT OPTION;mysql> exit

??测试是否成功:

?

?

su - hadoop
mysql -h centos1 -u hadoop -p

?

??okay 现在我们成功安装了hive 下面我们修改hive 的配置让hive使用mysql ???如果你用的cloudera 的话:
<property> <name>hive.metastore.local</name> <value>true</value></property><property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://centos1:3306/hive?createDatabaseIfNotExist=true</value></property><property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value></property><property> <name>javax.jdo.option.ConnectionUserName</name> <value>hadoop</value></property><property> <name>javax.jdo.option.ConnectionPassword</name> <value>hadoop</value></property>

?okay, 现在启动 hive:

$hive

?

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

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

?

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

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

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

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

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

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

?

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

?

首先启动hive server:

?

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

废话不说 ,贴代码:

?

package com.hive;import java.sql.SQLException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.sql.DriverManager;public class HiveJdbcClient {private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";/** * @param args * @throws SQLException */public static void main(String[] args) throws SQLException {try {Class.forName(driverName);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();System.exit(1);}Connection con = DriverManager.getConnection("jdbc:hive://192.168.3.201:50031/defalt", "hadoop","masterninja");Statement stmt = con.createStatement();ResultSet res = stmt.executeQuery("select  cookie_id ,COUNT(cookie_id)count  from cookie_info where uid=5779665 group by cookie_id ORDER BY count DESC limit 20");while (res.next()) {System.out.println(res.getString(1) +"         "+ res.getInt(2));}}}

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

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

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

运行java -jar XXX.jar

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

成功~

?

若有疑问欢迎交流。

?

1 楼 z_post 2010-12-14   很好。我用的是postgres。但"org.apache.hadoop.hive.jdbc.HiveDriver"总是配不好。
eclipse,运行提示错误:
java.lang.ClassNotFoundException: org.apache.hadoop.hive.jdbc.HiveDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at HiveJdbcClient.main(HiveJdbcClient.java:21)

postgres_java_dirver.jar,已放到hive/lib下了
还有什么注意的地方吗?

谢谢 2 楼 z_post 2010-12-15   哈,问题解决。

“把hive/lib 下的所有jar copy到项目的lib目录下 另外再加一个mysql-connector-5.*.*.jar”这段话很有启发。

我再将hadoop-*.*-core.jar也放了到lib目录下。就好了。

谢了 3 楼 fuyanqing03 2011-03-31   你好,问个问题:在生产环境上也是通过JDBC连接hive去执行HQL语句吗? 他支持连接池吗? 4 楼 houzhaowei 2011-03-31   fuyanqing03 写道你好,问个问题:在生产环境上也是通过JDBC连接hive去执行HQL语句吗? 他支持连接池吗?
不要把hive 当成mysql等关系型数据库去用。 hive 只是用来操作mapreduce 的,你用连接池干嘛? 不要想着用它来查互联网的实时数据   想要实时数据用hbase 或cassandra 等数据仓库。 先好好了解hive 的原理再用。原理都不了解 怎么上生产环境 5 楼 chenbo19867758 2011-08-30   用虚拟机内存设置为1G,还报内存溢出,为什么? 6 楼 Angel_Night 2011-09-22   houzhaowei 写道fuyanqing03 写道你好,问个问题:在生产环境上也是通过JDBC连接hive去执行HQL语句吗? 他支持连接池吗?
不要把hive 当成mysql等关系型数据库去用。 hive 只是用来操作mapreduce 的,你用连接池干嘛? 不要想着用它来查互联网的实时数据   想要实时数据用hbase 或cassandra 等数据仓库。 先好好了解hive 的原理再用。原理都不了解 怎么上生产环境


我在生产环境就遇到这种问题了……

首先我每天大约要给hive导入10亿条左右的数据……

10条意味着n多个文件

n多个文件 意味着多次调用 load data local inpath
考虑下连接池有错啊……

热点排行