继上一篇把Hive环境安装好之后,我们要做具体的日志分析处理,这里我们的架构是使用Flume + HDFS + Hive离线分析日志。通过Flume收集日志文件中的日志,然后存储到HDFS中,在通过Hive在HDFS之上建立数据库表,进行SQL的查询分析(其实底层是mapreduce任务)。
这里我们还是处理之前一直使用的command.log命令行日志,先来看一下具体的日志文件格式
command.log日志文件
|
|
Flume相关配置
Flume Agent端的flume_agent_file.conf配置
这里是采集/Users/yunyu/Downloads/command.log日志文件的内容,并且上报到127.0.0.1:41414服务器上(也就是Flume Collector端)
|
|
Flume Collector端的flume_collector_hdfs.conf配置
这里监听到127.0.0.1:41414上报的内容,并且输出到HDFS中,这里需要指定HDFS的文件路径。
|
|
启动Flume
|
|
这里遇到个小问题,就是Flume收集的日志文件到HDFS上查看有乱码,具体查看HDFS文件内容如下
|
|
解决方式:HdfsEventSink中,hdfs.fileType默认为SequenceFile,将其改为DataStream就可以按照采集的文件原样输入到hdfs,加一行agentX.sinks.flume-hdfs-sink.hdfs.fileType = DataStream,如果不改就会出现HDFS文件乱码问题。
参考文章:
- http://blog.csdn.net/cnbird2008/article/details/18967449
- http://blog.csdn.net/lifuxiangcaohui/article/details/49949865
Hive中创建表
下面是具体如何在Hive中基于HDFS文件创建表的
启动相关服务
|
|
如果看过上一篇Hive环境搭建的同学,到这里应该是一切正常的。如果启动metastore或者hiveserver2服务的时候遇到’MySQL: ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes’错误,将MySQL元数据的hive数据库编码方式改成latin1就好了。
参考文章
在HDFS中查看日志文件
|
|
使用org.apache.hadoop.hive.contrib.serde2.RegexSerDe解析日志
|
|
这里因为我们的日志是字符串内含有json,想要通过正则表达式提取json的字段属性,通过Flume的Interceptors或者Logstash的Grok表达式很容易做到,可能是我对于Hive这块研究的还不够深入,所以没有深入去研究org.apache.hadoop.hive.contrib.serde2.RegexSerDe是否支持这种正则表达式的匹配,我又尝试了一下只用空格拆分的普通字符串日志格式。
日志格式如下
|
|
|
|
发现用这种方式能够用正则表达式解析出来我们需要提取的字段信息。不知道是不是org.apache.hadoop.hive.contrib.serde2.RegexSerDe不支持这种带有json字符串的正则表达式匹配方式。这里我换了另一种做法,修改我们的日志格式尝试一下,我把command.log的日志内容修改成纯json字符串,然后使用org.apache.hive.hcatalog.data.JsonSerDe解析json字符串的匹配。下面是修改后的command.log日志文件内容。
command.log日志文件
|
|
使用org.apache.hive.hcatalog.data.JsonSerDe解析日志
|
|
参考文章:
- https://cwiki.apache.org/confluence/display/Hive/Json+SerDe
- https://my.oschina.net/cjun/blog/494692
- http://blog.csdn.net/bluishglc/article/details/46005269
- http://blog.sina.com.cn/s/blog_604c7cdd0102wbzz.html
- http://blog.csdn.net/xiao_jun_0820/article/details/38119123
使用select count(*)验证Hive可以调用MapReduce进行离线任务处理
|
|
这里我自己分析了一下原因,我们之前搭建的Hadoop集群配置是
|
|
仔细看了一下报错的信息,我们现在在Hadoop1上安装的Hive,ubuntu:50060这个发现是连接的Hadoop1节点的50060端口,但是50060端口是NodeManager服务的端口,但这里Hadoop1不是datanode所以没有启动NodeManager服务,需要在slaves文件中把Hadoop1节点添加上
|
|
这个问题可把我坑惨了,后来自己分析了一下,原因一定是哪里的配置是我配置错了hostname是ubuntu了,但是找了一圈的配置文件也没找到,后来看网上说在namenode节点上用yarn node -list -all查看不健康的节点,发现没有问题。又尝试hdfs dfsadmin -report语句检查 DataNode 是否正常启动,让我查出来我的/etc/hosts默认配置带有’127.0.0.1 ubuntu’,这样Hadoop可能会用ubuntu这个hostname
重试之后还是不对,使用hostname命令查看ubuntu系统的hostname果然是’ubuntu’,ubuntu系统永久修改hostname是在/etc/hostname文件中修改,我这里对应修改成Hadoop1,hadoop2,hadoop3
修改/etc/hostname文件后,重新检查Hadoop集群的所有主机的hostname都已经不再是ubuntu了,都改成对应的hadoop1,hadoop2,hadoop3
|
|
重启系统之后,检查hostname都已经修改正确,再次启动dfs,yarn,hive服务,重试执行select count(*) from command_json_table;终于正确了。。。
|
|
参考文章: