flume面试题

时间:2019-12-14
本文章向大家介绍flume面试题,主要包括flume面试题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 你是如何实现Flume数据传输的监控的
使用第三方框架Ganglia实时监控Flume。

2 Flume的Source,Sink,Channel的作用?你们Source是什么类型?
1、作用 (1)Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy (2)Channel组件对采集到的数据进行缓存,可以存放在Memory或File中。 (3)Sink组件是用于把数据发送到目的地的组件,目的地包括Hdfs、Logger、avro、thrift、ipc、file、Hbase、solr、自定义。

2、我公司采用的Source类型为: (1)监控后台日志:exec (2)监控后台产生日志的端口:netcat

3 Flume 的 Channel Selectors


 

4 Flume 参数调优
Source 增加Source个数(使用Tair Dir Source时可增加FileGroups个数)可以增大Source的读取数据的能力。 例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个 Source 以保证 Source 有足够的能力获取到新产生的数据。 batchSize 参数决定 Source 一次批量运输到 Channel 的event条数,适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。

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 参数。

Sink 增加 Sink 的个数可以增加 Sink 消费 event 的能力。Sink 也不是越多越好够用就行,过多的 Sink 会占用系统资源,造成系统资源不必要的浪费。 batchSize 参数决定 Sink 一次批量从 Channel 读取的 event 条数,适当调大这个参数可以提高 Sink 从 Channel 搬出 event 的性能。

5 Flume 的事务机制
Flume的事务机制(类似数据库的事务机制):

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

比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么 Soucrce 就将该文件标记为完成。

同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到 Channel 中,等待重新传递。

6 Flume 采集数据会丢失吗?
不会,Channel 存储可以存储在 File 中,数据传输自身有事务。

------------------------------------------------------------------------------------------------------

1.Flume 采集数据会丢失吗?

不会,Channel 存储可以存储在 File 中,数据传输自身有事务。

2.Flume 与 Kafka 的选取?

采集层主要可以使用 Flume、Kafka 两种技术。
Flume:Flume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展 API。
Kafka:Kafka 是一个可持久化的分布式的消息队列。
Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题Topics。相比之下,Flume 是一个专用工具被设计为旨在往 HDFS,HBase 发送数据。它对HDFS 有特殊的优化,并且集成了 Hadoop 的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用 kafka;如果数据被设计给 Hadoop 使用,使用 Flume。正如你们所知 Flume 内置很多的 source 和 sink 组件。然而,Kafka 明显有一个更小的生产消费者生态系统,并且 Kafka 的社区支持不好。希望将来这种情况会得到改善,但是目前:使用 Kafka 意味着你准备好了编写你自己的生产者和消费者代码。如果已经存在的 Flume    Sources 和 Sinks 满足你的需求,并且你更喜欢不需要任何开发的系统,请使用 Flume。Flume 可以使用拦截器实时处理数据。这些对数据屏蔽或者过量是很有用的。Kafka 需要外部的流处理系统才能做到。
Kafka 和 Flume 都是可靠的系统,通过适当的配置能保证零数据丢失。然而,Flume 不支持副本事件。于是,如果 Flume 代理的一个节点奔溃了,即使使用了可靠的文件管道方式,你也将丢失这些事件直到你恢复这些磁盘。如果你需要一个高可靠行的管道,那么使用Kafka 是个更好的选择。
Flume 和 Kafka 可以很好地结合起来使用。如果你的设计需要从 Kafka 到 Hadoop 的流数据,使用 Flume 代理并配置 Kafka 的 Source 读取数据也是可行的:你没有必要实现自己的消费者。你可以直接利用Flume 与HDFS 及HBase 的结合的所有好处。你可以使用ClouderaManager 对消费者的监控,并且你甚至可以添加拦截器进行一些流处理。

3.数据怎么采集到 Kafka,实现方式?

使用官方提供的 flumeKafka 插件,插件的实现方式是自定义了 flume 的 sink,将数据从channle 中取出,通过 kafka 的producer 写入到 kafka 中,可以自定义分区等。

4.flume 管道内存,flume 宕机了数据丢失怎么解决?

 1)Flume 的 channel 分为很多种,可以将数据写入到文件。
 2)防止非首个 agent 宕机的方法数可以做集群或者主备

5.  flume 和 kafka 采集日志区别,采集日志时中间停了,怎么记录之前的日志?

 Flume 采集日志是通过流的方式直接将日志收集到存储层,而 kafka 是将缓存在 kafka集群,待后期可以采集到存储层。
Flume 采集中间停了,可以采用文件的方式记录之前的日志,而 kafka 是采用 offset 的方式记录之前的日志。

6.flume 有哪些组件,flume 的 source、channel、sink 具体是做什么的?

1)source:用于采集数据,Source 是产生数据流的地方,同时 Source 会将产生的数据
流传输到 Channel,这个有点类似于 Java IO 部分的 Channel。
2)channel:用于桥接 Sources 和 Sinks,类似于一个队列。
3)sink:从 Channel 收集数据,将数据写到目标源(可以是下一个 Source,也可以是 HDFS
或者 HBase)。 

7.为什么使用Flume?

8.Flume组成架构?

关于flume事务
flume要尽可能的保证数据的安全性,其在source推送数据到channel以及sink从channel拉取数据时都是以事务方式进行的。因为在agent内的两次数据传递间都会涉及到数据的传送、从数据上游删除数据的问题;就比如sink从channel拉取数据并提交到数据下游之后需要从channel中删除已获取到的批次数据,其中跨越了多个原子事件,故而需要以事务的方式将这些原子事件进一步绑定在一起,以便在其中某个环节出错时进行回滚防止数据丢失。所以在选用file channel时一般来说是不会丢失数据的。
 

9.FlumeAgent内部原理?

10.Flume Event 是数据流的基本单元

它由一个装载数据的字节数组(byte payload)和一系列可选的字符串属性来组成(可选头部).


 

11.Flume agent

Flume source 消耗从类似于 web 服务器这样的外部源传来的 events.

外部数据源以一种 Flume source 能够认识的格式发送 event 给 Flume source.

Flume source 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy.

flume source 是负责接收数据到 Flume Agent 的组件


2. Flume channel
当 Flume source 接受到一个 event 的时, Flume source 会把这个 event 存储在一个或多个 channel 中.

Channel 是连接Source和Sink的组件, 是位于 Source 和 Sink 之间的数据缓冲区。

Flume channel 使用被动存储机制. 它存储的数据的写入是靠 Flume source 来完成的, 数据的读取是靠后面的组件 Flume sink 来完成的.

Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个 Sink 的读取操作。

Flume 自带两种 Channel:

Memory Channel

Memory Channel是内存中的队列。

Memory Channel在不需要关心数据丢失的情景下适用。

如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。

File Channel。

File Channel将所有事件写到磁盘。

因此在程序关闭或机器宕机的情况下不会丢失数据。

还可以有其他的 channel: 比如 JDBC channel.


 

3. Flume sink
Sink 不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者发送到另一个Flume Agent。

Sink 是完全事务性的。

在从 Channel 批量删除数据之前,每个 Sink 用 Channel 启动一个事务。批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink 就利用 Channel 提交事务。事务一旦被提交,该 Channel 从自己的内部缓冲区删除事件。如果写入失败,将缓冲区takeList中的数据归还给Channel。

Sink组件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定义。


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

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

13.flume 调优 :

source :
1 ,增加 source 个数,可以增大 source 读取能力。
2 ,具体做法 : 如果一个目录下生成的文件过多,可以将它拆分成多个目录。每个目录都配置一个 source 。
3 ,增大 batchSize : 可以增大一次性批处理的 event 条数,适当调大这个参数,可以调高 source 搬运数据到 channel 的性能。
channel :
1 ,memory :性能好,但是,如果发生意外,可能丢失数据。
2 ,使用 file channel 时,dataDirs 配置多个不同盘下的目录可以提高性能。
3 ,transactionCapacity 需要大于 source 和 sink 的 batchSize 参数
sink :
增加 sink 个数可以增加消费 event 能力

------------------------------------------------------------------------------------------------------------------------------------

1 ,如何实现 flume 传输数据的实时监控
使用第三方框架 ganglia

2 ,flume 的 source,sink,channel 的作用,你们的 source 类型是 ?
source :搜集数据
channel :数据缓存
sink :把数据发送到目的地
常用 source 类型 :
1 ,监控文件 :exec
2 ,监控目录 :spooldir
3 ,flume 选择器 :
包括两种 :
1 ,每个通道都复制一份文件,replicating 。
2 ,选择性发往某个通道,Multiplexing 。
4 ,flume 调优 :
source :
1 ,增加 source 个数,可以增大 source 读取能力。
2 ,具体做法 : 如果一个目录下生成的文件过多,可以将它拆分成多个目录。每个目录都配置一个 source 。
3 ,增大 batchSize : 可以增大一次性批处理的 event 条数,适当调大这个参数,可以调高 source 搬运数据到 channel 的性能。
channel :
1 ,memory :性能好,但是,如果发生意外,可能丢失数据。
2 ,使用 file channel 时,dataDirs 配置多个不同盘下的目录可以提高性能。
3 ,transactionCapacity 需要大于 source 和 sink 的 batchSize 参数
sink :
增加 sink 个数可以增加消费 event 能力
5 ,事务机制 :
channel : 是位于 source 和 sink 之间的缓冲区。
1 ,flume 自带两种缓冲区,file channel 和 memory channel
2 ,file channel : 硬盘缓冲区,性能低,但是安全。系统宕机也不会丢失数据。
3 ,memory channel :内存缓冲区,性能高,但是有可能丢数据,在不关心数据有可能丢失的情况下使用。
put 事务流程 : 源将数据给管道
1 ,doPut :把数据写入临时缓冲区 putList 。
2 ,doCommit :检查 channel 内存队列是否足够合并。
3 ,doRollBack : 如果 channel 不行,我们就回滚数据。
take 事务流程 :
1 ,先将数据取到临时缓冲区 takeList。
2 ,doCommit :如果数据全部发送成功,就清除临时缓冲区。
3 ,doRollBack :如果数据发送过程中出现异常,doRollBack 将临时缓冲区的数据还给 channel 队列


6 ,flume 传数据会丢失吗 :
不会,因为 channel 可以存储在 file 中,而且 flume 本身是有事务的。
可以做 sink 组,一个坏掉了,就用另一个。
7 ,个人总结 : flume 总结
transactionCapacity :事务容量大小,指的就是 putList 和 takeList 的大小
transactionCapacity > batchSize

-----------------------------------------------------------------------------------------------------------------------------

1  怎样对Flume  数据传输进行监控
    使用第三方框架 Ganglia 实时监控 Flume。
2 Flume的Source ,Sink ,Channel的作用? 使用过哪些Source类型?
    作用

Source 组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy
Channel 组件对采集到的数据进行缓存,可以存放在 Memory 或 File 中。
Sink 组件是用于把数据发送到目的地的组件,目的地包括 Hdfs、Logger、avro、thrift、ipc、file、Hbase、solr、自定义。
  常用的Source 类型:

(1)监控后台日志:exec
(2)监控后台产生日志的端口:netcat  ,Exec spooldir
3 Flume 的 Channel Selectors有几种
Channel Selectors,可以让不同的项目日志通过不同的Channel到不同的Sink中去。
官方文档上Channel Selectors 有两种类型:Replicating Channel Selector (default)和Multiplexing Channel Selector
这两种Selector的区别是:Replicating 会将source过来的events发往所有channel,而Multiplexing可以选择该发往哪些Channel。
4 Flume参数调优
Source
增加 Source 个(使用 Tair Dir Source 时可增加 FileGroups 个数)可以增大 Source 的读取数据的能力。例如:当某一个目录产生的文件过多时需要将这个文件目录拆分成多个文件目录,同时配置好多个 Source 以保证 Source 有足够的能力获取到新产生的数据。batchSize 参数决定 Source 一次批量运输到 Channel 的 event 条数,适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。
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 参数。
Sink
增加 Sink 的个数可以增加 Sink 消费 event 的能力。Sink 也不是越多越好够用就行,过多的 Sink 会占用系统资源,造成系统资源不必要的浪费。
batchSize 参数决定 Sink 一次批量从 Channel 读取的 event 条数,适当调大这个参数可以提高 Sink 从 Channel 搬出 event 的性能。

5 Flume的事务机制
Flume 的事务机制(类似数据库的事务机制):Flume 使用两个独立的事务分别负责从Soucrce 到 Channel,以及从 Channel 到 Sink 的事件传递。比如 spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到 Channel 且提交成功,那么Soucrce 就将该文件标记为完成。同理,事务以类似的方式处理从 Channel 到 Sink 的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到Channel 中,等待重新传递。

6 Flume可以保证采集和发送数据的正确性吗?
在单机 upd环境下,采集数据时,如果读写大于100M/s的情况下会出现丢包现象,可以对丢失率进行统计,如果在可接受范围内不做处理,如果不能接受可以修改源码或者借鉴flume原理自行开发收集框架;
对收集到的数据,flume可以将其存储下磁盘中,且数据传输自身有事务。确保发送数据不丢失。

-----------------------------------------------------------------------------------------------------------------------------

一、Hive 基本面试

1、什么是 metastore

  metadata 即元数据。包含 database、tabel、column names、partitions 信息、bucketing 信息等的元数据信息。
  元数据默认是存储在 Derby 中,建议存储在关系型数据库中。

2、metastore 安装方式有什么区别

内嵌模式
  内嵌模式使用的是内嵌的 Derby 数据库来存储元数据,也不需要额外起 Metastore 服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。

本地元存储
  本地安装 mysql 替代 derby 存储元数据,这种安装方式和嵌入式的区别在于,不再使用内嵌的 Derby 作为元数据的存储介质,而是使用其他数据库比如 MySQL 来存储元数据。hive 服务和 metastore 服务运行在同一个进程中,mysql 是单独的进程,可以同一台机器,也可以在远程机器上。

远程元存储(HiveServer2)
  Hive 服务和 metastore 在不同的进程内,可能是不同的机器,该模式需要将 hive.metastore.uris 设置为 metastore 服务器 URL,如果有多个 metastore 服务器,将 URL 之间用逗号分隔,metastore 服务器 URL 的格式为 thrift://127.0.0.1:9083。

3、什么是 Managed Table 跟 External Table?

  • 1、Hive 有两种类型的表 Managed Table(内部表) 跟 External Table(外部表)。
  • 2、Managed Table:也被称作 Internal table,这种表是 hive 的默认类型。如果你在创建表的时候没有指明 Managed 或者 External,那么默认就会给你创建 Managed Table。
      a、Managed Table 的数据,会存放在 HDFS 中的特定的位置中,通常是 /user/username/hive/warehouse
      b、我们可以使用 describe formatted table_name; 命令来查看表的信息。
      c、当你删除 drop table table_name; 删除表时,数据文件也会一并删除。
  • 3、External Table:特别适用于想要在 Hive 之外使用表的数据的情况.当你删除 External Table 时,只是删除了表的元数据,它的数据并没有被删除。

4、什么时候使用 Managed Table 跟 External Table?

  • Managed Table
    • 适用于临时创建的中间表
  • External Table
    • 适用于数据多部门共享

5、hive 有哪些复合数据类型?

1、MAP

    a.Map 复合数据类型提供了 key-value 对存储,你可以通过 key 获取 value。
    b.zhangsan Math:90,Chinese:92,English:78
        i.create table score_map(name string, score map<string, int>) map keys terminated by ':';
        ii.select name, score['English'], size(score) from score_map;

2、STRUCT

    a.Struct 是不同数据类型元素的集合。
    b.zhangsan Math,90
        i.create table course_struct(name string, course struct<course: string, score: int>) collection items terminated by ',';
        ii.select name, course.score, course.course from course_struct;

3、ARRAY

    a.Array 是同类型元素的集合.
    b.zhangsan beijing,shanghai,hangzhou
        i.create table person_array(name string, work_locations array<string>) collection items terminated by ',';
        ii.select name, work_locations[0], size(work_locations) from person_array;

4、UNIONTYPE

    a.它代表一个可以具有属于你所选择的任何数据类型的值的列。
    b.官方支持不完整,在 join 查询中,group by 或者 where 字句会失败,目前可以不用这个集合。

6、hive 分区有什么好处?

  • 最大的好处就是可以更快的执行查询。
  • 在分区的帮助下,将使用分区列的名称创建一个子目录,并且当使用 WHERE 子句执行查询时,将只扫描特定的子目录,而不是扫描整个表。这时可以更快地执行查询。

7、hive 分区跟分桶的区别

  • 分区: 是以字段的形式在表结构中存在,通过 describe table 命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)。
  • 分桶:对于表(table)或者分区,Hive 可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。Hive 采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。实际使用比较少。

8、hive 如何动态分区

  • 与分区有关的有两种类型的分区:静态和动态。在静态分区中,您将在加载数据时(显式)指定分区列。
  • 而在动态分区中,您将数据推送到 Hive,然后 Hive 决定哪个值应进入哪个分区。要启用动态分区,请设置下面的属性:hive.exec.dynamic.parition.mode=nonstrict;
insert overwrite table emp_details_partitioned partition(location)
select * from emp_details;

9、map join 优化手段

Hive 可以进行多表 Join。Join 操作尤其是 Join 大表的时候代价是非常大的。

表 Join 的顺序(大表放在后面)
    当 Hive 执行 Join 时,需要选择哪个表被流式传输(stream),哪个表被缓存(cache)。 Hive 将 JOIN 语句中的最后一个表用于流式传输,因此我们需要确保这个流表在两者之间是最大的。
    如果要在不同的 key 上 join 更多的表,那么对于每个 join 集,只需在 ON 条件右侧指定较大的表。 

Sort-Merge-Bucket(SMB) Map Join
    它是另一种 Hive join 优化技术,使用这个技术的前提是所有的表都必须是桶分区(bucket)和排序了的(sort)。
    set hive.enforce.sortmergebucketmapjoin=false;  -- 当用户执行 bucket map join 的时候,发现不能执行时,禁止查询。
    set hive.auto.convert.sortmerge.join=true;  -- 如果 join 的表通过 sort merge join 的条件,join 是否会自动转换为 sort merge join。
    set hive.optimize.bucketmapjoin=true;  -- bucket map join 优化
    set hive.optimize.bucketmapjoin.sortedmerge=true;  -- bucket map join 优化
    set hive.auto.convert.join=false;  -- 禁止自动 map side join 发生

10、如何创建 bucket 表?

  • 默认情况下,在 Hive 中禁用分桶功能,可以通过设置下面的属性强制启用分桶功能:hive.enforce.bucketing=true;

11、hive 有哪些 file formats

Text File format : 默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

Sequence File format :
    SequenceFile 是 Hadoop API 提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
    SequenceFile 支持三种压缩选择:NONE, RECORD, BLOCK。 Record 压缩率低,一般建议使用 BLOCK 压缩。

RC file format : RCFILE 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个 record 在一个块上,避免读一个记录需要读取多个 block。其次,块数据列式存储,有利于数据压缩和快速的列存取。RCFile 目前没有性能优势,只有存储上能省 10% 的空间。

Parquet : 列式数据存储。
AVRO : avro Schema 数据序列化。
ORC : 对RCFile做了一些优化,支持各种复杂的数据类型。

12、hive 最优的 file formats 是什么?

ORC file formats: 
    1、ORC 将行的集合存储在一个文件中,并且集合内的行数据将以列式存储。采用列式格式,压缩非常容易,从而降低了大量的存储成本。
    2、当查询时,会查询特定列而不是查询整行,因为记录是以列式存储的。
    3、ORC 会基于列创建索引,当查询的时候会很快。

13、hive 传参

使用 env 获取当前 shell 环境的环境变量
eg: export datatime=’2017-11-10’
select * from tabliname where datatime = ${env:datatime};

使用 --hivevar 方式传入
hive --hivevar datatime ='datatime' --hivevar limit=10 -f filename.sql
select * from tablename where datatime = ${hivevar:datatime} limit ${hivevar:limit}

14、order by 和 sort by 的区别

使用 order by 会引发全局排序,有可能会导致任务失败。
使用 distribute by + sort by 替代方案,进行优化。

15、hive 跟 hbase 的区别

hive 支持 sql 查询,hbase 不支持。
hive 不支持 record 级(一行记录)的更新,删除操作。
hive 定义为数据仓库,hbase 定义为 nosql 数据库。

二、Flume + Kafka 面试

1、flume 如何保证数据的可靠性?

  • Flume 提供三种可靠性:JDBC、FILE、MEMORY
  • Flume 使用事务的办法来保证 event 的可靠传递。Source 和 Sink 分别被封装在事务中,这些事务由保存 event 的存储提供或者由 Channel 提供。这就保证了 event 在数据流的点对点传输中是可靠的。

2、kafka 数据丢失问题,及如何保证?

1、kafka 数据丢失问题

a、acks=1    的时候(只保证写入 leader 成功),如果刚好 leader 挂了,则数据会丢失。
b、acks=0    的时候,使用异步模式的时候,该模式下 kafka 无法保证消息,有可能会丢。

2、brocker 如何保证不丢失

a、acks=all      所有副本都写入成功并确认。
b、retries=一个合理值        kafka 发送数据失败后的重试值。(如果总是失败,则可能是网络原因)
c、min.insync.replicas=2     消息至少要被写入到这么多副本才算成功。
d、unclean.leader.election.enable=false      关闭 unclean leader 选举,即不允许非 ISR 中的副本被选举为 leader,以避免数据丢失。

3、consumer 如何保证不丢失?

a、如果在消息处理完成前就提交了 offset,那么就有可能造成数据的丢失。
b、enable.auto.commit=false     关闭自动提交 offset。
c、处理完数据之后手动提交。

3、kafka 工作流程原理

大致原理即可。有几个点稍微详细即可。

4、kafka 保证消息顺序

1、全局顺序
  a、全局使用一个生产者,一个分区,一个消费者。
2、局部顺序
  a、每个分区是有序的,根据业务场景制定不同的 key 进入不同的分区。

5、zero copy 原理及如何使用?

  • 1、zero copy 在内核层直接将文件内容传送给网络 socket,避免应用层数据拷贝,减小 IO 开销。
  • 2、java.nio.channel.FileChannel 的 transferTo() 方法实现 zero copy。

6、spark Join 常见分类以及基本实现机制

1、shuffle hash join、broadcast hash join 以及 sort merge join。

2、shuffle hash join

小表 join 大表,依次读取小表的数据,对于每一行数据根据 join key 进行 hash,hash 到对应的 Bucket(桶),生成 hash table 中的一条记录。
数据缓存在内存中,如果内存放不下需要 dump 到外存。
再依次扫描大表的数据,使用相同的 hash 函数映射 Hash Table 中的记录,映射成功之后再检查 join 条件,如果匹配成功就可以将两者 join 在一起。

3、broadcast hash join

如果小表数据量增大,内存不能放下的时候,分别将两个表按照 join key 进行分区,将相同 join key 的记录重分布到同一节点,两张表的数据会被重分布到集群中所有节点。这个过程称为 shuffle(网络混启)。
每个分区节点上的数据单独执行单机 hash join 算法。

4、sort merge join

两张大表 join 采用了 sort merge join 算法:
    shuffle 阶段:将两张大表根据 join key 进行重新分区,两张表数据会分布到整个集群,以便分布式并行处理。
    sort 阶段:对单个分区节点的两表数据,分别进行排序。
    merge 阶段:对排好序的两张分区表数据执行 join 操作。join 操作很简单,分别遍历两个有序序列,碰到相同 join key 就 merge 输出,否则取更小一边。

128G 内存、多磁盘、万兆网卡、吞吐(几千到一万

原文地址:https://www.cnblogs.com/sx66/p/12040557.html