背景介绍:

Nginx为app打点数据,打点日志每小时滚动一次。目录结构如下

文件中的数据如下( cat -A 2019072414r.log 后的结果,-A为显示隐形的符号,下方^A为指定的分隔符。$为行尾结束符,换行的时候会自带,不用关注。)

61.140.204.111^A20190724145548^A1563951348^A^A8671a9d406bd8733bf42d9644a009660^AJYH^Awin7^A2^Ahc_GC5H6A^A^A3^A1.0^ALSEARCH^AOTHER^A1563951348^A$
123.147.250.151^A20190724145552^A1563951352^A^A8a0fc9239dd100880053b1e1d0678a37^AYEAR^Awin10^A2^Ahc_GC5H6A^A^A3^A1.0^AOPENSINPUT^AOTHER^A1563951352^A$
182.142.98.33^A20190724145553^A1563951350^Aac74b3d92fdfea6249a8188556de2215^A380b0e9844c5aa4905a952908dc7ddf9^ALZQ^Awin7^A2^Ahc_GC5H6A^A^A3^A1.0^AOPENSINPUT^AOTHER^A1563949711^A$
182.142.98.33^A20190724145553^A1563951350^Aac74b3d92fdfea6249a8188556de2215^A380b0e9844c5aa4905a952908dc7ddf9^ALZQ^Awin7^A2^Ahc_GC5H6A^A^A3^A1.0^AOPENSINPUT^AOTHER^A1563951350^A$ 

^A分隔的15列数据依次对应如下列。

ip,date,upload_time,uid,uuid,pbv,opv,av,ch,mac,sc,st,event_type,pg,action_time

现在需要将这部分数据收集到hive中,以供后续分析计算使用。

实施步骤一.配置flume将数据存到HDFS

1.配置flume

flume需要在nginx所在服务器上

###source
a2.sources = s2#ngxlog source
a2.sources.s2.type = TAILDIR
a2.sources.s2.channels = c3
a2.sources.s2.filegroups = f2
a2.sources.s2.filegroups.f2 = /data/logs/nginx/event_log/.*log
a2.sources.s2.positionFile=/data/logs/nginx/event_log/taildir_position.json
a2.sources.s2.fileHeader = true
a2.sources.s2.fileHeader=true
a2.sources.s2.fileHeaderKey=file
a2.sources.s2.interceptors = i3
a2.sources.s2.interceptors.i3.type = regex_extractor
a2.sources.s2.interceptors.i3.regex =(\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d)
a2.sources.s2.interceptors.i3.serializers = s2
a2.sources.s2.interceptors.i3.serializers.s2.type = org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer
a2.sources.s2.interceptors.i3.serializers.s2.name = timestamp
a2.sources.s2.interceptors.i3.serializers.s2.pattern = yyyyMMddHHmmss ###channel
a2.channels = c3
#huochai ngxlog channel
a2.channels.c3.type = memory
a2.channels.c3.capacity = 50000
a2.channels.c3.transactionCapacity = 10000
a2.channels.c3.byteCapacityBufferPercentage = 20
a2.channels.c3.byteCapacity = 134217728 ###sinks
a2.sinks = k3
#k3-huochai ngxlog sink
a2.sinks.k3.type = hdfs
a2.sinks.k3.channel = c3
a2.sinks.k3.hdfs.path = /user/flume/huochai-events/day=%Y%m%d
a2.sinks.k3.hdfs.filePrefix =%Y%m%d%H
a2.sinks.k3.hdfs.rollInterval = 0
a2.sinks.k3.hdfs.batchSize=1000
a2.sinks.k3.hdfs.idleTimeout=300
a2.sinks.k3.hdfs.threadsPoolSize=10
a2.sinks.k3.hdfs.rollSize = 134217728
a2.sinks.k3.hdfs.rollCount=0
##fileType SequenceFile DataStream CompressedStream
a2.sinks.k3.hdfs.fileType= SequenceFile
a2.sinks.k3.hdfs.codeC= snappy

2.对flume配置的一些说明

1) source类型为TAILDIR,这个类型是flume1.7.0才出来的,不过在CDH中1.6.0版本的flume就有这个功能了,具体说明见

http://flume.apache.org/releases/content/1.7.0/FlumeUserGuide.html#taildir-source

2) positionFile配置的文件,如果不存在会自动生成,并且如果不存在,会从头读所有文件的。

3) regex_extractor这个拦截器的作用是把每条log中 20190724145548 这个格式的时间 改为 timestamp的时间,放到flume的Event消息的Header中。

意即使用regex_extractor后Header中会产生一个key-value对为(timestamp:1563951348000)

4) a2.sinks.k3.hdfs.path = /user/flume/huochai-events/day=%Y%m%d

%Y%m%d 会取timestamp中的时间,转成20190724这个格式,也就是说,一条log最终会放入到哪个路径下,是由这条log中的时间决定的。

总体流程就是: log中20190724145548 被通过 regex_extractor提取成key-value对(timestamp:1563951348000),再由sinks.k3中配置的(%Y%m%d)解析出来,获得最终的路径。

3.刷新flume配置/重启flume,查看HDFS中的结果

路径正常按照日期生成

每个日期下每个小时会生成一个文件。

注解:为什么要每个小时生成一次文件

因为正在写入的文件后缀为tmp,tmp后缀的文件在hive的外部表中是没有办法读到数据的。每小时生成一次,可以保证数据最多只延迟一个小时。

实施步骤二.根据HDFS路径创建hive外部表

1.在shell客户端中连接hive。

beeline
!connect jdbc:hive2://bigdata.node2:10000
hadoop
回车

2.创建外部表

 CREATE EXTERNAL TABLE huochai_events (
ip STRING,
date STRING,
upload_time bigint,
uid string,
uuid string,
pbv string,
opv string,
av string,
ch string,
mac string,
sc string,
st string,
event_type string,
pg string,
action_time bigint
)
PARTITIONED BY (day STRING)
row format delimited fields terminated by '\u0001'
STORED AS
SequenceFile
LOCATION 'hdfs:///user/flume/huochai-events';

3.关于外部表的一些说明

1)  一个目录一个分区:PARTITIONED BY (day STRING) 对应的是HDFS目录中的 /user/flume/huochai_evetns/day=20190723

2)  '\u0001' 就是^A的unicode码。row format delimited fields terminated by '\u0001'

3) STORED AS SequenceFile。Snappy+SequenceFile  Hive的一种比较流行的压缩存储组合。日志是csv类型的,因此用这种组合。

4) 建议不要用json数据格式,否则你会遇到很多问题。比如Hive找不到JsonSerDe,或者Hive能用了Spark On Hive有问题,又或者前两者都能用了,但Spark2 On Hive找不到。

如果执意要用是可以通过配置来解决的,但是配置步骤比较繁琐,这里不单独讲。

4.修复分区

此时外部表已经创建完成了,但如果你select一下这个表,会发现没有记录。

原因是外部表下新增的分区是无法自动被发现的,需要在beeline中执行下面语句。

msck repair table huochai_events;

之后再select,便能查到数据了。

需要注意的是,明天生成新的目录之后,你需要重新再执行一次这条命令。

你可以将这句话写在离线任务中。

比如在spark应用代码中加上如下一句:

sql("msck repair table huochai_events").show

注意引号中的sql语句结尾没有分号。

总结

每个实际业务中可能有不同的实践场景,数据格式也不尽相同,处理方式也有很多选择(你可能还想用hive-stream),但是目前这种处理方式应该是flume-hive的最佳实践了。

另外数据格式方面,最好使用扁平的csv类型格式的数据,hive可以处理json/数组/struct这类的数据,但并不代表它擅长处理这些。

将nginx搜集到的日志通过flume转到hive的更多相关文章

  1. 实战:一种在http请求中使用protobuffer+nginx+lua收集打点日志的方案

    背景 app打点日志的上报和收集,是互联网公司的基本需求. 一.方案选择 1.1 protobuffer vs json 探究一种以最高效的方式上报和解析打点数据是一个系统性的问题,需要解决的子问题有 ...

  2. Nginx正确记录post日志的方法

    Nginx正确记录post日志的方法 事实上可以很简单,这取决于把 access_log 放在哪个 location 里面. 一,放到包含fastcgi_pass或proxy_pass的Locatio ...

  3. linux实现nginx按照日期存储日志

    通过shell脚本实现+定时任务+nginx信号管理实现日志按日期存储. 1.编写shell脚本,实现日志按日期存储 #!/bin/bash base_path='/home/wwwlogs/' lo ...

  4. Nginx 基本配置和日志分析

    最近在维护的一个项目,路由转发规则都统一通过Nginx转发,所以再次参考部分博文和书本,熟悉Nginx的基本配置,还有一个重点也是日志的分析 Nginx 常用模块是server块,location块. ...

  5. nginx自动切割访问日志

    Web 访问日志 (access_log) 记录了所有外部客户端对Web服务器的访问行为,包含了客户端IP,访问日期,访问的URL资源,服务器返回的HTTP状态码等重要信息. 一条典型的Web访问日志 ...

  6. Linux下配置Nginx按天切割日志

    Nginx由于轻巧和高效的设计风格,去掉了一些额外的功能,所以它不像apache那样有自动切割日志. 建立一个脚本文件,并保证这个文件有可执行的权限:1.建立一个文件/root/log.nginx.s ...

  7. NGINX按天生成日志文件的简易配置

    NGINX按天生成日志文件的简易配置 0x01 最近后端童鞋遇到一个小需求,拆分nginx生成的log文件,最好是按天生成,看着她还有很多bug待改的状态,我说这个简单啊,我来吧.曾经搞node后端的 ...

  8. 海量日志采集Flume(HA)

    海量日志采集Flume(HA) 1.介绍: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据 ...

  9. 消费滚动滴log日志文件(flume监听,kafka消费,zookeeper协同)

    第一步:数据源 手写程序实现自动生成如下格式的日志文件: 15837312345,13737312345,2017-01-09 08:09:10,0360 打包放到服务器,使用如下命令执行,模拟持续不 ...

随机推荐

  1. Maven实战错误笔记:使用mvn archetype:generate报错:Unable to add module to the current project as it is not of packaging type 'pom'

    在使用mvn archetype:generate生成Maven实战03:HelloWorld中的HelloWorld的项目骨架时报了这个错,从字面上分析是可能与pom.xml文件有关,然后我看了一下 ...

  2. mac上python3.x安装 图文详解

    mac安装brew报错及解决办法 https://blog.csdn.net/zdp072/article/details/82563320 更改脚本中的资源链接,替换成中国科学技术大学的镜像 htt ...

  3. java 中Vector的使用详解

    Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...

  4. 抓取B站小视频

    抓取B站小视频的代码如下: #请求库import requests #请求头部信息(用户代理)headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; ...

  5. 20190829 [ Night ] - 玻

    又考试 半集训真累…… 老帅哥露出会心的微笑.jpeg +------------+ | 寸 | | 土 分 | | 不 分 | | 让 必 | | 争 | +------------+ 考试过程: ...

  6. C#多线程之间事件通知

    我有两个线程,线程1接受网络数据,存到队列;线程2取队列,进行各种复杂的处理然后绘制到界面上;想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西 ...

  7. 读书笔记--Head First JavaScript 目录

    1.交互式网络 2.存储数据 3.探索客户端 4.决策 5.循环 6.函数 7.表单与验证 8.驾驭网页 9.为数据带来生命 10.创建自定义对象 11.除错务尽 12.动态数据

  8. 沙雕去死吧! 劳资终于弄好了toimcat9 apt和ssl配置

    搜一下吧,要不就是不用apr模式,也不用nio模式,直接用bio模式跑的,麻烦问一下,您们都是傻屌吗? APR模式必须要用!!!!! 然后全他妈的用jks证书,然后再提取公钥*.cer,然后再转换为* ...

  9. Linux部署教育云平台测试环境总结

    2016年10月16日换了新公司,刚进公司就要进行平台测试环境部署,由于之前Linux用的比较少,只用过几个简单的杀进程.重启tomcat.查看日志等简单的操作命令,真要在LInux服务器上部署环境的 ...

  10. 插头DP智障操作合集

    今天一共四道插头DP[其实都差不多],智障错误出了不下五个:D 来,让我好好数落我自己一下 直接写代码注释里吧 Eat the Trees #include<iostream> #incl ...