大数据生态---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
【对应的代码,只需要修改里面的路径就可以】