搜索日志+HDFS+Maxcompute(离线采集数据)

这次业务的需求:
将存储在服务器的搜索日志文件采集到HDFS当中,然后进行清洗导入到maxcompute表格中。

1.布置flume服务进行实时的采集
多台服务器布置flume,指向一台载有flume服务的集群服务器。多个flume的sink指向一个flume的source。
a.此次采用的是监控指定文件进行采集,新增一条内容采集一条内容。
b.文件滚动生成方式有三种:按照时间;按照文件大小;按照数据条数,此次主要采用的是按照文件大小生成文件(20M),时间12小时滚动生成,10w条数据生成。
c.按照当天的日期进行文件夹的分区。
d.flume采取的是后台启动的方式,先开启接收服务器的flume才能开启数据传输方的flume。

source服务器A和B :exec_source_avro_sink.conf

#name the components on this agent
a1.sources = r1 
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
#a1.sources.r1.type = spooldir
#a1.sources.r1.spoolDir= /data/zkhrts/logs/test
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /data/zkhrts/logs/1.txt
a1.sources.r1.channels=fileChannel
a1.sources.r1.basenameHeader = true
a1.sources.r1.basenameHeaderKey = fileName

a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = static
##  static拦截器的功能就是往采集到的数据的header中插入自
##	 己定义的key-value对
a1.sources.r1.interceptors.i1.key = type
a1.sources.r1.interceptors.i1.value = testData

# Describe the sink
a1.sinks.k1.type = avro
#公网IP
a1.sinks.k1.hostname = 0.0.0.0
a1.sinks.k1.port = 55555

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 20000
a1.channels.c1.transactionCapacity = 10000

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

sink服务器A和B :avro_source_hdfs_sink.conf

#agent名, source、channel、sink的名称
a1.sources = r1
a1.sinks = k1
a1.channels = c1

#定义source
a1.sources.r1.type = avro
a1.sources.r1.bind = datanode1
a1.sources.r1.port =55555

#添加时间拦截器
#a1.sources.r1.interceptors = i1
#a1.sources.r1.interceptors.i1.type = iorg.apache.flume.interceptor.TimestampInterceptor$Builder

#定义channels
a1.channels.c1.type = memory
a1.channels.c1.capacity = 20000
a1.channels.c1.transactionCapacity = 10000

#定义sink
a1.sinks.k1.type = hdfs
#spark master的hdfs私网
a1.sinks.k1.hdfs.path=hdfs://10.10.0.27:8020/user/hdfs/source/log/server/%Y%m%d
a1.sinks.k1.hdfs.filePrefix =%{fileName}
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
#时间类型
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#生成的文件不按条数生成
a1.sinks.k1.hdfs.rollCount = 100000
#生成的文件按时间生成(秒)
a1.sinks.k1.hdfs.rollInterval = 60
#生成的文件按大小生成(10M)
a1.sinks.k1.hdfs.rollSize  = 2097152
#批量写入hdfs的个数
a1.sinks.k1.hdfs.batchSize = 10000
#flume操作hdfs的线程数(包括新建,写入等)
a1.sinks.k1.hdfs.threadsPoolSize=10
#操作hdfs超时时间
a1.sinks.k1.hdfs.callTimeout=30000

#组装source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

ps:

  1. source方的监控文件地址、对应服务器的ip、开通需要的端口
  2. sink方的写入到HDFS的为地址、根据什么生成文件(条数、时间、大小)
  3. 起flume服务时注意集群用户是谁,权限如何,不然采集不成功

2.采集到HDFS的文件通过java api进行操作
java代码中首先要创建conf对象,设置公网ip(因为购买的是阿里云的服务器,有公网和私网之分),使用hdfs的身份(这样才有对hdfs进行操作的权限)
a.因为是定时调度程序运行,所以需要动态获取文件路径;
b.读取完的文件将文件名进行修改,所以之前要做一个判断只有符合文件名的才进行读取;
c.读取文件使用的bufferedReader的方式,一行行读取;
d.清洗过程可以使用正则,模式匹配拿到想要的字段,缺失的字段进行填充;
e.清洗过的数据存储到list当中(根据网上的测试,list可以存储超过四百万条的数据)

3.清洗完的数据存到list当中,再将此list映射到maxcompute当中
导入maxcompute当中需要先进行配置ID key 项目名 表明之类的
a.初始化odps的基本信息;
b.首先进行alter table 插入表的分区;
c.使用date的api,获取当前日期作为分区字段;
d.做一个判断如果有则使用此分区,没有则创建;
e.调用第二步的方法,读取list中的数据;
f.此次上传使用的是uploadSession.openBufferedWriter(),此方法不需要创建block,有个缓存机制;
g.导入数据的时候,要对对应的字段进行解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值