大数据面试题 —— Flume

目录

  • 介绍 Flume
  • Flume 架构
  • 请说一下你提到的几种 source 的不同点
  • Flume 传输数据时如何保证数据一致性
  • TailDir 为什么可以断点重传
  • 说下Flume事务机制
  • Sink 消费能力弱,Channel 会不会丢失数据
  • 数千个Flume要怎么统一配置,修改就分发吗
  • Flume一个节点宕机了怎么办,数据怎么恢复
  • 你是如何实现Flume数据传输的监控的
  • Flume的Channel Selectors
  • Flume参数调优
  • Flume的事务机制
  • Flume采集数据会丢失吗?
  • Flume Kafka Sink了解过吗
  • Flume写到HDFS怎么分区
  • Flume如果出现数据重复是什么原因
  • Flume的配置文件怎么写的

介绍 Flume


可以从以下几个方面回答,每一个方面又可以当做一个面试题

(1)Flume 是什么?

Flume 是 Cloudera 公司提供的一个 高可用的高可靠的分布式的 海量日志采集聚合传输 的系统。Flume 的设计原理是基于数据流(流式架构,灵活简单),其最主要的作用是实时读取服务器本地磁盘的数据,将数据写入HDFS 或 Kafka等

(2)Flume 文件目录

Flume 主要的文件目录如下:

在这里插入图片描述

(3)Flume 的 Agent 组件

Flume 内部有一个或者多个 Agent,然而对于每一个 Agent 来说,它就是一个独立的守护进程(JVM),它从客户端那接收数据,或者从其他的 Agent 那接收,然后迅速的将获取的数据传给 Sink,或者其他 Agent 。每个 Agent 包含了 SourceChannelSink

(4)Flume 优缺点

优点

  • Flume 可以将应用产生的数据存储到任何集中存储器中,比如 HDFS,HBase。
  • 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume 会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一个平稳的数据。
  • 提供上下文路由特征。(上下文路由特征是 Flume 提供的一种机制,用于根据事件的上下文信息将数据路由到不同的目的地。)
  • Flume 的管道是基于事务,保证了数据在传送和接收时的一致性。
  • Flume 是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
  • 实时性,Flume可以实时的将分析数据并将数据保存在数据库或者其他系统中。

缺点

  • Flume 的配置很繁琐,source,channel,sink 的关系在配置文件里面交织在一起,不便于管理。
  • 无法保证数据的不重复

(5)应用场景

  • 电子商务网站,比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图。这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给 Hadoop 平台上去分析,而 Flume 正是帮我们做到这一点。
  • 内容推送,现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于此。
  • ETL工具可以利用插件把关系型数据实时增量的导入到 Hdfs 外部数据源。

(6)Flume插件

  • Interceptors 拦截器用于 source 和 channel 之间,用来更改或者检查 Flume 的events 数据
  • 管道选择器 channels Selectors 在多管道是被用来选择使用哪一条管道来传递数据(events)。管道选择器又分为如下两种:
    • 默认管道选择器: 每一个管道传递的都是相同的 events
    • 多路复用通道选择器: 依据每一个 event 的头部 header 的地址选择管道
  • sink 线程用于激活被选择的 sinks 群中特定的 sink,用于负载均衡

(7)其它类似 Flume 框架 Facebook 的 Scribe,还有 Apache 另一个明星项目 chukwa,还有淘宝 Time Tunnel

Flume 架构


Flume传输数据依靠的就是Agent ,Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的地。Agent 主要有3个部分组成,Source、Channel、Sink。

Source

  • Source 负责接收数据,可以处理各种类型的日志数据,包括 netcat,exec,spooldir, taildir 等。

Channel

  • Channel是位于 Source 和 Sink 之间的缓冲区。因此,Channel 允许 Source 和Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。
  • 两种类型
    • Memory Channel 是内存中的队列。Memory Channel 在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么 Memory Channel 就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
    • File Channel 将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。

Sink

  • 数据的目的地,负责将Channel 中的数据传输到存储系统或下一个Flume中。Sink 组件目的地包括 hdfs、Kafka、logger、avro、HBase等。

请说一下你提到的几种 source 的不同点


Exec source 适用于监控一个实时追加的文件,但不能保证数据不丢失;

Spooldir Source 适用于监控一个文件夹下的多个新文件,能够保证数据不丢失,且能够实现断点续传,但延迟较高,不能实时监控;

Taildir Source 适用于监控一个文件夹下的多个追加文件,既能够实现断点续传,又可以保证数据不丢失,还能够进行实时监控。

Flume 传输数据时如何保证数据一致性


(1)Flume的事务机制

Flume使用两个独立的事务分别负责从 soucrce 到 channel,以及从 channel 到 sink 的事件传递。

(2)Flume 的 At-Least-Once 提交方式

Flume 的事务机制,总的来说,保证了source 产生的每个事件都会传送到 sink 中。但是值得一说的是,实际上 Flume 作为高容量并行采集系统采用的是 At-least-once(传统的企业系统采用的是 exactly-once 机制)提交方式,这样就造成每个 source 产生的事件至少到达 sink 一次,换句话说就是同一事件有可能重复到达。这样虽然看上去是一个缺陷,但是相比为了保证 Flume 能够可靠地将事件从source,channel 传递到 sink,这也是一个可以接受的权衡。

(3)Flume的批处理机制

为了提高效率,Flume 尽可能的以事务为单位来处理事件,而不是逐一基于事件进行处理。批处理的设置尤其有利于提高 File Channel 的效率,这样整个事务只需要写入一次本地磁盘,速度会快很多。

TailDir 为什么可以断点重传


TailDir 是Flume中的一种 Source 类型,用于读取日志文件并将其传输到下一个步骤(例如 Kafka 或 HDFS)。TailDir 可以断点重传的原因在于它跟踪了每个文件的当前读取位置,并将其存储在一个可配置的“位置文件”(Flume内置JSON文件)中。如果 Flume 代理在读取日志文件时出现故障或崩溃,它将从位置文件中读取每个文件的位置,并从上一次读取的位置开始重新读取文件。这种断点重传的机制可以确保数据的可靠传输,并尽可能地避免数据重复或遗漏。

说下Flume事务机制


Flume 的事务机制类似数据库的事务机制:要么都成功,要么都失败。

Flume使用两个独立的事务分别负责从Source到Channel,以及从Channel到Sink的事件传递。

Put 事务

  • doPut:将批数据先写入临时缓冲区 putList
  • doCommit:检查Channel中是否还有足够的空间来容纳 putList中的所有数据,如果有,doCommit就成功了,putList 中的所有数据就会进入到 Channel 中并清空 putList 中的数据;
  • doRollback:Channel中的空间不足以容纳 putList 中的数据的时候,事务就会进行回滚(所谓的回滚就是等一定的时间后,再尝试将 putList 中的数据发送到Channel);

Take 事务

  • doTake:将数据取到临时缓冲区 takeList
  • doCommit:如果数据全部发送成功,则清除临时缓冲区 takeList
  • doRollback:数据发送过程中如果出现异常,rollback 将临时缓冲区 takeList 中的数据归还给 channel内存队列

Sink 消费能力弱,Channel 会不会丢失数据


如果 Sink 的消费速度低于 Channel 的写入速度,Channel 将会存储越来越多的数据,如果 Channel 存储满了,则新的事件将不会被写入 Channel,这时就可能会出现数据丢失的情况。

为了避免数据丢失,可通过以下两种方式来缓解Sink的消费速度低于Channel的写入速度的问题:

  • 增加Sink的并行度:如果Sink消费能力不足,可以通过增加Sink的并行度,让sink同时启动多个线程去处理Channel中的事件。这样做的好处是可以将Channel中的数据均衡地分配给多个线程,以提高整个系统的处理能力。
  • 增加Channel的容量:如果Sink消费能力不足,可以通过增加Channel的容量,使其可以存储更多的数据。这样做的好处是可以让Channel更容易地缓存数据,以避免数据丢失的情况。

如果Sink的消费速度一直低于Channel的写入速度,增加Channel的容量也只能是一种临时的缓解措施,不能根本解决问题。最终的解决方案还是要提高Sink的消费能力,让其能够尽快地消费掉Channel中的数据。

数千个Flume要怎么统一配置,修改就分发吗


要管理数千个Flume代理,可以使用配置管理工具,例如 Ambari 或 Cloudera 。这些工具可以自动化地配置和管理整个集群中的Flume代理。可以将 Flume 代理的配置文件集中存储在一个版本控制系统中,并使用配置管理工具将更改分发到所有代理。在某些情况下,也可以使用脚本自动化配置管理的过程。

Flume一个节点宕机了怎么办,数据怎么恢复


当一个Flume节点宕机时,如何处理和恢复数据取决于Flume的整体架构和设计。

  • 如果Flume的拓扑结构中有多个Agent或Source,而其中的某个节点宕机了,可以通过其他节点或者备份节点继续采集数据。如果channel是可靠的,那么已经传输到Channel中的数据是不会丢失的,只有还在channel中缓存的数据需要考虑如何处理。这时可以考虑将channel的数据通过其他节点传输到目标sink,或者在宕机节点重新启动Flume时继续传输。
  • 如果Flume的拓扑结构中只有一个Agent,那么就需要考虑如何备份和恢复数据。可以在Source和Channel之间加入一个可靠性机制,例如使用HDFS作为Channel的存储介质,并使用HDFS的HA机制实现数据备份和容错,从而保证在Flume节点宕机时不会丢失数据。

还可以考虑使用 Flume NG 的多Agent机制,将同一批次的数据同时传输给多个节点,保证数据的冗余备份。

你是如何实现Flume数据传输的监控的


使用第三方框架Ganglia实时监控Flume。

Flume的Channel Selectors


ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型,分别是 Replicating(复制)和 Multiplexing(多路复用)。

  • ReplicatingChannelSelector (默认)会将同一个 Event 发往所有的 Channel
  • MultiplexingChannelSelector 会根据相应的原则,将不同的 Event 发往不同的 Channel。

Flume参数调优


(1)Source

增加 Source个数(使用Tair Dir Source时可增加FileGroups个数)可以增大Source的读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个Source 以保证Source有足够的能力获取到新产生的数据。

batchSize参数决定Source一次批量运输到Channel的event条数,适当调大这个参数可以提高Source搬运Event到Channel时的性能。

(2)Channel

type 选择memory时Channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据。type选择file时Channel的容错性更好,但是性能上会比memory channel差。使用file Channel时dataDirs配置多个不同盘下的目录可以提高性能。

Capacity 参数决定Channel可容纳最大的event条数。transactionCapacity 参数决定每次Source往channel里面写的最大event条数和每次Sink从channel里面读的最大event条数。transactionCapacity需要大于Source和Sink的batchSize参数。

(3)Sink

增加Sink的个数可以增加Sink消费event的能力。Sink也不是越多越好够用就行,过多的Sink会占用系统资源,造成系统资源不必要的浪费。

batchSize参数决定Sink一次批量从Channel读取的event条数,适当调大这个参数可以提高Sink从Channel搬出event的性能。

Flume的事务机制


Flume的事务机制(类似数据库的事务机制):Flume使用两个独立的事务分别负责从Soucrce到Channel,以及从Channel到Sink的事件传递。

比如spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到Channel且提交成功,那么Soucrce就将该文件标记为完成。同理,事务以类似的方式处理从Channel到Sink的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到Channel中,等待重新传递。

Flume采集数据会丢失吗?


根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事务机制,Source到Channel是事务性的,Channel到Sink是事务性的,因此这两个环节不会出现数据的丢失,唯一可能丢失数据的情况是Channel采用memoryChannel,agent宕机导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失。

Flume不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由Sink发出,但是没有接收到响应,Sink会再次发送数据,此时可能会导致数据的重复。

Flume Kafka Sink了解过吗


Kafka Sink是Flume提供的一种Sink类型,用于将Flume收集到的数据写入Kafka集群中,以实现数据的可靠传输和消息队列的功能。在Kafka Sink中,数据被分成小块,然后通过Kafka的生产者API将数据写入到Kafka的一个或多个分区中。Kafka Sink支持多线程,并且具有高吞吐量和可靠性的优点,因此在实时数据传输场景中应用广泛。

Flume写到HDFS怎么分区


Flume将数据写入HDFS时可以使用HDFS Sink的文件滚动机制来进行分区。文件滚动机制会根据一定的条件对数据进行分组并写入不同的文件中,这样可以将数据进行分区。HDFS Sink支持三种滚动机制:

  • 时间滚动:根据时间滚动,指定滚动的时间间隔,比如每隔10分钟滚动一次文件。
  • 大小滚动:根据文件大小滚动,指定滚动的文件大小,比如每个文件大小不超过100MB。
  • 事件滚动:根据事件数量滚动,指定滚动的事件数量,比如每隔10000条事件滚动一次文件。

使用这些滚动机制可以将数据写入不同的文件中,从而实现分区。同时也可以设置HDFS目录结构,使得数据能够更加有序地存储在HDFS中。

Flume如果出现数据重复是什么原因


Flume可能出现数据重复的原因有很多,比如:

  • Source 端本身就有重复数据,比如应用程序本身就会重复发送消息,或者在日志文件中重复写入了同样的内容。
  • Flume 的 Channel 中因为写入操作和消费操作不是原子的,可能会导致一条数据被消费了多次。
  • Flume 的 Sink 端出现了宕机或者其他异常情况,导致部分数据未能被成功写入目标系统。
  • Flume 配置错误,可能导致数据被写入多个 Sink,从而出现重复数据。

Flume的配置文件怎么写的


其实这个问题主要是问的你项目里面用的,照实说就行。

Flume的配置文件采用properties文件格式,主要由三个部分组成:Source、Channel、Sink。其中Source用来定义数据源,Channel用来定义数据流转的中间存储,Sink用来定义数据的输出目标。

示例

在这里插入图片描述

在这个示例中,Source定义了一个netcat类型的数据源,绑定到了Channel1;Channel定义了一个memory类型的中间存储,容量为1000;Sink定义了一个logger类型的输出目标,绑定到了Channel1。在最后,通过绑定Source和Channel,以及绑定Channel和Sink,完成了整个Flume的流程配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【科研基础】分布式信源编码与中继通信

[1] Bian, Chenghong, et al. “Deep joint source-channel coding over cooperative relay networks.” arXiv preprint arXiv:2211.06705 (2022). [2] Bian, Chenghong, et al. “Process-and-Forward: Deep Joint Source-Channel Coding Over Cooperative Relay Networks.”…

还在用传统知识库?AI知识库才是企业的最优选择

在数字化和信息化日趋严重的时代,企业不仅要处理海量的数据,同时还要有效地管理和利用它们。这就使得知识库,作为一种集中存储、管理和共享知识资源的工具,被越来越多的企业所重视。然而,随着技术的快速迭代&#xff0…

RabbitMQ 安装保姆级教程

目录 1.MQ引言 1.1 什么是MQ 1.2 MQ有哪些 1.3 不同MQ特点 2.RabbitMQ 的引言 2.1 RabbitMQ 2.2 RabbitMQ 的安装 2.2.1 下载 2.2.2 下载的安装包 2.2.3 安装步骤 3. RabiitMQ 配置 3.1RabbitMQ 管理命令行 3.2 web管理界面介绍 3.2.1 overview概览 3.2.2 Admin用…

蓝桥杯物联网遇见的重大BUG及其产生原因和解决方法

BUG列表 1、ADC的RP2显示一直为0:2、LORX_Tx发送数据乱码:3、strcmp比较char a[2] {1, 2}与“12”字符串是否相等板子会死机:4、LORA_Tx和LORA_Rx放一起会接收不到数据:5、RTC获取到静止时间:6、ADC获取RP1和RP2模拟量…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统,帮助商…

citus的快速开始

准备 dockercitus最新版本(docker pull citusdata/citus) docker网络 docker network create --subnet172.72.9.0/24 citus-test docker network ls启动citus服务 启动协调节点 docker run -dit --name citus-cod -p 5433:5432 -e POSTGRES_PASSWOR…

背景减除(1)--bgslibrary Windows编译和使用

入侵监控领域中,在固定场景下,需要检测和监控的入侵物体种类繁多,无法具体穷尽。传统的CV算法提取的特征应用场景有限,无法完成大量物体的监控;深度学习目标检测方法没法收集到无穷无尽的物体种类,因此监督…

MySQL数据库备份及恢复

一、数据库备份的分类 1.1 从物理与逻辑的角度 从物理与逻辑的角度,备份可分为物理备份、逻辑备份 物理备份:对数据库操作系统的物理文件(如数据文件日志文件等)的备份 物理备份方法 冷备份(脱机备份)是在关闭数据库的时候进行的 热备份(联机备份):数…

手撕算法-盛最多水的容器

描述 分析 两个板之间能盛下的水的量,取决于短板。想让两个板之间能盛下更多的水,需要改变短板的长度。就像水桶效应:那么用两个指针指向容器的两个板,然后每次移动较短的板即可。移动较短的板,可能会增大容积&#x…

Linux安装Oracle 11G

一、准备工作: 1、CentOS7自行安装(64位),网络自行配置; 2、下载Oracle安装包:linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip ; 3、HostName修改:ora…

ES6学习之路:迭代器Iterator和生成器Generator

迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…

深入解析Mybatis-Plus框架:简化Java持久层开发(十三)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 本章节介绍下Mybatis-Plus框架的逻辑删除功能。 📖 正文 1 逻辑删除介绍 1.1 什么是逻辑删除? 首先我们先来了解下与逻辑删除对应…

面试八股——Redis——分布式锁——Redisson

1.看门狗机制 注意看门狗机制:redisson会监听持有锁的线程,并每隔一段时间(releaseTime/3,默认releaseTime为30s),如果线程还未释放锁的话,会给锁做一次续期。 2. 主从一致性 实际开发中我们会搭建多台redis服务器&a…

pytest+yaml+allure接口自动化测试框架

前言# 现在是2024年,自动化测试,是目前测试行业一项比较普遍的测试技术了,之前的以UI自动化测试为主,现在的以接口自动化测试为主,无论技术更迭,自动化测试总有他的重量,用机器代替手工工作&am…

C语言 青蛙跳台阶问题

1.问题描述 一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶有多少种跳法? 2.问题分析 当台阶只有一级时,只能跳一级,所以只有一种跳法 当台阶有两级时,可以先跳一级&#xff…

【Flutter学习笔记】10.3 组合实例:TurnBox

参考资料:《Flutter实战第二版》 10.3 组合实例:TurnBox 这里尝试实现一个更为复杂的例子,其能够旋转子组件。Flutter中的RotatedBox可以旋转子组件,但是它有两个缺点: 一是只能将其子节点以90度的倍数旋转二是当旋转…

分治归并问题

“别让自我被拯救~” 谈谈归并与分治 当我们首次接触排序算法时,一定对所谓 "归并"方式排序的算法感到头疼~ 因为,我们难以形象出其不断 "分离"时,各个区域的状态。然而,即便 "归并"排序算法的学习…

哪些行业需要在线制作电子证书系统?

哪些行业需要在线制作电子证书系统? 1、教育机构:学校和培训机构需要为学生和培训者颁发证书,您的系统可以帮助他们快速生成和管理这些证书。 2、企业及政府部门:用于员工培训、资质认证等,提高内部管理效率。 3、专…

【C++】虚拟继承 组合

目录 一、虚拟继承 🌟【非虚拟内存分布】 🌟【虚拟继承内存分布】 🌟【虚拟继承读取】 🌟【练习检验】 🌟【继承的总结和反思】 二、组合 🌟【继承和组合】 🌟【前言回顾】 上一篇文章我们…

GL-15过流继电器 10A、5A 板前接线带附件 JOSEF约瑟

系列型号: GL-11过流继电器; GL-12过流继电器; GL-13过流继电器; GL-14过流继电器; GL-15过流继电器; GL-16过流继电器; GL-17过流继电器; 用途 GL-10系列过流继电器(以下简称继电器)具有反时限特性,应用于电机、变压器等主设备以及输配电系统的继电保…