大数据之hive安装及分析web日志实例

数据搜索与分析是运维狗必备技能
“In reality, 90+% of MR jobs are generated by Hive SQL

一、理论知识预热

一句话介绍基于Hadoop文件系统之上的分布式,按存储的数据仓库架构,提供数据ETL(抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。
通俗理解:Hive管理HDFS中存储的数据,并提供基于SQL的查询语言
开发本质:Hive被设计为用MapReduce操作HDFS数据.
大数据之hive安装及常用HiveQL(待续) - 碳基体 - 碳基体
Hive核心:Hive数据管理包括:
(1)元数据存储:Hive将元数据存储在RDBMS中,如Derby,MySQL
客户端利用Thrift协议通过MetaStoreServer来访问元数据库
(2)数据存储:hive中所有的数据都存储在HDFS中,大部分的查询由MapReduce完成。用户可以非常自由地组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分割符和行分隔符就能解析数据。
Hive包含4种数据模型:
例如有一张表叫accesslog,按event_day进行分区,hive的在HDFS上的数据存储地址为/user/hive/warehouse
leix
(3)数据交换:有三种接口:客户端、数据库接口和web界面
二、安装
第一步:安装hadoop
第二步:安装hive 

重要目录结构如下:
bin 可执行文件: hive命令行接口; HiveServer2; beeline命令行接口
conf 配置文件:hive-site.xml
lib jar包
hcatalog: HCatalog server服务
/tmp/roo用户名t/hive.log 日志
第三步: hive配置-设置hive环境变量

编辑

第四步:hive配置-设置hive数据在hadoop HDFS中的存储地址


编辑

在hadoop HDFS中创建相应的目录

第五步:hive配置-设置hive数据将元数据存储在MySQL中hive需要将元数据存储在RDBMS中,默认情况下,配置为Derby数据库
vim conf/hivesite.xml
默认设置


Derby JDBC驱动包在lib/derby-10.11.1.1.jar

接下来我们配置使用MySQL来存储元数据库metastore
1. 安装MySQL
2. 创建账户,设置用户名与密码
3. 赋予权限
4. 强制生效
5. 创建数据库
血的教训,血的教训,血的教训(2015年7月9日补充)
这里一定要把hive数据库的字符集修改为latin1,而且一定要在hive初次启动的时候就修改字符集 (否则就等着删除操作的时候死掉吧)
6. 配置Hive

编辑


7. 下载MySQL JDBC 驱动包,放置在lib目录下

第六步:运行hive命令行接口
第七步: hive QL初体验

我们在hadoop HFS中也能看到该数据文件,可以看出来hive中的每张表都对应hadoop的一个存储目录

我真是bug体质,遇到一堆错误
错误1:

原因:jline版本冲突


错误2:

解决方案:替换${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D为绝对路径

编辑

错误3:

解决方案:

错误4:

java版本过低导致的错误,最好使用java 7及以上版本(java6的定位估计是浏览器中的IE6)

三、 常用HiveQL及UDF编写

一句话:和mysql非常非常像,学起来完全没有压力

1. hive客户端常用命令

2. hive支持的数据类型

包括基本类型与集合类型,对日志分析,一般string,bigint,double,map就够用了

3. hive默认的切割文本文件的分隔符

\n 分割行;ctrl+A 分割字段(列),最后自己来指定分割符

4. hive的环境设置

5. HiveQL:我们通过分析web日志来熟悉HiveQL

日志样例

第一步:创建数据库weblog

数据库存储在

第二步:创建表nginxlog,用来存储原始日志

这个input regex让我血槽速减 99%

教训:双倍转义,双倍转义;双倍转义 重要的事情说三遍

也让我学会了如何修改table的SerDe属性

补充知识:hive使用一个inputformat对象将输入流分割成记录,然后使用一个outoutformat对象来记录格式化为输出流,再使用

SerDe(序列化,反序列化配置)在读数据时将记录解析成列,在写数据时将列编码成记录。

表创建成功后,我们可以看到其在hadoop中的存储位置为

我们可以查看表的结构

第三步:导入原始日志文件

第四步:创建另一个表,用来存储url parse后的数据

将url parse数据存入urlparse表中

我们可以检查一下存入的数据

注:这种解析方法非常粗略,对不符合url?k1=v1&k2=v2格式的请求是无法正确解析的,其中就包括url改写的,实际应用需要改善,这里仅仅是示例

第五步:探索URL特征

我们从统计的角度来探索url的一些特征:

扩展开来,这种探索方法我们可以用来生成URL白名单,当然在探索前,我们需要对日志源进行清理操作,去除非正常日志例如攻击日志,server错误日志(只取2xx,3xx),静态日志(avi,jpg等),重复日志等杂音,与规范化处理例如统一PATH(压缩多个//, 转换/->\),扯远了。

长度性的判断可以简单地使用切比雪夫定理大数据之hive安装及分析web日志实例 - 碳基体 - 碳基体

对于数值性的统计分析,Hive提供了一些内置函数,例如

描述数据集中趋势的:均值avg;

描述数据离散程度的:方差var_pop;标准差stddev_pop;协方差covar_pop;相关系数corr

这些功能的实现有些可以用内置的函数,有些就得编写自定义函数了。

内置函数之获得请求路径,该路径下出现的参数名数组,参数值数组

部分结果如下

内置函数之获得index.php下所有的查询字符串key-value对

部分结果如下

内置函数之获得每条url的参数分布统计特征

部分结果如下:

第六步:编写用户自定义函数-IP GEO信息查询

我们用查询Maxmind IP库来定位remote_addr的地理位置

    1. 下载maxmind geoip java api并打包成jar包

会生成target/geoip-api-1.2.15-SNAPSHOT.jar文件

 2. 获得IP库数据文件

3. 编写hive-geo UDF function

源码参照 https://raw.githubusercontent.com/edwardcapriolo/hive-geoip/master/src/main/java/com/jointhegrid/udf/geoip/GenericUDFGeoIP.java

源码由四部分组成

1.函数使用说明文档,describe function  中会看到的内容

2. initialize初始阶段,检查传入参数合法性、确认其类型,比如说本例的第一个参数可以是string,也可以是长整形

public ObjectInspector initialize(ObjectInspector[] arguments)

                      throws UDFArgumentException {

3. 查询逻辑的实现,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化

public Object evaluate(DeferredObject[] arguments) throws HiveException 

4.调式使用

public String getDisplayString(String[] children)

自定义非聚合类函数的编写方式基本可以参照上面的源码的结构,改吧改吧

注:聚合类函数编写要比这个复杂些

源码放置在我的git上 https://github.com/tanjiti/UDFExample/tree/master

在eclipse上编译成jar包,当然也可以采用命令行的方式,有兴趣的见第四部分的内容

大数据之hive安装及HiveQL查询web日志实例 - 碳基体 - 碳基体

大数据之hive安装及HiveQL查询web日志实例 - 碳基体 - 碳基体
附加:eclipse安装fatjar插件的方法

    4. 接下来的操作就是hive操作了

或者

结果如下

为了避免不必要的麻烦,请写全路径,全路径,全路径,重要的事情说三遍。

到这里,这篇科普文就结束了,下面的有兴趣可以看看,血泪史

———————————————————————————————————————————–(血泪分割线)

老习惯,记录一下遇到的bug

错误5:

有经验的或者有java常识的都知道java.lang.NoClassDefFoundError 多半是classpath环境变量的问题了

但我是菜鸟,其实出现该错误的操作是嫌弃fat jar包打包缓慢,因此用不熟悉的命令行打包,结果花了很多时间来定位原因。。。所幸找到了解决方案

四、命令行编译打包jar文件

一、首先介绍一下源码结构

二、编译源文件

三、编辑mainfest文件 (千万别忘了这步)

编辑

四、打包

-c 创建一个新的jar包
-v 显示详细信息
-f 指定jar包的路径
-C 切换到指定目录, -C 目录后跟着的. 表示包含指定目录下的所有文件
-m 指定mainfest文件

接下来就是hive上操作了

接下来计划把hadoop mapreduce入门的坑填上

hive文档参考:
https://github.com/edwardcapriolo/hive-geoip/

《hive编程指南》

【via@碳基体