前面使用flume把第一手的日志上传到了hadoop
接下来就是要对数据进行分析了,
这里可以使用hadoop的mapreduce,但是缺点是开发过程比较慢
很多人都习惯使用sql来进行查询,hive很好的满足了这个要求
而且根据大公司的精力,之前大家都是使用自己封装的mapreduce库
后来都转成hive了
把hadoop的日志转成hive表就是第一步了
这里我尝试的方案是
外表+json的方式
!---
hive的json处理需要引入第三方serde
http://congiu.net/hive-json-serde/1.3.7/cdh5/ 这里可以直接下载,省去github自己打包的麻烦
下载下来的jar包直接丢到hive的lib文件夹下
(这里还是需要下源码重新打包下,把hive和hadoop的版本做个配置支持,
网站上面只有cdh4,chd5等1,2个版本的支持,版本对不上容易出现莫名其妙的错误
)
上面这个serde稳定性不行,解析经常容易失败,最后换了
https://github.com/cloudera/cdh-twitter-example 这个开源的
'com.cloudera.hive.serde.JSONSerDe'
下载代码后把hive和hadoop的版本做修改再编译
然后就是建立外表的过程
项目的日志格式是/flume/yyyy-mm-dd/h/files
这里使用了日期和时间2个分区参数
建表的语句如下:
建表语句
CREATE EXTERNAL TABLE gatetest(
url string,
ip string,
param struct
agent string,
logtime string,
time string,
type string
)
PARTITIONED BY (mydate string, myhour string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/flume';
增加分区
alter table gatetest add partition (date='20160427', hour='0') location '/flume/20160427/0';
查看分区数:
show partitions gateLog;
基于分区查询:
select count(*) from gateLog where date='20160427';
这里有个问题是无法直接使用分区参数和数据值一起做为查询条件
这个问题自己还要尝试解决
{解决:
JsonSerDe里面有个配置选项跳过哪些无法解析的json串,测试了一下java的解析跟python解析还有有些不全
我用python导出的3w条记录有几百条无法用这个SerDe解析出来。
ALTER TABLE gatetest SET SERDEPROPERTIES ("ignore.malformed.json"="true");
增加这句,这个是在代码库里面的说明找的。
}