大数据生态---Flume笔记

Flume

Flume:分布式、可信任的弹性系统,用于高效收集、汇聚和移动大规模日志信息从多种不同的数据源到一个集中的数据存储中心(HDFS,Hbase)

flume做简单的数据过滤处理

复杂数据处理:

1、离线做数据处理(mapreduce,hive,spark)

2、实时,统计报表呈现统计数据(pv ,uv ,交易总额)到页面BI (spark streaming, flink, storm)

 

重定向:

微博行为数据——>分析出来用户的年龄段——>推荐更加准确

1、淘宝站内用户行为数据

2、站外用户行为数据(微博)  阿里妈妈

flume能收集两部分数据

 

1、特点

1、flume可以将多个网站服务器中的收集日志信息存入到hdfs/Hbase中。

2、使用flume,可以将从多个服务器中获得的数据迅速移交给hadoop中

3、处理日志信息,flume还可以收集规模宏大的社交网络节点事件数据,比如facebook,twitter

4、支持各种接入资源数据的类型及其输出各种资源的数据类型

5、支持多路径流量,多管道接入流量,多管道接出流量,上下文路由

6、可以被水平扩展

 

priors  3000w条数据  order_id

orders 一个用户有多个订单   pv:3421082,  uv:206209   16.509

3000w pv  uv:3000w/16

10000w   3.3*500M=1650M

 

服务器计算资源:

内存128G

磁盘1--10T

cpu 8核

每天数据量 500M,hdfs3份,1.5G

mysql(数据量)->hdfs落一份  3倍

以下两个业务场景

1、日志+部分数据库过来的维度表(关联)

2、部分日志,部分维度表

一天500M*10

1年,30天45G*10

日志采集主要用到以下场景:

1、网站数据分析
2、用户行为数据收集
3、模型训练需要

 注意:

2、具体收集什么数据?

1、用户浏览目标网页的行为:打开某网页、点击某按钮、购买商品、将商品加购物车等

2、附加内容数据:下单行为产生订单金额等

备注:以上收集策略能满足基本的流量分析、来源分析、内容分析及访客属性等常用分析视角

PV:浏览量

UV:用户量

 

Header是key/value形式的,可以用来制造路由决策或携带其他结构化信息(如时间的时间戳timesstamp或事件来源的服务器主机名host)

启用一个agent:

[root@master apache-flume-1.6.0-bin]# bin/flume-ng agent -c conf -f conf/header_test.conf -n a1 -Dflume.root.logger=INFO,console

启用另外一个窗口测试:

curl -X POST -d '[{"headers":{"timestampe":"1234567","host":"master"},"body":"badou flume"}]' localhost:9000

拿到数据:

Event: { headers:{timestampe=1234567, host=master} body: 62 61 64 6F 75 20 66 6C 75 6D 65                badou flume }

3、Flume agent(代理)

Flume内部有一个或多个agent;

agent主要有:source,channel,sink三部分组成

Flume通常选择file channel,而不使用memory channel

Memory channel:内存存储事务,吞吐率极高,但存在丢数据风险,如果agent出现问题,容易数据丢失

File channel:本地磁盘的事物实现模式,保证数据不会丢失(WAL实现),把数据写到磁盘,保证数据完整性,但是性能差一些。

WAL:write ahead log 预写

写执行操作,再写数据,当数据写失败,再执行一遍操作

 

^[0-9]*$:数字的都给过滤 filter和spark里面相反逻辑
^开始,$结尾

spark filter为true的保留下来
flume中的:filter为true的过滤掉 Python

Avro:是一个数据序列化系统,支持大批量数据交换应用
从一个agent1到agent2中a1的sink->a2的source

 

flume agent a2[push.conf] -> flume2 agent a1 [pull.conf]
执行步骤:slave1,master
slave1:
bin/flume-ng agent -c conf -f conf/pull.conf -n a1 -Dflume.root.logger=INFO,console
master:
bin/flume-ng agent -c conf -f conf/push.conf -n a2 -Dflume.root.logger=INFO,console

 

 

[root@master apache-flume-1.6.0-bin]# bin/flume-ng agent -c conf -f conf/example.conf -n a1 -Dflume.root.logger=INFO,console

有没有连接成功:
slave3上面:log:
[id: 0xba35b724, /192.168.174.134:53348 => /192.168.174.135:44444] CONNECTED: /192.168.174.134:53348


官网的网址:http://flume.apache.org/FlumeUserGuide.html#hdfs-sink

hdfs写明文的方式设置:
a1.sinks.k1.hdfs.fileType = DataStream

【http://flume.apache.org/FlumeUserGuide.html#hive-sink
#【需要用到的】
a1.channels = c1
a1.channels.c1.type = memory
a1.sinks = k1
a1.sinks.k1.type = hive
a1.sinks.k1.channel = c1
a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083
a1.sinks.k1.hive.database = logsdb
a1.sinks.k1.hive.table = weblogs
a1.sinks.k1.hive.partition = asia,%{country},%y-%m-%d-%H-%M
a1.sinks.k1.useLocalTimeStamp = false
a1.sinks.k1.round = true
a1.sinks.k1.roundValue = 10
a1.sinks.k1.roundUnit = minute
a1.sinks.k1.serializer = DELIMITED
#csv的分隔符是","
a1.sinks.k1.serializer.delimiter = "\t" 
a1.sinks.k1.serializer.serdeSeparator = '\t'
a1.sinks.k1.serializer.fieldnames =id,,msg】

【作业】:
【将orders.csv -> hive中,以order_dow为分区】
exec tail -f filename

a1.sources.r1.type = exec
a1.sources.r1.command = tail -f /home/badou/Documents/data/flume/flume_exec_test.txt

注意:

在使用kafka的时候前提要将zookeeper集群启动起来,由于zookeeper是克隆其他机器过来的,zookeeper安装主目录下myid会相同,启动服务以后,会报reconnect 错误,所以要将myid修改成不一样,并且没有myid的时候要创建myid,并且跟master节点myid不一样。

启动kafka:

[root@master kafka_2.11-0.10.2.1]# ./bin/kafka-server-start.sh config/server.properties

查看topic:

[root@master kafka_2.11-0.10.2.1]# ./bin/kafka-topics.sh --list --zookeeper master:2181,slave1:2181,slave2:2181
badou
badouzhurui
caiyunjie
food_topic
judong
meinv
test
zhuyuandong

删除创建的topic:

[root@master kafka_2.11-0.10.2.1]# bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test

创建test topic:

[root@master kafka_2.11-0.10.2.1]# bin/kafka-topics.sh --create --zookeeper master:2181,slave1:2181,slave2:2181 --replication-factor 1 --partitions 2 --topic test
Created topic "test".
[root@master kafka_2.11-0.10.2.1]# bin/kafka-topics.sh --des --zookeeper localhost:2181 --topic test                          Topic:test      PartitionCount:2        ReplicationFactor:1     Configs:
        Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: test     Partition: 1    Leader: 0       Replicas: 0     Isr: 0
[root@master kafka_2.11-0.10.2.1]# 

 

接着打开flume_kafka收集,然后收集到test topic

[root@master apache-flume-1.6.0-bin]# bin/flume-ng agent -c conf -f conf/flume_kafka.conf -n a1 -Dflume.root.logger=INFO,console

消费topic:

./kafka-console-consumer.sh --zookeeper master:2181,slave1:2181,slave2:2181 --topic test

 

4.启动flume: [flume_kafka.conf]

bin/flume-ng agent -c conf -f conf/flume_kafka.conf -n a1 -Dflume.root.logger=INFO,console

5.“写”数据到flume中 :

因为flume_kafka.conf中的source以
a1.sources.r1.type = exec
a1.sources.r1.command = tail -f /home/badou/Documents/code/python/flume_exec_test.txt
flume监控这个路径下的文件
只要有数据追加到这个文件中,这些数据就会被监控,
通过这个source写入flume中

需要用到【read_write.py】将一个文件中的数据写入到
监控的文件中flume_exec_test.txt

这样写入的数据就是写到kafka中的数据

整个过程模拟写logs日志的过程。

20180603

【对应的代码,只需要修改里面的路径就可以】

posted @ 2020-03-29 23:15  Simon92  阅读(20)  评论(0编辑  收藏  举报