Kafka 3

1)Kafka的消费语义分析

    Flume-->Kafka-->Spark streaming

        Flume: 

             source: CDH NN LOG / xxx.log

             sink: kafka

    At most once:  最多一次,消息可能丢失,但是不会重复投递

    At least once:  至少一次,消息不会丢失 ack=all ,但是可能重复投递(0.10 生产使用)

    Exactly once:  正好一次,消息不会丢失,也不会重复 (这才是我们真正想要的)

        0.10.0.1和之前的版本 Exactly once不能实现,0.11 官方说已支持

        *****但是生产不会使用(0.11),稳定性不好说

                Q:幂等是什么概念??

                A:能保证系统是幂等的,那可以认为系统是正好一次的处理

    Producer:

        发送消息,有个commit的概念,如果commit成功,那意味着消息不会丢失;

                                                       如果commit不成功,那意味着消息会丢失;

    Consumer(Spark):

        消费消息,有个offset,是由consumer自己维护的。consumer能决定offset维护在哪里,比如:zk,kafka,hdfs,hbase等

            4条消息:1, 2, 3, 4

            offset(偏移量):0,1,2,3

        *****offset如果没有及时维护,consumer挂了,那么新的consumer就会从上一次更新的offset去消费 (生产,At least once,重复过来,重新消费)

        如:比如100条数据,处理到50条consumer挂了,那么新的consumer是从0开始重新消费

2)Kafka的分区策略 (面试)

     比如1个topic:0,1,2  三个分区        key hash%

    代码:

        kafka.producer.DefaultPartitioner.scala    (0.10版本后过时)

        org.apache.kafka.clients.producer.internals.DefaultPartitioner.scala (代替的类)

        

5.

Flume-->Kafka-->Spark streaming  经典架构
Flume:
[root@yws76 conf]# cat exec_memory_kafka.properties
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1


# Describe/configure the custom exec source
a1.sources.r1.type = com.onlinelog.analysis.ExecSource_JSON
a1.sources.r1.command = tail -F /var/log/hadoop-hdfs/hadoop-cmf-hdfs-NAMENODE-yws76.log.out
a1.sources.r1.hostname = yws76
a1.sources.r1.servicename = namenode




# Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = onlinelogs
a1.sinks.k1.kafka.bootstrap.servers = 192.168.0.85:9092,192.168.0.86:9092,192.168.0.87:9092
a1.sinks.k1.kafka.flumeBatchSize = 6000
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.ki.kafka.producer.compression.type = snappy


# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.keep-alive = 90
a1.channels.c1.capacity = 2000000
a1.channels.c1.transactionCapacity = 6000


# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1




****************
官方exec
# Describe/configure the custom exec source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/hadoop-hdfs/hadoop-cmf-hdfs-NAMENODE-yws76.log.out




Receiver 与 Direct 区别、优缺点、版本(面试题)


每个批次的最大消息量的参数及公式:
2500:
1 * 2 * 1250
1: topic的partition个数
2: spark streaming代码中batch时间
1250: spark.streaming.kafka.maxRatePerPartition=1250


3750=1 * 3 * 1250


1s:10000条拿到然后及时处理,不延迟
8*1*1250


场景:
还剩7500条:


1. 生产常用的,kafka没有堆积的(正常业务,数据是比较正常过来)
设置最大消息量,慢慢消费
spark.streaming.backpressure.enabled=true


7500不是两个批次直接消费完,慢慢的消费




2.Kafka堆积1亿条(人为),每个批次去满满消费  (特殊)
spark.streaming.backpressure.enabled=false
7500是两个批次直接消费完




spark.streaming.stopGracefullyOnShutdown false 
断批还原


如果改为true,接受kill的命令,等待下一次批次处理完,比较优雅






6.断批还原--》offset如何管理 
1.Checkpoint HDFS 
   小文件 ,丢数据


2.Kafka 自身
   enable.auto.commit: true 时间间隔5s 
  
   enable.auto.commit: false (官方)+ 在业务处理后,手工官方API异步提交offset  (生产)
    
   提交到kafka的当前topic的内嵌的topic的:_consumer


3.其他存储
  ZK、HBase、Redis
  https://github.com/wangliangbd/SparkStreaming_Store_KafkaTopicOffset_To_HBase
  
  



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以按照以下步骤在Docker中安装Kafka 3: 1. 首先,确保你已经安装了Docker和Docker Compose。 2. 创建一个新的目录,在该目录下创建一个名为`docker-compose.yml`的文件。 3. 在`docker-compose.yml`文件中添加以下内容: ``` version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:6.0.1 hostname: zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka: image: confluentinc/cp-kafka:6.0.1 hostname: kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9092 KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 ``` 4. 保存并关闭`docker-compose.yml`文件。 5. 在终端中,进入到你创建的目录,然后运行以下命令启动Kafka容器: ``` docker-compose up -d ``` 这将会下载并启动Zookeeper和Kafka容器。 6. 等待一段时间让容器启动完成。你可以使用以下命令查看容器的状态: ``` docker-compose ps ``` 如果所有容器都处于"Up"状态,那么Kafka就已经成功安装并运行了。 现在你可以通过`localhost:9092`访问Kafka。你可以使用Kafka客户端工具连接到Kafka,并开始使用它。 希望对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值