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实战(5):引入bootstrap,设置静态资源

    之前生成了Product类的scaffold,但是如同rails的开发者David所讲的那样,scaffold几乎没什么用.所以按照<Agile Web Development with Rai ...

  2. mysql关联表插入-php环境中

    $insertsql=<<<EOTinsert into tb_manager values(null,'$name','$pwd','1');select @pid:=last_i ...

  3. Ubuntu16.04下Hive的安装与配置

    一.系统环境 os : Ubuntu 16.04 LTS 64bit jdk : 1.8.0_161 hadoop : 2.6.4mysql : 5.7.21 hive : 2.1.0 在配置hive ...

  4. Python下opencv使用笔记(图像的平滑与滤波)

    对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...

  5. Hadoop CapacitySchedule配置

    下面是Hadoop中CapacitySchedule配置,包含了新建队列和子队列 <configuration> <property> <name>yarn.sch ...

  6. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) 题解

    [题目链接] A - Alphabet 最长公共子序列.保留最长公共子序列,剩余的删除或者补足即可. #include <bits/stdc++.h> using namespace st ...

  7. Django学习笔记--通用列表和详细信息视图

    根据教程写完代码后,点击All books也一直跳转到index的页面 我打开了F12调试,看到点击没有出现book_list的代码,觉得应该是url的路径写得不对,但是跟教程代码对比了下,并没有发现 ...

  8. Linux 的文件权限与目录配置

    用户和用户组 文件所有者 (owner) 用户组概念 (group) 其他人概念 (others) Linux文件权限概念 1. Linux文件属性 要了解Linux文件属性,那么有个重要的命令必须提 ...

  9. oneDay

    难受过 迷茫过 失望过 耍脾气过 开心过 伤心过 疼过 走了这么久的路: 我只想说 程序的道路上 很难走: 本来准备都放弃了: 自己逼自己了很久想明白了: 不能什么时候都想着靠外力 自己的不足就是自己 ...

  10. touchscreem

    <触摸屏种类> 常见 电阻式触摸屏 电容式触摸屏 不常见 红外线技术触摸屏 表面声波触摸屏 适量压力传感触摸屏 <原理分析> 电阻式触摸屏 如图所示,在屏幕的上下和左右加上一个 ...