Kafka & Flume & Sqoop

本文介绍了Kafka的基本原理,包括其消息发布/订阅模型,以及如何保证消息顺序性。Kafka通过分区和消费者组实现部分有序性,并通过与Zookeeper配合管理集群。此外,文章还探讨了Kafka消息的产生和消费过程,以及避免重复数据的方法。同时,文章提到了Flume和Sqoop在数据导入HDFS和MySQL中的作用,包括Flume的Event模型和Sqoop的增量导入策略。
摘要由CSDN通过智能技术生成

Q1、 kafka基本原理,kafka如何保证接收消息的顺序性
Kafka基本原理:Kafka是apache开源一个分布式的、可分区的、可复制的消息系统。将消息的发布称producer,将消息的订阅表述为 consumer,将中间的存储阵列称作 broker
Producer (push) —> Broker <----(pull) Consumer
Kafka集群中包含若干Producer,若干broker(Kafka支持水平扩展,一般 broker数量越多,集群吞吐率越高),若干ConsumerGroup,以及一个 Zookeeper 集群。
Kafka通过 Zookeeper 管理集群配置,选举 leader,以及在 ConsumerGroup发生变化时进行rebalance。Producer 使用 push 模式将消息发布到broker,Consumer 使用pull 模式从 broker订阅并消费消息。
发布/订阅消息需要指定 Topic
为了使得Kafka 的吞吐率可以线性提高,物理上把Topic 分成一个或多个Partition,每个 Partition在物理上对应一个文件夹,该文件夹下存储这个Partition 的所有消息和索引文件。创建一个 topic时,同时可以指定分区数目,分区数越多,其吞吐量也越大,但是需要的资源也越多,同时也会导致更高的不可用性,kafka 在接收到生产者发送的消息之后,会根据均衡策略将消息存储到不同的分区中。因为每条消息都被append 到该 Partition中,属于顺序写磁盘,因此效率非常高

Kafka保证接收消息的顺序性:
通过分区的概念,Kafka可以在多个consumer组并发的情况下提供较好的有序性和负载均衡。将每个分区分只分发给一个consumer组,这样一个分区就只被这个组的一个consumer消费,就可以顺序的消费这个分区的消息。因为有多个分区,依然可以在多个consumer组之间进行负载均衡。注意consumer组的数量不能多于分区的数量,也就是有多少分区就允许多少并发消费。Kafka只能保证一个分区之内消息的有序性,在不同的分区之间是不可以的。如果需要topic中所有消息的有序性,那就只能让这个topic只有一个分区,当然也就只有一个consumer组消费它。

Q2、 kafka的消息产生和消费过程是如何实现的?
• Broker获取消息的 start offset和size (获取消息的size大小),根据 .index 数据查找 offset 相关的 position 数据,由于 .index 并不存储所有的 offset,所以会首先查找到小于等于 start_offset 的数据, 然后定位到相应的 .log 文件,开始顺序读取到 start_offset 确定 position。

• 根据 position 和 size 便可确认需要读取的消息范围,根据确定的消息文件范围,直接通过 sendfile 的方式将内容发送给消费者。

Q3、 如何保证kafka有且仅消费一次?kafka丢数据怎么解决?
已经消费了数据,但是offset没提交,设置了offset自动提交 ,至少发一次+去重操作(幂等性)。定位数据是否在kafka之前就已经丢失还事消费端丢失数据的,kafka支持数据的重新回放功能(换个消费group),清空目的端所有数据,重新消费。如果是在消费端丢失数据,那么多次消费结果完全一模一样的几率很低。如果是在写入端丢失数据,那么每次结果应该完全一样(在写入端没有问题的前提下)

Q4、 kafka如何避免consumer得到重复的数据?
将消息的唯一标识保存到外部介质中,每次消费处理时判断是否处理过。

Q5、 kafka一个节点producer收集数据失败,你们是如何知道的,如何解决?
使用producer产生数据时,在producer中可以通过配置返回值来确定所产生的数据已经被kafka收录。props.put(“request.required.acks”, “1”);返回值为“1”时,表示producer每生产一条数据会跟leader的replica确认是否收到数据。

Q6、 KafKa获取的数据如何存入hdfs?

  1. 可以通过flume从kafka获取数据然后存储到HDFS上
  2. 可以和流式计算引擎(比如spark,storm等)整合,由计算引擎写入
  3. 当然也可以手动代码实现

Q7、 spark读取kafka数据设置的两个参数?
metadata.broker.list
group.id

Q8、 如何保证Kafka数据不丢失?
1.同步模式下:
producer.type=sync
request.required.acks=1
(0表示不需要反馈信息,1表示写入leader成功,2表示所有备份块写入成功)
2.异步模式下:
如果是异步模式:通过buffer来进行控制数据的发送,有两个值来进行控制,时间阈值与消息的数量阈值,如果buffer满了数据还没有发送出去,如果设置的是立即清理模式,风险很大,一定要设置为阻塞模式
block.on.buffer.full = true
3.当存有你最新一条记录的 replication 宕机的时候,Kafka 自己会选举出一个主节点,如果默认允许还未同步最新数据的 replication 所在的节点被选举为主节点的话,你的数据将会丢失,因此这里应该按需将参数调控为 false;
unclean.leader.election.enable = false (默认参数为 true)

Q9、 Kafka leader选举?
如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Leader。显然,只有那些跟Leader保持同步的Follower才应该被选作新的Leader。
  Kafka会在Zookeeper上针对每个Topic维护一个称为ISR(in-sync replica,已同步的副本)的集合,该集合中是一些分区的副本。只有当这些副本都跟Leader中的副本同步了之后,kafka才会认为消息已提交,并反馈给消息的生产者。如果这个集合有增减,kafka会更新zookeeper上的记录。
  如果某个分区的Leader不可用,Kafka就会从ISR集合中选择一个副本作为新的Leader。

Q10、 如果sparkStreaming与kafka对接发现某个分区数据量特别大,怎么解决?
1.自定义Kafka分区组件
2.sparkStreaming 重分区

Q11、 kafka可以按照字典顺序消费数据吗?
正常情况是不可以按照字典顺序消费的。因为kafka是不能保证一个topic是全局有序的。只能保证每一个topic中的每一个分区是有序的。所以如果想实现一个topic全局有序,那么请设置这个topic为一个分区,并且生产者生产的消息必须是按照字典排序的。因为消费者也只能顺序读取kafka的topic数据。

Q12、 说说你对flume的了解?
Flume 是一个分布式、可靠、高可用的海量日志聚合系统
1.x版本之前是Flume OG版本,之后是Flume NG版本
Flume-og采用了多Master的方式。为了保证配置数据的一致性,Flume引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用gossip协议同步数据。
Flume-ng最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。
Flume NG中事件Event是基本数据单位,Agent 为最小的独立运行单位,一个agent 由Source、Sink 和 Channel 三大组件构成:
在这里插入图片描述
Source:配置数据来源,常用的有Avro Source、Exec Source、Spooling Directory Source等
Channel: 主要提供一个队列的功能,对source提供中的数据进行简单的缓存。常用的有了 Memory Channel、JDBC Chanel、File Channel等
Sink:从Channel中取数据,进行相应的存储文件系统,数据库,或者提交到
远程服务器,常用的有HDFSsink、 Logger sink、 Avro sink,kafka sink等

Q13、 Flume的可靠性保证有哪些?
为了保证配置数据的一致性,Flume引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点

Q14、 Sqoop增量导入
增量导入:需要指定哪些数据是新增的
–check-column 指定字段, 一般来说,都是mysql的主键
–incremental ‘append’ or ‘lastmodified’
–last-value 上一次增量导入的返回结果:主键的值,当前这个主键值的后续数据全部都是新增数据
例如:
sqoop import
–connect jdbc:mysql://hadoop02:3306/mysql
–username root \ --password root
–table help_keyword
–target-dir /user/hadoop/myimport3
–incremental append
–check-column help_keyword_id
–last-value 500
-m 1

Q15、 sqoop 在导入数据到 mysql 中,如何让数据不重复导入?如果存在数据问题 sqoop如何处理?
一种方式是在导入前对hdfs的数据进行去重;
另一种方式是导出到mysql,在mysql端写存储过程去重,或者也可以通过增量导入的方式保证不插入重复的数据

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值