大数据面试题 —— 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的流程配置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 二层口 实现三层口 IP 通信的一个实现方法

我们一般用 undo portswitch 来将二层口转为三层口,但如果设备不支持的话,那么。。。 一、拓朴图: 二、实现方法: 起一个 vlan x,配置 vlanif地址,然后二层口划分到 vlan x 下,对端做同样的配置…

一、MySQL基础学习

目录 1、MySQL启动2、MySQL客户端连接3、SQL3.1、SQL语句分类3.2、DDL(数据库定义语言)3.2.1、操作数据库3.2.2、操作数据表 3.3、DML(数据库操作语言)3.3.1、增加 insert into3.3.2、删除 delete3.3.3、修改 update 3.4、DQL&…

用python模拟天体运动(二体运动与天体轨道稳定问题)

目录 1. 模拟天体运动的代码 2. 运行效果 3. 非平方反比(轨道稳定性问题) 1. 模拟天体运动的代码 接下来我们将用python模拟实现天体运动 以下是我们所需要的库: import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy …

Java安装及环境配置详细教程

1.1 下载 Java 安装包 官网下载链接[点击跳转] 建议下载202版本,因为202版本之后的 Oracle JDK 是商用收费的(个人使用不收费) 1.2 勾选红框中内容,然后点击下方下载 1.3 如果没有登录 Oracle 则会跳转到该页面,因为…

使用多元线性回归简单预测

模型和代码 数据格式如下:前21列作为模型输入X,最后5列作为模型输出Y。 训练集: 测试集: 代码: from numpy import genfromtxt import numpy as np from sklearn.ensemble import GradientBoostingRegressor from …

解锁编程潜能:ChatGPT如何革新软件开发

目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代,软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步,越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一,最近…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中&#xff0c;添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js&#xff0c;将路由模式改成hash模式 import { createRouter, createWe…

【c++】string类---标准库(STL)中的string类

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.STL(标准库) 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 1.4 STL的重要性 1.5 如何学习STL 6.STL的缺陷 2. 为什么要学习st…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

SegFormer 项目排坑记录

SegFormer 项目排坑记录 任务记录创建conda环境 准备数据库和预训练参数程序配置修改测试可视化训练 任务 需要复现SegFormer分割项目&#xff0c;似乎还有点麻烦&#xff0c;参考这几个进行复现&#xff0c;记录下过程&#xff1a; SegFormer mmsegmentation CSDN博客 知乎博…

Docker 安装 Nginx 容器部署前端项目

先安装docker Docker安装详情 安装Nginx镜像 1、拉去取Nginx镜像 Nginx官方镜像 docker pull nginx 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx:xxx 下载指定版本的Nginx镜像 (xxx指具体版本号)我们拉去1.24.0的nginx镜像 …

视频号视频下载需要小程序提供下载支持!

前言&#xff1a;和大家分享一个视频号视频下载的方法&#xff01;可以帮助用户使用的工具将视频号视频保存到手机相册的&#xff01; 有时候在刷视频号的时候碰到自己喜欢的视频就情不自禁的想要把他下载下来&#xff0c; 1&#xff1a;遇到喜欢的视频视频怎么下载 例如&am…

中国传统游戏-幻方-c/c++实现

幻方&#xff08;Magic Square&#xff09;是一种将数字安排在正方形格子中&#xff0c;使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形&#xff0c;使在同一行、同…

Pytorch框架—文本情感分类问题项目(二)

整体过程就是首先拿到了数据集微博100K&#xff0c;对个这个评论数据集进行处理&#xff0c;分类标签和评论内容。对评论内容进行分词处理&#xff0c;之后进行词频统计对高词频的进行编码&#xff0c;低词频的进用《UNK》表示&#xff0c;并使用《PAD》把他们扩展到等长列表便…

MATLAB编译器配置:MinGW

使用 MATLAB 2022b版本&#xff0c;查询编译器时如上&#xff0c;想安装个MinGW编译器&#xff0c;自带的附加资源管理不好使&#xff0c;只能换个别的法子&#xff0c;经过一些参考&#xff0c;总结如下。 步骤1.在这里下载一个MinGW.最新版本是10.3.0.然后默认安装&#xff…

蓝桥杯刷题|03入门真题

目录 [蓝桥杯 2020 省 B1] 整除序列 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码及思路 [蓝桥杯 2020 省 AB3] 日期识别 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码及思路 [蓝桥杯 2019 省 B] 特别数的和 题目描述 输入格式 输出格…

谷歌的后量子密码学威胁模型

1. 引言 若现在不使用量子安全算法来加密数据&#xff0c;能够存储当前通信的攻击者最快十年内就能对其解密。这种先存储后解密的攻击是当前采用后量子密码学 (post-quantum cryptography&#xff0c;PQC) 背后的主要动机&#xff0c;但其他未来的量子计算威胁也需要一个深思熟…

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据 使用环境: ubantu16 QT5.7 开发板GEC6818 实现要求&#xff1a; 利用A53按键1、按键2与温湿度传感器完成QT界面动态显示温湿度记录&#xff0c;并指定温湿度记录超过指定范围&#xff0c;进行报警&#xff08;LED&#…

天锐绿盾|公司开发部门源代码泄露防护系统,无感透明加密软件

#代码加密、代码防泄密、开发部门源码防泄漏、源代码透明加密、办公透明加密系统# 天锐绿盾作为一款针对企业数据安全的专业软件&#xff0c;特别是在防止公司开发部门源代码泄露方面&#xff0c;提供了智能无感透明加密保护系统。 德人合科技 | 天锐绿盾 PC地址&#xff1a; …