MR的流程再次理解 & Flume采集框架


MR的流程是重点!理解其中的过程就可以,如果遇到java代码!只需要看懂其中的意思就可以!Flume框架,知道其中的组件,知道使用情况就ok。

MR的流程再次理解

再次理解MR的输入输出

  1. MapReduce 框架运转在<key,value>键值对上,也就是说,框架把作业的输 入看成是一组<key,value>键值对,同样也产生一组<key,value>键值对作为作 业的输出,这两组键值对可能是不同的。
    在这里插入图片描述
    在这里插入图片描述

理解数据分区&验证默认分区规则

  1. reducetask的个数和最终输出的文件个数有 对等 关系,有N个reducetask个数,输出文件就被分割成N个部分。
  2. 当涉及大于等于2个reducetask的时候,就有了数据分区 分发问题。在mr中有默认的数据分区 分发规则。key值哈希取模(取余)。
    key.hashcode % NumberReduceTask 余数是几,这个数据就去哪个分区。
    哈希值:只要数据不变,通过该算法能够计算出唯一特征值。
    在这里插入图片描述
  3. & 按位与 && 按逻辑与

mapper阶段解析

  1. 第一阶段是把输入目录下文件按照一定的标准逐个进行 ,形成切 片规划。默认情况下,Split size = Block size。每一个切片由一个 MapTask 处理。(getSplits)
  2. 第二阶段是对切片中的数据按照一定的规则解析成<key,value>对。默认规 。key 是每一行的起始位置(单位是字逻辑切片则是把每一行文本内容解析成键值对节),value 是本行的文本内容。(TextInputFormat)
  3. 第三阶段是调用 Mapper 类中的 map 方法。上阶段中每解析出来的一个
    <k,v>,调用一次 map 方法。每次调用 map 方法会输出零个或多个键值对。
  4. 第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。默认是只有一个区。分区的数量就是 Reducer 任务运行的数量。默认只有一个
    Reducer 任务。
  5. 第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、 <2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。 如果有第六阶段,那么进入第六阶段;如果没有,直接输出到文件中。
  6. 第六阶段是对数据进行局部聚合处理,也就是 combiner 处理。键相等的键 值对会调用一次 reduce 方法。经过这一阶段,数据量会减少。本阶段默认 是没有的。
  7. map是将同一个maptask(同块)的文件合并
  8. reduce是将 健值对的value合并
    在这里插入图片描述

reducer阶段解析

  1. 第一阶段是 Reducer 任务会主动从 Mapper 任务复制其输出的键值对。 Mapper 任务可能会有很多,因此 Reducer 会复制多个 Mapper 的输出。
  2. 第二阶段是把复制到 Reducer 本地数据,全部进行合并,即把分散的数据 合并成一个大的数据。再对合并后的数据排序。
  3. 第三阶段是对排序后的键值对调用 reduce 方法。键相等的键值对调用一次 reduce 方法,每次调用会产生零个或者多个键值对。最后把这些输出的键 值对写入到 HDFS 文件中。
    在这里插入图片描述

mapreduce案例–流量统计

  1. 序列化:把结构化对象转化为字节流,不便于网络中高效传输。
  2. hadoop自己开发了一套序列化机制 writable
  3. 应该 分区个数 = 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采集框架

组件介绍&采集结构图

  1. Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。
    在这里插入图片描述
  2. Flume 的核心是把数据从数据源(source)收集过来,再将收集到的数据送到 指定的目的地(sink)。为了保证输送的过程一定成功,在送到目的地(sink)之前, 会先缓存数据(channel),待数据真正到达目的地(sink)后,flume 在删除自己缓 存的数据。
    在这里插入图片描述

flume网络到本地测试体验:

  1. agent:source channel sink
  2. 根据数据采集需求配置采集方案,描述在配置文件中(文件名可任意自定义)
  3. 指定采集方案配置文件,在相应的节点上启动 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 中去。不能有重名文件,否则报错且罢工,不再继续工作

  1. 采集源,即 source——监控文件目录 : spooldir
    下沉目标,即 sink——HDFS 文件系统 : hdfs sink
    source 和 sink 之间的传递通道——channel,可用 file channel 也可以用
    内存 channel
  2. 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。
**

  1. 采集源,即 source——监控文件内容更新 : exec ‘tail -F file’
    下沉目标,即 sink——HDFS 文件系统 : hdfs sink
    Source 和 sink 之间的传递通道——channel,可用 file channel 也可以用
    内存 channel
  2. 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

  1. 负载均衡:解决高并发。是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。
    在这里插入图片描述
  2. 当涉及多级flume启动时,优先启动远离数据源的地方
  3. 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

  1. 容错:容忍错误的发生,解决单点故障。
  2. 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)
  3. 优先级高的sink先干活:具有优先级为 100 的 sink 在优先级为 80 的 Sink 之前被激活。如果 在发送事件时汇聚失败,则接下来将尝试下一个具有最高优先级的 Sink 发送事 件。如果没有指定优先级,则根据在配置中指定 Sink 的顺序来确定优先级。

Apache Flume–案例–采集日志汇总

疑问:

1、采集需求:服务器的某特定目录下,会不断产生新的文件,每当有新文件出现, 就需要把文件采集到 HDFS 中去。不能有重名文件,否则报错且罢工,不再继续工作。
这时候该怎么办?如何消除报错。
2、Channel 参数解释:
capacity:默认该通道中最大的可以存储的 event 数量 trasactionCapacity:每次最大可以从 source 中拿到或者送到 sink 中的 event 数量
这里的event是指什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王二小、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值