编写程序向HBase添加日志信息

工程和源代码网盘地址(访问密码:7567):

 https://url56.ctfile.com/f/34653256-581240651-2ef0f0?p=7567icon-default.png?t=M4ADhttp:// https://url56.ctfile.com/f/34653256-581240651-2ef0f0?p=7567

承接上一篇文档《日志信息和浏览器信息获取及数据过滤》

上一个文档最好做个本地测试

将map方法改为public,做一个测试看是否有错误代码,代码和之前的MainProcess基本一样

之前完成了数据的过滤、补全,大致思路总结如下:

补全

1. IP地址的补全 ==> IP地址转换为地域信息 -->国家、省份、城市

(1) 直接使用第三方提供的rest api进行ip地址解析,比如淘宝

(2)使用第三方提供的IP解析库(解析文件) ==> 纯真IP数据库

(3)使用公司内部的IP库

表结构:start_ip、end_ip、country、province、city

start_ip和end_ip其实就是ip转换为long型之后的值

在获取数据的时候:

1. 将IP转换为long型

2. 查数据库看该值对应的地域是什么

2. 服务器时间转换 1532762408.139 -> 153276240839

将服务器时间转换为毫米级的时间戳

3. 浏览器UserAgent数据的解析补全

作用:获取浏览器和操作系统相关数据

方式: UASparser.jar

针对不同的平台、不同的事件进行数据过滤判断

完成了数据的过滤、补全,接下来完成清洗的内容。

先明白下面的选择:

为什么选择HBase作为数据存储?

1.数据收集的各个事件字段不固定,导致etl之后的数据的结构不是固定的,使用Hive表要求结构必须是固定的,所以这里采用HBase,hbase中的列可多可少

2.因为我们的数据分析的时候不是获取所有事件的数据,使用HBASE存储,可以将数据的过滤操作放到RegionServer中进行处理,降低数据的网络传输量

3.对比日志的格式发现日志的内容都可以解析成一个个key-value对的形式

HBase表结构的设计

1. 按天分表:一天的数据放一张表,做一个定时任务,30天以前的数据归档到一张历史表中

2. rowkey设计:随机的值(uuid+serverTime+clientInfo)

通过crc32生成一个唯一的值

提取每条日志数据中特征字段信息,然后通过crc32工具根据一定的算法生成一个唯一的值

3. 列簇:采用单列簇

4. 其他相关参数的设置,比如是否缓存

开始代码编写

首先编写一个Map和Runner

Map使用之前的AnalysisDataMapper,我们进一步完善

添加继承类和属性

Setup方法

Map方法更改

添加结果输出

完成generateHBasePut方法

完成generateRowKey方法

创建Runner

完成代码,继承Tool

添加配置属性

完成运行方法

设置配置

重载运行方法

开始创建job

设置参数信息

完成processArgs方法

完成setJobInputPaths方法

完成setHBaseOutputConfig方法

构建表名称

本地配置启动部分

HbaseAdmin的创建,注意这里有个Hbase版本的选择,根据自己机器的环境

Info列镞

创建表

主方法

完成之后开始运行(集群上环境都已经启动)

本地

默认是路径上有日志数据,读取的是昨天的,如果没有需要指定时间

添加参数

然后打包运行到集群中

这里添加了一个配置文件

里面要更改一个路径,这里是你的工作空间

然后执行maven的install命令,打包成jar

上传到linux

执行

Yarn jar 你的jar com.xlgl.wzy.mr.etl.AnalysisDataRunner(runner的全包类)

去HBASE看有没有表和数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的HBase的MapReduce配置程序的示例代码: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableReducer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.util.GenericOptionsParser; import java.io.IOException; public class HBaseMapReduceExample { public static class MyMapper extends Mapper<ImmutableBytesWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(ImmutableBytesWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split(","); for (String w : words) { word.set(w); context.write(word, one); } } } public static class MyTableReducer extends TableReducer<Text, IntWritable, ImmutableBytesWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())), new ImmutableBytesWritable(Bytes.toBytes(Integer.toString(sum)))); } } public static void main(String[] args) throws Exception { Configuration conf = HBaseConfiguration.create(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 1) { System.err.println("Usage: HBaseMapReduceExample <tablename>"); System.exit(2); } String tableName = otherArgs[0]; Scan scan = new Scan(); Job job = Job.getInstance(conf, "HBaseMapReduceExample"); job.setJarByClass(HBaseMapReduceExample.class); TableMapReduceUtil.initTableMapperJob(tableName, scan, MyMapper.class, Text.class, IntWritable.class, job); TableMapReduceUtil.initTableReducerJob(tableName, MyTableReducer.class, job); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 这个程序实现了一个简单的词频统计功能,从 HBase 表中读取数据,将每个单词作为键,出现次数作为值,最终将结果写回 HBase 表中。 需要注意的是,程序中的 `MyMapper` 和 `MyTableReducer` 分别是 Mapper 和 Reducer 的实现类,需要根据实际场景进行修改。同时,程序中的 `tableName` 变量需要替换成实际使用的 HBase 表名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值