课堂学习笔记
MR的流程是重点!理解其中的过程就可以,如果遇到java代码!只需要看懂其中的意思就可以!Flume框架,知道其中的组件,知道使用情况就ok。
MR的流程再次理解
再次理解MR的输入输出
- MapReduce 框架运转在<key,value>键值对上,也就是说,框架把作业的输 入看成是一组<key,value>键值对,同样也产生一组<key,value>键值对作为作 业的输出,这两组键值对可能是不同的。
理解数据分区&验证默认分区规则
- reducetask的个数和最终输出的文件个数有 对等 关系,有N个reducetask个数,输出文件就被分割成N个部分。
- 当涉及大于等于2个reducetask的时候,就有了数据分区 分发问题。在mr中有默认的数据分区 分发规则。key值哈希取模(取余)。
key.hashcode % NumberReduceTask 余数是几,这个数据就去哪个分区。
哈希值:只要数据不变,通过该算法能够计算出唯一特征值。
- & 按位与 && 按逻辑与
mapper阶段解析
- 第一阶段是把输入目录下文件按照一定的标准逐个进行 ,形成切 片规划。默认情况下,Split size = Block size。每一个切片由一个 MapTask 处理。(getSplits)
- 第二阶段是对切片中的数据按照一定的规则解析成<key,value>对。默认规 。key 是每一行的起始位置(单位是字逻辑切片则是把每一行文本内容解析成键值对节),value 是本行的文本内容。(TextInputFormat)
- 第三阶段是调用 Mapper 类中的 map 方法。上阶段中每解析出来的一个
<k,v>,调用一次 map 方法。每次调用 map 方法会输出零个或多个键值对。 - 第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。默认是只有一个区。分区的数量就是 Reducer 任务运行的数量。默认只有一个
Reducer 任务。 - 第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、 <2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。 如果有第六阶段,那么进入第六阶段;如果没有,直接输出到文件中。
- 第六阶段是对数据进行局部聚合处理,也就是 combiner 处理。键相等的键 值对会调用一次 reduce 方法。经过这一阶段,数据量会减少。本阶段默认 是没有的。
- map是将同一个maptask(同块)的文件合并
- reduce是将 健值对的value合并
reducer阶段解析
- 第一阶段是 Reducer 任务会主动从 Mapper 任务复制其输出的键值对。 Mapper 任务可能会有很多,因此 Reducer 会复制多个 Mapper 的输出。
- 第二阶段是把复制到 Reducer 本地数据,全部进行合并,即把分散的数据 合并成一个大的数据。再对合并后的数据排序。
- 第三阶段是对排序后的键值对调用 reduce 方法。键相等的键值对调用一次 reduce 方法,每次调用会产生零个或者多个键值对。最后把这些输出的键 值对写入到 HDFS 文件中。
mapreduce案例–流量统计
- 序列化:把结构化对象转化为字节流,不便于网络中高效传输。
- hadoop自己开发了一套序列化机制 writable
- 应该 分区个数 = reduce task
mapreduce–了解combiner
每一个map都可能会产生大量的本地输出, Combiner的作用就是对map端的输出先做一次合并, 以减少在 map 和 reduce 节点之间的数据传输量, 以提高网络IO性能, 是MapReduce 的一种优化手段之一。
1、combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件
2、 combiner 组件的父类就是 Reducer
3、combiner 和 reducer 的区别在于运行的位置:
Combiner 是在每一个 maptask 所在的节点运行
Reducer 是接收全局所有 Mapper 的输出结果;
4、combiner 的意义就是对每一个 maptask 的输出进行局部汇总,以减小网络传
输量
Apache Flume采集框架
组件介绍&采集结构图
- Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。
- Flume 的核心是把数据从数据源(source)收集过来,再将收集到的数据送到 指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前, 会先缓存数据(channel),待数据真正到达目的地(sink)后,flume 在删除自己缓 存的数据。
flume网络到本地测试体验:
- agent:source channel sink
- 根据数据采集需求配置采集方案,描述在配置文件中(文件名可任意自定义)
- 指定采集方案配置文件,在相应的节点上启动 flume agent
1、先在 flume 的 conf 目录下新建一个文件 vi netcat-logger.conf
#定义这个 agent 中各组件的名字
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#描述和配置 source 组件:r1
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
#描述和配置 sink 组件:k1
a1.sinks.k1.type = logger
#描述和配置 channel 组件,此处使用是内存缓存的方式
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#描述和配置 source channel sink 之间的连接关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2、启动 agent 去采集数据
bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console
-c conf 指定 flume 自身的配置文件所在目录
-f conf/netcat-logger.con 指定我们所描述的采集方案
-n a1 指定我们这个 agent 的名字
3、测试
先要往 agent 采集监听的端口上发送数据,让 agent 有数据可采。 随便在一个能跟 agent 节点联网的机器上:
telnet anget-hostname port (telnet localhost 44444)
bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console
Apache Flume–案例–采集目录到hdfs–spooldir&hdfs
采集需求:服务器的某特定目录下,会不断产生新的文件,每当有新文件出现, 就需要把文件采集到 HDFS 中去。不能有重名文件,否则报错且罢工,不再继续工作
- 采集源,即 source——监控文件目录 : spooldir
下沉目标,即 sink——HDFS 文件系统 : hdfs sink
source 和 sink 之间的传递通道——channel,可用 file channel 也可以用
内存 channel - a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 3
a1.sinks.k1.hdfs.rollSize = 20
a1.sinks.k1.hdfs.rollCount = 5
a1.sinks.k1.hdfs.round = true 目录每十分钟更新一次
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
round 控制文件夹的滚动
roll 控制文件的滚动
a1.sinks.k1.hdfs.rollInterval = 3 间隔
a1.sinks.k1.hdfs.rollSize = 20 文件大小
a1.sinks.k1.hdfs.rollCount = 5 event数量
3个都有情况下 谁先满足就直接触发变成最终的样子
控制event写到hdfs 文件的滚动频率 什么情况下文件从临时态变成最终的样子
Apache Flume–案例–采集文件到hdfs–exec&hdfs
**采集需求:比如业务系统使用 log4j 生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到 hdfs。
**
- 采集源,即 source——监控文件内容更新 : exec ‘tail -F file’
下沉目标,即 sink——HDFS 文件系统 : hdfs sink
Source 和 sink 之间的传递通道——channel,可用 file channel 也可以用
内存 channel - while true;do date >> /root/666.txt ;sleep 1;done shell 命令行
#!/bin/bash
while true
do
date >> /root/666.txt
sleep 1
done
Apache Flume–高级功能–Load balance
- 负载均衡:解决高并发。是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。
- 当涉及多级flume启动时,优先启动远离数据源的地方
- a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 k3
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true #如果开启,则将失败的 sink 放入黑名单 a1.sinkgroups.g1.processor.selector = round_robin (轮询)# 另外还支持 random a1.sinkgroups.g1.processor.selector.maxTimeOut=10000 #在黑名单放置的超时时间,超时结 束时,若仍然无法接收,则超时时间呈指数增长
Apache Flume–高级功能–failover
- 容错:容忍错误的发生,解决单点故障。
- a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2 k3
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 7
a1.sinkgroups.g1.processor.priority.k3 = 6
a1.sinkgroups.g1.processor.maxpenalty = 20000 #失败的 Sink 的最大回退期(millis) - 优先级高的sink先干活:具有优先级为 100 的 sink 在优先级为 80 的 Sink 之前被激活。如果 在发送事件时汇聚失败,则接下来将尝试下一个具有最高优先级的 Sink 发送事 件。如果没有指定优先级,则根据在配置中指定 Sink 的顺序来确定优先级。
Apache Flume–案例–采集日志汇总
疑问:
1、采集需求:服务器的某特定目录下,会不断产生新的文件,每当有新文件出现, 就需要把文件采集到 HDFS 中去。不能有重名文件,否则报错且罢工,不再继续工作。
这时候该怎么办?如何消除报错。
2、Channel 参数解释:
capacity:默认该通道中最大的可以存储的 event 数量 trasactionCapacity:每次最大可以从 source 中拿到或者送到 sink 中的 event 数量
这里的event是指什么?