1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer。

package com.ncc.dlut;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List; import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.conf.ComponentConfiguration;
import org.apache.flume.sink.hbase.AsyncHbaseEventSerializer;
import org.apache.flume.sink.hbase.SimpleRowKeyGenerator;
import org.hbase.async.AtomicIncrementRequest;
import org.hbase.async.PutRequest; public class AsyncHbaseLTEEventSerializer implements AsyncHbaseEventSerializer {
//表名
private byte[] table;
//列族
private byte[] colFam;
//当前事件
private Event currentEvent;
//列名
private byte[][] columnNames;
//用于向HBase批量存储数据
private final List<PutRequest> puts = new ArrayList<PutRequest>();
private final List<AtomicIncrementRequest> incs = new ArrayList<AtomicIncrementRequest>();
//当前行键
private byte[] currentRowKey;
private final byte[] eventCountCol = "eventCount".getBytes(); @Override
public void configure(Context context) {
//从配置文件中获取列名
String cols = new String(context.getString("columns"));
String[] names = cols.split(",");
columnNames = new byte[names.length][];
int i = 0;
for(String name:names){
columnNames[i++] = name.getBytes();
} } @Override
public void configure(ComponentConfiguration conf) {
// TODO Auto-generated method stub } @Override
public void cleanUp() {
// TODO Auto-generated method stub
table = null;
colFam = null;
currentEvent = null;
columnNames = null;
currentRowKey = null; } @Override
public List<PutRequest> getActions() {
// 分割事件体获取各列的值
String eventStr = new String(currentEvent.getBody());
String[] cols = logTokenize(eventStr);
puts.clear();
//数据中的时间
String time=cols[1];
int n1 = 13-time.length();
StringBuilder sb = new StringBuilder(time);
for(int i=0;i<n1;i++){
sb.insert(0, '0');
}
try {
//使用自带的行键生成器生成行键
currentRowKey = SimpleRowKeyGenerator.getUUIDKey(cols[0]+"-"+sb.toString());
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// currentRowKey = (cols[0]+"-"+System.currentTimeMillis()).getBytes();
int n = cols.length;
// 添加每列数据
for(int i=0;i<n;i++){
PutRequest putReq = new PutRequest(table, currentRowKey,colFam,columnNames[i],cols[i].getBytes());
puts.add(putReq);
}
return puts;
} @Override
public List<AtomicIncrementRequest> getIncrements() {
// 增加接收到的事件数量
incs.clear();
incs.add(new AtomicIncrementRequest(table, "totalEvents".getBytes(), colFam, eventCountCol));
return incs;
} @Override
//初始化表名和列名
public void initialize(byte[] table, byte[] cf) { this.table = table;
this.colFam = cf; } @Override
public void setEvent(Event event) {
// TODO Auto-generated method stub
this.currentEvent = event;
} //从日志中获取列值信息
public String[] logTokenize(String eventStr) { // String logEntryPattern = "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+|-) \"([^\"]+)\" \"([^\"]+)\"";
// Pattern p = Pattern.compile(logEntryPattern);
// Matcher matcher = p.matcher(eventStr); /* if (!matcher.matches()){
System.err.println("Bad log entry (or problem with RE?):");
System.err.println(eventStr);
return null;
}
*/ /* String[] columns = new String[matcher.groupCount()];
for (int i = 0; i < matcher.groupCount(); i++){
columns[i] = matcher.group(i+1);
}*/ String[] s = eventStr.split("[:,]");
int n = s.length;
String[] columns = new String[n/2];
for(int i=0;2*i+1<n;i++){
columns[i] = s[2*i+1];
} return columns; } }

所需jar包如下:

aaarticlea/png;base64,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" alt="" />

这些jar包都可以在flume的lib文件夹中找到。

2. 将上面的程序打包,放入flume的lib文件夹中

3. 配置Flume,实现采集和存储

配置文件flume-hbase.properties如下:

############################################
# flume-src-agent config
########################################### #agent section
agent.sources = s
agent.channels = c
agent.sinks = r #source section
#agent.sources.s.type = exec
#agent.sources.s.command = tail -f -n+1 /usr/local/test.log agent.sources.s.type = spooldir
agent.sources.s.spoolDir = /usr/local/flume-hbase
agent.sources.s.fileHeader = true
agent.sources.s.batchSize = 100
agent.sources.s.channels = c # Each sink's type must be defined
agent.sinks.r.type = asynchbase
agent.sinks.r.table = car_table
agent.sinks.r.columnFamily = lte
agent.sinks.r.batchSize = 100
agent.sinks.r.serializer = com.ncc.dlut.AsyncHbaseLTEEventSerializer
agent.sinks.r.serializer.columns = cid,time,pci,st,ed,ta,lng,lat #Specify the channel the sink should use
agent.sinks.r.channel = c # Each channel's type is defined.
agent.channels.c.type = memory
agent.channels.c.capacity = 1000

参考链接:

应用Flume+HBase采集和存储日志数据的更多相关文章

  1. NoSql存储日志数据之Spring+Logback+Hbase深度集成

    NoSql存储日志数据之Spring+Logback+Hbase深度集成 关键词:nosql, spring logback, logback hbase appender 技术框架:spring-d ...

  2. MongoDB应用案例:使用 MongoDB 存储日志数据

    线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖 ...

  3. 使用 MongoDB 存储日志数据

    使用 MongoDB 存储日志数据     线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...

  4. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  5. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

  6. 日志数据如何同步到MaxCompute

    摘要:日常工作中,企业需要将通过ECS.容器.移动端.开源软件.网站服务.JS等接入的实时日志数据进行应用开发.包括对日志实时查询与分析.采集与消费.数据清洗与流计算.数据仓库对接等场景.本次分享主要 ...

  7. Mongodb 存储日志信息

    线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖 ...

  8. 用Hbase存储Log4j日志数据:HbaseAppender

    业务需求: 需求很简单,就是把多个系统的日志数据统一存储到Hbase数据库中,方便统一查看和监控. 解决思路: 写针对Hbase存储的Log4j Appender,有一个简单的日志储存策略,把Log4 ...

  9. flume实时采集mysql数据到kafka中并输出

    环境说明 centos7(运行于vbox虚拟机) flume1.9.0(flume-ng-sql-source插件版本1.5.3) jdk1.8 kafka(版本忘了后续更新) zookeeper(版 ...

随机推荐

  1. Django实战(11):修改Model类

    我们已经实现了卖方的产品维护界面,根据最初的需求,还要为买方实现一个目录页:买方通过这个界面浏览产品并可以加入购物车.通过进一步需求调研,了解到产品有一个“上架时间”,在这个时间之后的产品才能被买方看 ...

  2. 2017-2018-1 20179202《Linux内核原理与分析》第十二周作业

    C语言实现Linux网络嗅探器 一.知识准备 1.一般情况下,网络上所有的机器都可以"听"到通过的流量,但对不属于自己的数据包则不予响应.如果某个工作站的网络接口处于混杂模式,那么 ...

  3. 20169211《linux内核原理与分析》第七周作业

    1.教材内容学习总结 2.实验报告 3.学习总结 一.教材内容学习总结 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享 ...

  4. R语言实战(十)处理缺失数据的高级方法

    本文对应<R语言实战>第15章:处理缺失数据的高级方法 本文仅在书的基础上进行简单阐述,更加详细的缺失数据问题研究将会单独写一篇文章. 处理缺失值的一般步骤: 识别缺失数据: 检查导致数据 ...

  5. win10 远程桌面远程电脑时每次要输入密码及身份验证错误,要求的函数不受支持问题解决

    解决以前每次远程时能能记住密码,更新系统补丁后现在每次登录要输入密码了及远程时提示身份验证错误,要求的函数不受支持问题 解决方法一.卸载更新安装的新补丁,远程桌面正常,能记住密码 解决方法二.修改注册 ...

  6. jupyter notebook变量高亮

    首先声明,anaconda安装的时候,一定要勾选“Add Anaconda to my PATH environment variable”! 否则会有一堆麻烦的问题,做了这一步就能自动添加好路径!不 ...

  7. Python如何将RGB图像转换为Pytho灰度图像?

    我正尝试使用matplotlib读取RGB图像并将其转换为灰度.在matlab中,我使用这个: 1 img = rgb2gray(imread('image.png')); 在matplotlib t ...

  8. Python复数属性和方法操作实例

    转自: https://blog.csdn.net/henni_719/article/details/56665254 #coding=utf8 ''' 复数是由一个实数和一个虚数组合构成,表示为: ...

  9. Qt Quick快速入门之信号、槽

    信号和槽主要用于组件之间的通信,类似于.net和java中的委托. 使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行. 比如connect ...

  10. 【洛谷】1477:[NOI2008]假面舞会【图论】

    P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...