-
线程的同步:相当于多个线程去同时访问同一块资源,但是每次只能有一个线程去访问,也就是会阻塞。解决线程同步的方法有(这也是常问的):互斥锁,信号处理,条件变量。
-
怎么创建socket通信
服务器: 1.创建一个socket 2.bind一个句柄(端口和地址) 3.listen设置监听的客户数 4.accept客户端的句柄 5.读写。
客户机:
1.创建一个socket 2.connect到服务器 3.读写操作。
-
线程和进程的区别:
(1)进程是系统进行资源分配和调度的一个独立单位。 线程是:是CPU调度和分派的基本单位。(2)线程的开销比进程的开销小。
(3)一个进程里面可以创建多个线程。
(4)进程是独立的内存单元,线程可以多个线程共享一片资源,提高处理效率。
4.进程间的通信方式有哪些?
管道 信号 socket 共享内存 消息队列
5.Kafka服务器能接收到的最大信息是多少?
Kafka服务器可以接收到的消息的最大大小是1000000字节。
6.解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使用Kafka吗?
Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。
不可以,不可能越过Zookeeper,直接联系Kafka broker。一旦Zookeeper停止工作,它就不能服务客户端请求;Zookeeper主要用于在集群中不同节点之间进行通信
7.解释Kafka的用户如何消费信息?
在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节从套接口转移到磁盘,通过内核空间保存副本,并在内核用户之间调用内核。
8.解释如何提高远程用户的吞吐量?
如果用户位于与broker不同的数据中心,则可能需要调优套接口缓冲区大小,以对长网络延迟进行摊销。
9.Kafka为什么需要复制?
Kafka的信息复制确保了任何已发布的消息不会丢失,并且可以在机器错误、程序错误或更常见些的软件升级中使用。
10.kafka基本原理,kafka如何保证接收消息的顺序性
| | |
|-
**Kafka基本原理:**Kafka是apache开源一个分布式的、可分区的、可复制的消息系统。将消息的发布称producer,将消息的订阅表述为 consumer,将中间的存储阵列称作 brokerProducer (push) —> Broker <----(pull) ConsumerKafka集群中包含若干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组消费它。
-|
| | |
11.kafka的消息产生和消费过程是如何实现的?
• Broker获取消息的 start offset和size (获取消息的size大小),根据 .index 数据查找 offset 相关的 position 数据,由于 .index 并不存储所有的 offset,所以会首先查找到小于等于 start_offset 的数据, 然后定位到相应的 .log 文件,开始顺序读取到 start_offset 确定 position。
• 根据 position 和 size 便可确认需要读取的消息范围,根据确定的消息文件范围,直接通过 sendfile 的方式将内容发送给消费者。
12.如何保证kafka有且仅消费一次?kafka丢数据怎么解决?
(1)已经消费了数据,但是offset没提交,设置了offset自动提交 ,至少发一次+去重操作(幂等性)。
(2)定位数据是否在kafka之前就已经丢失还是消费端丢失数据的,kafka支持数据的重新回放功能(换个消费group),清空目的端所有数据,重新消费。如果是在消费端丢失数据,那么多次消费结果完全一模一样的几率很低。如果是在写入端丢失数据,那么每次结果应该完全一样(在写入端没有问题的前提下)
13.kafka如何避免consumer得到重复的数据?
将消息的唯一标识保存到外部介质中,每次消费处理时判断是否处理过。
14.kafka一个节点producer收集数据失败,你们是如何知道的,如何解决?
使用producer产生数据时,在producer中可以通过配置返回值来确定所产生的数据已经被kafka收录。props.put(“request.required.acks”, “1”);返回值为“1”时,表示producer每生产一条数据会跟leader的replica确认是否收到数据。
15.KafKa获取的数据如何存入hdfs?
- 可以通过flume从kafka获取数据然后存储到HDFS上
- 可以和流式计算引擎(比如spark,storm等)整合,由计算引擎写入
- 当然也可以手动代码实现
16.spark读取kafka数据设置的两个参数?
kafkaParams、topics
17.如何保证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)
18.如果sparkStreaming与kafka对接发现某个分区数据量特别大,怎么解决?
1.自定义Kafka分区组件2.sparkStreaming 重分区
- kafka可以按照字典顺序消费数据吗?
只能单分区有序,不能全局有序
20.Kafka在zookeeper上记录了哪些信息
一共在zookeeper上记录了这些节点:consumers、admin、config、controller、brokers、controller_epoch。其中controller_epoch节点记录了kafka中的center controller选举的次数,这个值初始为1,当controller挂掉后重新选举时这个值+1。Controller节点记录了中央控制器所在哪一台broker的信息。
1、broker的节点信息
2、broker集群持有的topic和partition信息,并记录partition leader的位置。
3、正在消费的consumer节点信息
4、consumer消费的topic+partition列表
5、consumer消费的partition的offset可以看出,上面的消息无非就是用来监控集群变动,记录消费消息的