转自 http://www.cppblog.com/koson/archive/2010/07/19/120773.html
hive 简介
hive 是一个基于 hadoop 的开源数据仓库工具,用于存储和处理海量结构化数据。 它把海量数据存储于 hadoop 文件系统,而不是数据库,但提供了一套类数据库的数据存储和处理机制,并采用 HQL (类 SQL )语言对这些数据进行自动化管理和处理。我们可以把 hive 中海量结构化数据看成一个个的表,而实际上这些数据是分布式存储在 HDFS 中的。 Hive 经过对语句进行解析和转换,最终生成一系列基于 hadoop 的 map/reduce 任务,通过执行这些任务完成数据处理。
Hive 诞生于 facebook 的日志分析需求,面对海量的结构化数据, hive 以较低的成本完成了以往需要大规模数据库才能完成的任务,并且学习门槛相对较低,应用开发灵活而高效。
Hive 自 2009.4.29 发布第一个官方稳定版 0.3.0 至今,不过一年的时间,正在慢慢完善,网上能找到的相关资料相当少,尤其中文资料更少,本文结合业务对 hive 的应用做了一些探索,并把这些经验做一个总结,所谓前车之鉴,希望读者能少走一些弯路。
Hive 的官方 wiki 请参考这里 :
http://wiki.apache.org/hadoop/Hive
官方主页在这里:
http://hadoop.apache.org/hive/
hive-0.5.0 源码包和二进制发布包的下载地址
http://labs.renren.com/apache-mirror/hadoop/hive/hive-0.5.0/
二、 部署
由于 Hive 是基于 hadoop 的工具,所以 hive 的部署需要一个正常运行的 hadoop 环境。以下介绍 hive 的简单部署和应用。
部署环境:
操作系统: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
Hadoop : hadoop-0.20.2 ,正常运行
部署步骤如下:
1、 下载最新版本发布包 hive-0.5.0-dev.tar.gz ,传到 hadoop 的 namenode 节点上,解压得到 hive 目录。假设路径为: /opt/hadoop/hive-0.5.0-bin
2、 设置环境变量 HIVE_HOME ,指向 hive 根目录 /opt/hadoop/hive-0.5.0-bin 。由于 hadoop 已运行,检查环境变量 JAVA_HOME 和 HADOOP_HOME 是否正确有效。
3、 切换到 $HIVE_HOME 目录, hive 配置默认即可,运行 bin/hive 即可启动 hive ,如果正常启动,将会出现“ hive> ”提示符。
4、 在命令提示符中输入“ show tables; ”,如果正常运行,说明已部署成功,可供使用。
常见问题:
1、 执行“ show tables; ”命令提示“ FAILED: Error in metadata: java.lang.IllegalArgumentException: URI: does not have a scheme ”,这是由于 hive 找不到存放元数据库的数据库而导致的,修改 conf/ hive-default.xml 配置文件中的 hive.metastore.local 为 true 即可。由于 hive 把结构化数据的元数据信息放在第三方数据库,此处设置为 true , hive 将在本地创建 derby 数据库用于存放元数据。当然如果有需要也可以采用 mysql 等第三方数据库存放元数据,不过这时 hive.metastore.local 的配置值应为 false 。
2、 如果你已有一套 nutch1.0 系统正在跑,而你不想单独再去部署一套 hadoop 环境,你可以直接使用 nutch1.0 自带的 hadoop 环境,但这样的部署会导致 hive 不能正常运行,提示找不到某些方法。这是由于 nutch1.0 使用了 commons-lang-2.1.jar 这个包,而 hive 需要的是 commons-lang-2.4.jar ,下载一个 2.4 版本的包替换掉 2.1 即可, nutch 和 hive 都能正常运行。
三、 应用场景
本文主要讲述使用 hive 的实践,业务不是关键,简要介绍业务场景,本次的任务是对搜索日志数据进行统计分析。
集团搜索刚上线不久,日志量并不大 。这些日志分布在 5 台前端机,按小时保存,并以小时为周期定时将上一小时产生的数据同步到日志分析机,统计数据要求按小时更新。这些统计项,包括关键词搜索量 pv ,类别访问量,每秒访问量 tps 等等。
基于 hive ,我们将这些数据按天为单位建表,每天一个表,后台脚本根据时间戳将每小时同步过来的 5 台前端机的日志数据合并成一个日志文件,导入 hive 系统,每小时同步的日志数据被追加到当天数据表中,导入完成后,当天各项统计项将被重新计算并输出统计结果。
以上需求若直接基于 hadoop 开发,需要自行管理数据,针对多个统计需求开发不同的 map/reduce 运算任务,对合并、排序等多项操作进行定制,并检测任务运行状态,工作量并不小。但使用 hive ,从导入到分析、排序、去重、结果输出,这些操作都可以运用 hql 语句来解决,一条语句经过处理被解析成几个任务来运行,即使是关键词访问量增量这种需要同时访问多天数据的较为复杂的需求也能通过表关联这样的语句自动完成,节省了大量工作量。
四、 Hive 实战
初次使用 hive ,应该说上手还是挺快的。 Hive 提供的类 SQL 语句与 mysql 语句极为相似,语法上有大量相同的地方,这给我们上手带来了很大的方便,但是要得心应手地写好这些语句,还需要对 hive 有较好的了解,才能结合 hive 特色写出精妙的语句。
关于 hive 语言的详细语法可参考官方 wiki 的语言手册 :
http://wiki.apache.org/hadoop/Hive/LanguageManual
虽然语法风格为我们提供了便利,但初次使用遇到的问题还是不少的,下面针对业务场景谈谈我们遇到的问题,和对 hive 功能的定制。
1、 分隔符问题
首先遇到的是日志数据的分隔符问题,我们的日志数据的大致格式如下:
2010-05-24 00:00:02@$_$@QQ2010@$_$@all@$_$@NOKIA_1681C@$_$@1@$_$@10@$_$@@$_$@-1@$_$@10@$_$@application@$_$@1
从格式可见其分隔符是“ @$_$@ ”,这是为了尽可能防止日志正文出现与分隔符相同的字符而导致数据混淆。本来 hive支持在建表的时候指定自定义分隔符的,但经过多次测试发现只支持单个字符的自定义分隔符,像“ @$_$@ ”这样的分隔符是不能被支持的,但是我们可以通过对分隔符的定制解决这个问题, hive 的内部分隔符是“