日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kafka学习_Kafka学习笔记下

發布時間:2023/12/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kafka学习_Kafka学习笔记下 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4 Kafka API實戰

4.1 環境準備

1)啟動zk和kafka集群,在kafka集群中打開一個消費者

[atguigu@hadoop102 kafka]$ bin/kafka-console-consumer.sh \--zookeeper hadoop102:2181 --topic first

2)導入pom依賴

<dependencies> ? ?<dependency> ? ?<groupId>org.apache.kafkagroupId> ? ?<artifactId>kafka-clientsartifactId> ? ?<version>0.11.0.0version> ?dependency> ? ?<dependency> ? ?<groupId>org.apache.kafkagroupId> ? ?<artifactId>kafka_2.12artifactId> ? ?<version>0.11.0.0version> ?dependency>dependencies>

4.2 Kafka生產者Java API

4.2.1 創建生產者(過時的API)

package com.atguigu.kafka;import java.util.Properties;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig; public class OldProducer { ?@SuppressWarnings("deprecation") ?public static void main(String[] args) { ? ? ? ?Properties properties = new Properties(); ? ?properties.put("metadata.broker.list", "hadoop102:9092"); ? ?properties.put("request.required.acks", "1"); ? ?properties.put("serializer.class", "kafka.serializer.StringEncoder"); ? ? ? ?Producer<Integer, String> producer = new Producer<Integer,String>(new ProducerConfig(properties)); ? ? ? ?KeyedMessage<Integer, String> message = new KeyedMessage<Integer, String>("first", "hello world"); ? ?producer.send(message ); }}

4.2.2 創建生產者(新API)

package com.atguigu.kafka;import java.util.Properties;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.Producer;import org.apache.kafka.clients.producer.ProducerRecord; public class NewProducer { ?public static void main(String[] args) { ? ? ? ?Properties props = new Properties(); ? ?// Kafka服務端的主機名和端口號 ? ?props.put("bootstrap.servers", "hadoop103:9092"); ? ?// 等待所有副本節點的應答 ? ?props.put("acks", "all"); ? ?// 消息發送最大嘗試次數 ? ?props.put("retries", 0); ? ?// 一批消息處理大小 ? ?props.put("batch.size", 16384); ? ?// 請求延時 ? ?props.put("linger.ms", 1); ? ?// 發送緩存區內存大小 ? ?props.put("buffer.memory", 33554432); ? ?// key序列化 ? ?props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?// value序列化 ? ?props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?Producer<String, String> producer = new KafkaProducer<>(props); ? ?for (int i = 0; i < 50; i++) { ? ? ? producer.send(new ProducerRecord<String, String>("first", Integer.toString(i), "hello world-" + i)); ? } ? ?producer.close(); }}

4.2.3 創建生產者帶回調函數(新API)

package com.atguigu.kafka;import java.util.Properties;import org.apache.kafka.clients.producer.Callback;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata; public class CallBackProducer { ?public static void main(String[] args) { Properties props = new Properties(); ? ?// Kafka服務端的主機名和端口號 ? ?props.put("bootstrap.servers", "hadoop103:9092"); ? ?// 等待所有副本節點的應答 ? ?props.put("acks", "all"); ? ?// 消息發送最大嘗試次數 ? ?props.put("retries", 0); ? ?// 一批消息處理大小 ? ?props.put("batch.size", 16384); ? ?// 增加服務端請求延時 ? ?props.put("linger.ms", 1);// 發送緩存區內存大小 ? ?props.put("buffer.memory", 33554432); ? ?// key序列化 ? ?props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?// value序列化 ? ?props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(props); ? ?for (int i = 0; i < 50; i++) { ? ? ? kafkaProducer.send(new ProducerRecord<String, String>("first", "hello" + i), new Callback() { ? ? ? ? @Override ? ? ? ? public void onCompletion(RecordMetadata metadata, Exception exception) { ? ? ? ? ? if (metadata != null) { ? ? ? ? ? ? System.err.println(metadata.partition() + "---" + metadata.offset()); ? ? ? ? ? } ? ? ? ? } ? ? ? }); ? } ? ?kafkaProducer.close(); }}

4.2.4 自定義分區生產者

0)需求:將所有數據存儲到topic的第0號分區上

1)定義一個類實現Partitioner接口,重寫里面的方法(過時API)

package com.atguigu.kafka;import java.util.Map;import kafka.producer.Partitioner; public class CustomPartitioner implements Partitioner { ?public CustomPartitioner() { ? ?super(); } ?@Override ?public int partition(Object key, int numPartitions) { ? ?// 控制分區 ? ?return 0; }}

2)自定義分區(新API)

package com.atguigu.kafka;import java.util.Map;import org.apache.kafka.clients.producer.Partitioner;import org.apache.kafka.common.Cluster; public class CustomPartitioner implements Partitioner { ?@Override ?public void configure(Map<String, ?> configs) { ? ? } ?@Override ?public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { ? ?// 控制分區 ? ?return 0; } ?@Override ?public void close() { ? ? }}

3)在代碼中調用

package com.atguigu.kafka;import java.util.Properties;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.Producer;import org.apache.kafka.clients.producer.ProducerRecord; public class PartitionerProducer { ?public static void main(String[] args) { ? ? ? ?Properties props = new Properties(); ? ?// Kafka服務端的主機名和端口號 ? ?props.put("bootstrap.servers", "hadoop103:9092"); ? ?// 等待所有副本節點的應答 ? ?props.put("acks", "all"); ? ?// 消息發送最大嘗試次數 ? ?props.put("retries", 0); ? ?// 一批消息處理大小 ? ?props.put("batch.size", 16384); ? ?// 增加服務端請求延時 ? ?props.put("linger.ms", 1); ? ?// 發送緩存區內存大小 ? ?props.put("buffer.memory", 33554432); ? ?// key序列化 ? ?props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?// value序列化 ? ?props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?// 自定義分區 ? ?props.put("partitioner.class", "com.atguigu.kafka.CustomPartitioner"); ? ?Producer<String, String> producer = new KafkaProducer<>(props); ? ?producer.send(new ProducerRecord<String, String>("first", "1", "atguigu")); ? ?producer.close(); }}

4)測試

? ?(1)在hadoop102上監控/opt/module/kafka/logs/目錄下first主題3個分區的log日志動態變化情況

[atguigu@hadoop102 first-0]$ tail -f 00000000000000000000.log

[atguigu@hadoop102 first-1]$ tail -f 00000000000000000000.log

[atguigu@hadoop102 first-2]$ tail -f 00000000000000000000.log

? ?(2)發現數據都存儲到指定的分區了。

4.3 Kafka消費者Java API

4.3.1 高級API

0)在控制臺創建發送者

[atguigu@hadoop104 kafka]$ bin/kafka-console-producer.sh \--broker-list hadoop102:9092 --topic first>hello world

1)創建消費者(過時API)

package com.atguigu.kafka.consume;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;import kafka.consumer.Consumer;import kafka.consumer.ConsumerConfig;import kafka.consumer.ConsumerIterator;import kafka.consumer.KafkaStream;import kafka.javaapi.consumer.ConsumerConnector;public class CustomConsumer { ?@SuppressWarnings("deprecation") ?public static void main(String[] args) { ? ?Properties properties = new Properties(); ? ? ? ?properties.put("zookeeper.connect", "hadoop102:2181"); ? ?properties.put("group.id", "g1"); ? ?properties.put("zookeeper.session.timeout.ms", "500"); ? ?properties.put("zookeeper.sync.time.ms", "250"); ? ?properties.put("auto.commit.interval.ms", "1000"); ? ? ? ?// 創建消費者連接器 ? ?ConsumerConnector consumer = Consumer.createJavaConsumerConnector(new ConsumerConfig(properties)); ? ? ? ?HashMap<String, Integer> topicCount = new HashMap<>(); ? ?topicCount.put("first", 1); ? ? ? ?Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCount); ? ? ? ?KafkaStream<byte[], byte[]> stream = consumerMap.get("first").get(0); ? ? ? ?ConsumerIterator<byte[], byte[]> it = stream.iterator(); ? ? ? ?while (it.hasNext()) { ? ? ? System.out.println(new String(it.next().message())); ? } }}

2)官方提供案例(自動維護消費情況)(新API)

package com.atguigu.kafka.consume;import java.util.Arrays;import java.util.Properties;import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.ConsumerRecords;import org.apache.kafka.clients.consumer.KafkaConsumer; public class CustomNewConsumer { ?public static void main(String[] args) { ? ?Properties props = new Properties(); ? ?// 定義kakfa 服務的地址,不需要將所有broker指定上 ? ?props.put("bootstrap.servers", "hadoop102:9092"); ? ?// 制定consumer group ? ?props.put("group.id", "test"); ? ?// 是否自動確認offset ? ?props.put("enable.auto.commit", "true"); ? ?// 自動確認offset的時間間隔 ? ?props.put("auto.commit.interval.ms", "1000"); ? ?// key的序列化類 ? ?props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); ? ?// value的序列化類 ? ?props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); ? ?// 定義consumer ? ?KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); ? ? ? ?// 消費者訂閱的topic, 可同時訂閱多個 ? ?consumer.subscribe(Arrays.asList("first", "second","third")); ? ?while (true) { ? ? ? // 讀取數據,讀取超時時間為100ms ? ? ? ConsumerRecords<String, String> records = consumer.poll(100); ? ? ? for (ConsumerRecord<String, String> record : records) ? ? ? ? System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); ? } }}

4.3.2 低級API

實現使用低級API讀取指定topic,指定partition,指定offset的數據。

1)消費者使用低級API 的主要步驟:

?步驟 ? ?主要工作 ?
?1 ? ?根據指定的分區從主題元數據中找到主副本 ?
?2 ? ?獲取分區最新的消費進度 ?
?3 ? ?從主副本拉取分區的消息 ?
?4 ? ?識別主副本的變化,重試 ?

2)方法描述:

?findLeader() ? ?客戶端向種子節點發送主題元數據,將副本集加入備用節點 ?
?getLastOffset() ? ?消費者客戶端發送偏移量請求,獲取分區最近的偏移量 ?
?run() ? ?消費者低級AP I拉取消息的主要方法 ?
?findNewLeader() ? ?當分區的主副本節點發生故障,客戶將要找出新的主副本 ?

3)代碼:

package com.atguigu;import java.nio.ByteBuffer;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import kafka.api.FetchRequest;import kafka.api.FetchRequestBuilder;import kafka.api.PartitionOffsetRequestInfo;import kafka.cluster.BrokerEndPoint;import kafka.common.ErrorMapping;import kafka.common.TopicAndPartition;import kafka.javaapi.FetchResponse;import kafka.javaapi.OffsetResponse;import kafka.javaapi.PartitionMetadata;import kafka.javaapi.TopicMetadata;import kafka.javaapi.TopicMetadataRequest;import kafka.javaapi.consumer.SimpleConsumer;import kafka.message.MessageAndOffset; public class SimpleExample { private List m_replicaBrokers = new ArrayList<>(); public SimpleExample() { ? m_replicaBrokers = new ArrayList<>(); } public static void main(String args[]) { ? SimpleExample example = new SimpleExample(); ? // 最大讀取消息數量 ? long maxReads = Long.parseLong("3"); ? // 要訂閱的topic ? String topic = "test1"; ? // 要查找的分區 ? int partition = Integer.parseInt("0"); ? // broker節點的ip ? List seeds = new ArrayList<>(); ? seeds.add("192.168.9.102"); ? seeds.add("192.168.9.103"); ? seeds.add("192.168.9.104"); ? // 端口 ? int port = Integer.parseInt("9092"); ? try { ? ? example.run(maxReads, topic, partition, seeds, port); ? } catch (Exception e) { ? ? System.out.println("Oops:" + e); ? ? e.printStackTrace(); ? } } public void run(long a_maxReads, String a_topic, int a_partition, List a_seedBrokers, int a_port) throws Exception { ? // 獲取指定Topic partition的元數據 ? PartitionMetadata metadata = findLeader(a_seedBrokers, a_port, a_topic, a_partition); ? if (metadata == null) { ? ? System.out.println("Can't find metadata for Topic and Partition. Exiting"); ? ? return; ? } ? if (metadata.leader() == null) { ? ? System.out.println("Can't find Leader for Topic and Partition. Exiting"); ? ? return; ? } ? String leadBroker = metadata.leader().host(); ? String clientName = "Client_" + a_topic + "_" + a_partition; ? SimpleConsumer consumer = new SimpleConsumer(leadBroker, a_port, 100000, 64 * 1024, clientName); ? long readOffset = getLastOffset(consumer, a_topic, a_partition, kafka.api.OffsetRequest.EarliestTime(), clientName); ? int numErrors = 0; ? while (a_maxReads > 0) { ? ? if (consumer == null) { ? ? ? consumer = new SimpleConsumer(leadBroker, a_port, 100000, 64 * 1024, clientName); ? ? } ? ? FetchRequest req = new FetchRequestBuilder().clientId(clientName).addFetch(a_topic, a_partition, readOffset, 100000).build(); ? ? FetchResponse fetchResponse = consumer.fetch(req); ? ? if (fetchResponse.hasError()) { ? ? ? numErrors++; ? ? ? // Something went wrong! ? ? ? short code = fetchResponse.errorCode(a_topic, a_partition); ? ? ? System.out.println("Error fetching data from the Broker:" + leadBroker + " Reason: " + code); ? ? ? if (numErrors > 5) ? ? ? ? break; ? ? ? if (code == ErrorMapping.OffsetOutOfRangeCode()) { ? ? ? ? // We asked for an invalid offset. For simple case ask for ? ? ? ? // the last element to reset ? ? ? ? readOffset = getLastOffset(consumer, a_topic, a_partition, kafka.api.OffsetRequest.LatestTime(), clientName); ? ? ? ? continue; ? ? ? } ? ? ? consumer.close(); ? ? ? consumer = null; ? ? ? leadBroker = findNewLeader(leadBroker, a_topic, a_partition, a_port); ? ? ? continue; ? ? } ? ? numErrors = 0; ? ? long numRead = 0; ? ? for (MessageAndOffset messageAndOffset : fetchResponse.messageSet(a_topic, a_partition)) { ? ? ? long currentOffset = messageAndOffset.offset(); ? ? ? if (currentOffset < readOffset) { ? ? ? ? System.out.println("Found an old offset: " + currentOffset + " Expecting: " + readOffset); ? ? ? ? continue; ? ? ? } ? ? ? readOffset = messageAndOffset.nextOffset(); ? ? ? ByteBuffer payload = messageAndOffset.message().payload(); ? ? ? byte[] bytes = new byte[payload.limit()]; ? ? ? payload.get(bytes); ? ? ? System.out.println(String.valueOf(messageAndOffset.offset()) + ": " + new String(bytes, "UTF-8")); ? ? ? numRead++; ? ? ? a_maxReads--; ? ? } ? ? if (numRead == 0) { ? ? ? try { ? ? ? ? Thread.sleep(1000); ? ? ? } catch (InterruptedException ie) { ? ? ? } ? ? } ? } ? if (consumer != null) ? ? consumer.close(); } public static long getLastOffset(SimpleConsumer consumer, String topic, int partition, long whichTime, String clientName) { ? TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition); ? Map requestInfo = new HashMap(); ? requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(whichTime, 1)); ? kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(requestInfo, kafka.api.OffsetRequest.CurrentVersion(), clientName); ? OffsetResponse response = consumer.getOffsetsBefore(request); ? if (response.hasError()) { ? ? System.out.println("Error fetching data Offset Data the Broker. Reason: " + response.errorCode(topic, partition)); ? ? return 0; ? } ? long[] offsets = response.offsets(topic, partition); ? return offsets[0]; } private String findNewLeader(String a_oldLeader, String a_topic, int a_partition, int a_port) throws Exception { ? for (int i = 0; i < 3; i++) { ? ? boolean goToSleep = false; ? ? PartitionMetadata metadata = findLeader(m_replicaBrokers, a_port, a_topic, a_partition); ? ? if (metadata == null) { ? ? ? goToSleep = true; ? ? } else if (metadata.leader() == null) { ? ? ? goToSleep = true; ? ? } else if (a_oldLeader.equalsIgnoreCase(metadata.leader().host()) && i == 0) { ? ? ? // first time through if the leader hasn't changed give ? ? ? // ZooKeeper a second to recover ? ? ? // second time, assume the broker did recover before failover, ? ? ? // or it was a non-Broker issue ? ? ? // ? ? ? goToSleep = true; ? ? } else { ? ? ? return metadata.leader().host(); ? ? } ? ? if (goToSleep) { ? ? ? ? ? Thread.sleep(1000); ? ? } ? } ? System.out.println("Unable to find new leader after Broker failure. Exiting"); ? throw new Exception("Unable to find new leader after Broker failure. Exiting"); } private PartitionMetadata findLeader(List a_seedBrokers, int a_port, String a_topic, int a_partition) { ? PartitionMetadata returnMetaData = null; ? loop: ? for (String seed : a_seedBrokers) { ? ? SimpleConsumer consumer = null; ? ? try { ? ? ? consumer = new SimpleConsumer(seed, a_port, 100000, 64 * 1024, "leaderLookup"); ? ? ? List topics = Collections.singletonList(a_topic); ? ? ? TopicMetadataRequest req = new TopicMetadataRequest(topics); ? ? ? kafka.javaapi.TopicMetadataResponse resp = consumer.send(req); ? ? ? List metaData = resp.topicsMetadata(); ? ? ? for (TopicMetadata item : metaData) { ? ? ? ? for (PartitionMetadata part : item.partitionsMetadata()) { ? ? ? ? ? if (part.partitionId() == a_partition) { ? ? ? ? ? ? returnMetaData = part; ? ? ? ? ? ? ? break loop; ? ? ? ? ? } ? ? ? ? } ? ? ? } ? ? } catch (Exception e) { ? ? ? System.out.println("Error communicating with Broker [" + seed + "] to find Leader for [" + a_topic + ", " + a_partition + "] Reason: " + e); ? ? } finally { ? ? ? if (consumer != null) ? ? ? ? consumer.close(); ? ? } ? } ? if (returnMetaData != null) { ? ? m_replicaBrokers.clear(); ? ? for (BrokerEndPoint replica : returnMetaData.replicas()) { ? ? ? m_replicaBrokers.add(replica.host()); ? ? } ? } ? return returnMetaData; }}

5 Kafka producer攔截器(interceptor)

5.1 攔截器原理

Producer攔截器(interceptor)是在Kafka 0.10版本被引入的,主要用于實現clients端的定制化控制邏輯。

對于producer而言,interceptor使得用戶在消息發送前以及producer回調邏輯前有機會對消息做一些定制化需求,比如修改消息等。同時,producer允許用戶指定多個interceptor按序作用于同一條消息從而形成一個攔截鏈(interceptor chain)。Intercetpor的實現接口是org.apache.kafka.clients.producer.ProducerInterceptor,其定義的方法包括:

(1)configure(configs)

獲取配置信息和初始化數據時調用。

(2)onSend(ProducerRecord):

該方法封裝進KafkaProducer.send方法中,即它運行在用戶主線程中。Producer確保在消息被序列化以及計算分區前調用該方法。用戶可以在該方法中對消息做任何操作,但最好保證不要修改消息所屬的topic和分區,否則會影響目標分區的計算

(3)onAcknowledgement(RecordMetadata, Exception):

該方法會在消息被應答或消息發送失敗時調用,并且通常都是在producer回調邏輯觸發之前。onAcknowledgement運行在producer的IO線程中,因此不要在該方法中放入很重的邏輯,否則會拖慢producer的消息發送效率

(4)close:

關閉interceptor,主要用于執行一些資源清理工作

如前所述,interceptor可能被運行在多個線程中,因此在具體實現時用戶需要自行確保線程安全。另外倘若指定了多個interceptor,則producer將按照指定順序調用它們,并僅僅是捕獲每個interceptor可能拋出的異常記錄到錯誤日志中而非在向上傳遞。這在使用過程中要特別留意。

5.2 攔截器案例

1)需求:

實現一個簡單的雙interceptor組成的攔截鏈。第一個interceptor會在消息發送前將時間戳信息加到消息value的最前部;第二個interceptor會在消息發送后更新成功發送消息數或失敗發送消息數。

2)案例實操

(1)增加時間戳攔截器

package com.atguigu.kafka.interceptor;import java.util.Map;import org.apache.kafka.clients.producer.ProducerInterceptor;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata; public class TimeInterceptor implements ProducerInterceptor<String, String> { ?@Override ?public void configure(Map<String, ?> configs) { } ?@Override ?public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) { ? ?// 創建一個新的record,把時間戳寫入消息體的最前部 ? ?return new ProducerRecord(record.topic(), record.partition(), record.timestamp(), record.key(), ? ? ? ? System.currentTimeMillis() + "," + record.value().toString()); } ?@Override ?public void onAcknowledgement(RecordMetadata metadata, Exception exception) { } ?@Override ?public void close() { }}

(2)統計發送消息成功和發送失敗消息數,并在producer關閉時打印這兩個計數器

package com.atguigu.kafka.interceptor;import java.util.Map;import org.apache.kafka.clients.producer.ProducerInterceptor;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata; public class CounterInterceptor implements ProducerInterceptor<String, String>{ ?private int errorCounter = 0; ?private int successCounter = 0; ?@Override ?public void configure(Map<String, ?> configs) { ? ? } ?@Override ?public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) { ? ? return record; } ?@Override ?public void onAcknowledgement(RecordMetadata metadata, Exception exception) { ? ?// 統計成功和失敗的次數 ? ?if (exception == null) { ? ? ?successCounter++; ? } else { ? ? ?errorCounter++; ? ? } } ?@Override ?public void close() { ? ?// 保存結果 ? ?System.out.println("Successful sent: " + successCounter); ? ?System.out.println("Failed sent: " + errorCounter); }}

(3)producer主程序

package com.atguigu.kafka.interceptor;import java.util.ArrayList;import java.util.List;import java.util.Properties;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.Producer;import org.apache.kafka.clients.producer.ProducerConfig;import org.apache.kafka.clients.producer.ProducerRecord; public class InterceptorProducer { ?public static void main(String[] args) throws Exception { ? ?// 1 設置配置信息 ? ?Properties props = new Properties(); ? ?props.put("bootstrap.servers", "hadoop102:9092"); ? ?props.put("acks", "all"); ? ?props.put("retries", 0); ? ?props.put("batch.size", 16384); ? ?props.put("linger.ms", 1); ? ?props.put("buffer.memory", 33554432); ? ?props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ?props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ? ? ? ?// 2 構建攔截鏈 ? ?List<String> interceptors = new ArrayList<>(); ? interceptors.add("com.atguigu.kafka.interceptor.TimeInterceptor"); interceptors.add("com.atguigu.kafka.interceptor.CounterInterceptor"); ? ?props.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, interceptors); ? ? ? ?String topic = "first"; ? ?Producer<String, String> producer = new KafkaProducer<>(props); ? ? ? ?// 3 發送消息 ? ?for (int i = 0; i < 10; i++) { ? ? ? ? ? ?ProducerRecord<String, String> record = new ProducerRecord<>(topic, "message" + i); ? ? ?producer.send(record); ? } ? ? ? ?// 4 一定要關閉producer,這樣才會調用interceptor的close方法 ? ?producer.close(); }}

3)測試

(1)在kafka上啟動消費者,然后運行客戶端java程序。

[atguigu@hadoop102 kafka]$ bin/kafka-console-consumer.sh \--zookeeper hadoop102:2181 --from-beginning --topic first1501904047034,message01501904047225,message11501904047230,message21501904047234,message31501904047236,message41501904047240,message51501904047243,message61501904047246,message71501904047249,message81501904047252,message9

(2)觀察java平臺控制臺輸出數據如下:

Successful sent: 10Failed sent: 0

6 Kafka Streams

6.1 概述

6.1.1 Kafka Streams

Kafka Streams。Apache Kafka開源項目的一個組成部分。是一個功能強大,易于使用的庫。用于在Kafka上構建高可分布式、拓展性,容錯的應用程序。

6.1.2 Kafka Streams特點

1)功能強大

高擴展性,彈性,容錯

2)輕量級

無需專門的集群

一個庫,而不是框架

3)完全集成

100%的Kafka 0.10.0版本兼容

易于集成到現有的應用程序

4)實時性

毫秒級延遲

并非微批處理

窗口允許亂序數據

允許遲到數據

6.1.3 為什么要有Kafka Stream

當前已經有非常多的流式處理系統,最知名且應用最多的開源流式處理系統有Spark Streaming和Apache Storm。Apache Storm發展多年,應用廣泛,提供記錄級別的處理能力,當前也支持SQL on Stream。而Spark Streaming基于Apache Spark,可以非常方便與圖計算,SQL處理等集成,功能強大,對于熟悉其它Spark應用開發的用戶而言使用門檻低。另外,目前主流的Hadoop發行版,如Cloudera和Hortonworks,都集成了Apache Storm和Apache Spark,使得部署更容易。

既然Apache Spark與Apache Storm擁用如此多的優勢,那為何還需要Kafka Stream呢?主要有如下原因。

第一,Spark和Storm都是流式處理框架,而Kafka Stream提供的是一個基于Kafka的流式處理類庫??蚣芤箝_發者按照特定的方式去開發邏輯部分,供框架調用。開發者很難了解框架的具體運行方式,從而使得調試成本高,并且使用受限。而Kafka Stream作為流式處理類庫,直接提供具體的類給開發者調用,整個應用的運行方式主要由開發者控制,方便使用和調試。

第二,雖然Cloudera與Hortonworks方便了Storm和Spark的部署,但是這些框架的部署仍然相對復雜。而Kafka Stream作為類庫,可以非常方便的嵌入應用程序中,它對應用的打包和部署基本沒有任何要求。

第三,就流式處理系統而言,基本都支持Kafka作為數據源。例如Storm具有專門的kafka-spout,而Spark也提供專門的spark-streaming-kafka模塊。事實上,Kafka基本上是主流的流式處理系統的標準數據源。換言之,大部分流式系統中都已部署了Kafka,此時使用Kafka Stream的成本非常低。

第四,使用Storm或Spark Streaming時,需要為框架本身的進程預留資源,如Storm的supervisor和Spark on YARN的node manager。即使對于應用實例而言,框架本身也會占用部分資源,如Spark Streaming需要為shuffle和storage預留內存。但是Kafka作為類庫不占用系統資源。

第五,由于Kafka本身提供數據持久化,因此Kafka Stream提供滾動部署和滾動升級以及重新計算的能力。

第六,由于Kafka Consumer Rebalance機制,Kafka Stream可以在線動態調整并行度。

6.2 Kafka Stream數據清洗案例

0)需求:

? 實時處理單詞帶有”>>>”前綴的內容。例如輸入”atguigu>>>ximenqing”,最終處理成“ximenqing”

1)需求分析:

2)案例實操

(1)創建一個工程,并添加jar包

(2)創建主類

package com.atguigu.kafka.stream;import java.util.Properties;import org.apache.kafka.streams.KafkaStreams;import org.apache.kafka.streams.StreamsConfig;import org.apache.kafka.streams.processor.Processor;import org.apache.kafka.streams.processor.ProcessorSupplier;import org.apache.kafka.streams.processor.TopologyBuilder; public class Application { ?public static void main(String[] args) { ? ?// 定義輸入的topic ? ?String from = "first"; ? ?// 定義輸出的topic ? ?String to = "second"; ? ?// 設置參數 ? ?Properties settings = new Properties(); ? ?settings.put(StreamsConfig.APPLICATION_ID_CONFIG, "logFilter"); ? ?settings.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092"); ? ?StreamsConfig config = new StreamsConfig(settings); ? ?// 構建拓撲 ? ?TopologyBuilder builder = new TopologyBuilder(); ? ?builder.addSource("SOURCE", from) ? ? ? .addProcessor("PROCESS", new ProcessorSupplier<byte[], byte[]>() { ? ? ? ? @Override ? ? ? ? ? public Processor<byte[], byte[]> get() { ? ? ? ? ? ? // 具體分析處理 ? ? ? ? ? ? return new LogProcessor(); ? ? ? ? ? } ? ? ? ? }, "SOURCE") ? ? ? .addSink("SINK", to, "PROCESS"); ? ?// 創建kafka stream ? ?KafkaStreams streams = new KafkaStreams(builder, config); ? ?streams.start(); }}

(3)具體業務處理

package com.atguigu.kafka.stream;import org.apache.kafka.streams.processor.Processor;import org.apache.kafka.streams.processor.ProcessorContext;public class LogProcessor implements Processor<byte[], byte[]> { ?private ProcessorContext context; ? ?@Override ?public void init(ProcessorContext context) { ? ?this.context = context; } ?@Override ?public void process(byte[] key, byte[] value) { ? ?String input = new String(value); ? ? ? ?// 如果包含“>>>”則只保留該標記后面的內容 ? ?if (input.contains(">>>")) { ? ? ? input = input.split(">>>")[1].trim(); ? ? ? // 輸出到下一個topic ? ? ? context.forward("logProcessor".getBytes(), input.getBytes()); ? }else{ ? ? ? context.forward("logProcessor".getBytes(), input.getBytes()); ? } } ?@Override ?public void punctuate(long timestamp) { } ?@Override ?public void close() { ? }}

(4)運行程序

(5)在hadoop104上啟動生產者

[atguigu@hadoop104 kafka]$ bin/kafka-console-producer.sh \--broker-list hadoop102:9092 --topic first >hello>>>world>h>>>atguigu>hahaha

(6)在hadoop103上啟動消費者

[atguigu@hadoop103 kafka]$ bin/kafka-console-consumer.sh \--zookeeper hadoop102:2181 --from-beginning --topic second worldatguiguhahaha

7.1 kafka一直在rebalance問題

關于Kafka的三個配置

session.timeout.ms=10000 // 單位:毫秒,kafka會有一個心跳線程來同步服務端,告訴服務端自己是正??捎玫?#xff0c;默認是3秒發送一次心跳,超過session.timeout.ms(默認10秒)服務端沒有收到心跳就會認為當前消費者失效。max.poll.interval.ms=300000 // 單位:毫秒,決定了獲取消息后提交偏移量的最大時間,超過設定的時間(默認5分鐘),服務端也會認為該消費者失效。max.poll.records=500 //合理設置每次poll的消息消費的數量,默認是500,如果數量過多,導致一次poll的操作返回的消息記錄無法在指定時間內完成,則會出現rebalance,即kafka服務端認為消費者失效,會重新分配分區,導致偏移量沒有提交,從而會導致重復消費。

有朋友遇到了一個問題,發現kafka一直在rebalance,(當rebalance后,之前該consumer擁有的分區和offset信息就失效了,同時導致不斷的報auto offset commit failed。)通過改變如下兩個配置解決了問題,

例如:確保獲取300條消息在400秒之內消費完成,提交偏移量offset,并再次去poll()。這樣就不會出現這個問題。

#把這個調改大些,默認是300秒max.poll.interval.ms=400000#把這個改小些,默認是500條消息max.poll.records=300

好了,本次內容就是這些,學無止境,關注我,我們一起學習進步。如果覺得內容還可以,幫忙點個贊,點個在看唄,謝謝~我們下期見。

資料獲取:關注公眾號【良辰】,回復關鍵字Kafka獲取,可獲取筆記和學習視頻。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的kafka学习_Kafka学习笔记下的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

中文字幕免费观看视频 | 亚洲年轻女教师毛茸茸 | 视频在线观看入口黄最新永久免费国产 | 亚洲少妇激情 | 天天摸日日摸人人看 | 91精品国产一区二区在线观看 | 成年人黄色免费视频 | 国产高清精品在线观看 | 狠狠色狠狠色综合日日92 | 18av在线视频 | 亚洲一二区视频 | 久久精品8 | 99色亚洲| 婷婷av网站 | 日韩在线免费电影 | 国产成人精品一区二 | 日韩精品一区二区免费视频 | 欧美日本一区 | 欧美小视频在线观看 | 国产黄色精品在线 | 99视频精品在线 | 在线观看视频黄色 | 久久一区二区三区国产精品 | 亚洲国产精品成人av | 粉嫩一区二区三区粉嫩91 | 精品国产黄色片 | 一区中文字幕在线观看 | 日本不卡久久 | 国产精品久久久久久欧美 | 一色av| 久久精品精品电影网 | 久久成人一区二区 | 久久最新视频 | 中文字幕资源站 | 人人草在线视频 | 美女亚洲精品 | 超碰精品在线 | 精品国产一区二区三区久久 | 国产网站在线免费观看 | 欧美另类高清 | 在线观看亚洲视频 | 国产一级免费片 | 亚洲最新合集 | 91av电影在线 | 日韩欧美专区 | 黄色一级影院 | 手机av永久免费 | 国产一在线精品一区在线观看 | 日日草视频 | 久久国产经典视频 | 国产精品亚洲综合久久 | 亚洲精品成人 | 婷婷激情五月综合 | 波多野结衣在线视频一区 | 91麻豆精品国产91久久久更新时间 | 亚洲激情 欧美激情 | 免费观看av网站 | 精品国产aⅴ麻豆 | 欧美一级免费 | 日韩精品中文字幕久久臀 | 色婷婷啪啪免费在线电影观看 | 狠狠插狠狠干 | 黄色av电影在线 | 婷婷久月| 久久久亚洲国产精品麻豆综合天堂 | 日日爱网址 | 国产理论在线 | 亚洲性视频 | 嫩嫩影院理论片 | 久久女教师 | 特级西西www44高清大胆图片 | 九九日韩 | 深爱激情五月婷婷 | 中文字幕黄色网址 | 久久理论电影网 | 欧美精品乱码久久久久久按摩 | 久久久精品国产一区二区 | www激情com | 中文字幕在线看视频 | 亚洲精品久久久久58 | 久久夜色精品国产欧美乱 | 97色在线观看免费视频 | 成人久久 | 999色视频| 精品你懂的 | 国产成人av一区二区三区在线观看 | 日韩精品亚洲专区在线观看 | 在线免费试看 | 日韩小视频网站 | 九色激情网| 国产精品2019 | 国产精品自产拍在线观看桃花 | 96看片 | 99久久精品国产毛片 | 久久成人亚洲欧美电影 | 午夜免费福利视频 | 中文在线www | 久久久久国产精品厨房 | 日韩免费观看视频 | 毛片随便看 | 婷婷激情av| 射九九| 亚洲在线网址 | 在线最新av | 亚洲成人av一区 | 中文字幕第一页在线播放 | 伊人午夜视频 | 久久精品播放 | 99一区二区三区 | 麻豆91在线看 | 色噜噜在线观看 | 在线观看视频你懂 | 五月婷婷深开心 | 天堂网一区 | 国产中文字幕亚洲 | 人人干狠狠操 | 久久久久久久久久久久电影 | 91成人蝌蚪 | 久久久久久久久久网 | 狠狠色婷婷丁香六月 | 国产精品成人免费 | 99综合久久 | 成人免费 在线播放 | 国产精品福利小视频 | 欧美另类69 | 国产在线播放一区二区三区 | 伊人开心激情 | www麻豆视频 | av黄色亚洲 | 精品久久国产一区 | 亚洲精品久久久久中文字幕二区 | 九九热在线免费观看 | 伊人午夜 | 在线色亚洲 | 五月婷婷久久丁香 | 久久综合久久综合这里只有精品 | 国产精品h在线观看 | 日韩欧美电影在线 | 狠狠网亚洲精品 | www日日 | 国产一卡二卡在线 | 99人久久精品视频最新地址 | 亚洲综合在线发布 | 久久在线免费观看 | 五月开心婷婷网 | 97在线视频免费看 | 国产午夜精品福利视频 | 91免费观看视频网站 | 91丨porny丨九色| 最近久乱中文字幕 | 亚洲午夜精品久久久久久久久 | 成人毛片一区二区三区 | 国产免费精彩视频 | 三级av网站 | 久久成年人视频 | 日韩中文字幕免费看 | 国产欧美久久久精品影院 | 日韩在线一级 | 日韩午夜视频在线观看 | 四虎在线观看 | 国产成人精品av在线 | 国产精品久久久久久久午夜片 | 四虎最新域名 | 中文字幕在线观看三区 | 不卡电影免费在线播放一区 | 国内毛片毛片 | 中文字幕在线视频一区 | 久久久国产视频 | 在线一级片 | 国产正在播放 | 欧美日韩视频免费看 | 在线视频免费观看 | 欧美 日韩 成人 | 久久精品一二三区白丝高潮 | 国产高清永久免费 | 天天色天天操综合网 | 不卡视频在线看 | 美女在线观看av | 亚洲精品小区久久久久久 | 超碰公开在线观看 | 久久少妇 | 日韩专区中文字幕 | 久久精品电影网 | 欧美一区二区免费在线观看 | 久久大视频 | 国产一级免费片 | 国产精品美女免费 | 久久精品视频国产 | 国产网站av | 在线观看中文字幕 | 91成人网在线 | 国产免费嫩草影院 | 夜夜操天天摸 | 草草草影院 | 在线观看 亚洲 | 国产又粗又长又硬免费视频 | 欧美性免费 | 国产视频亚洲 | 亚洲欧洲视频 | 免费情缘 | 亚洲dvd | www久久国产 | 久久久这里有精品 | 综合精品久久 | 国产亚洲精品日韩在线tv黄 | 欧美专区日韩专区 | 四虎伊人 | 九九视频这里只有精品 | 国产视频精品免费 | 国产小视频你懂的 | 97av在线视频 | 狠狠操电影网 | 在线看v片| 天堂在线视频中文网 | 中文字幕色综合网 | 午夜色大片在线观看 | 国产成人亚洲精品自产在线 | 精品超碰 | 久久久久亚洲精品国产 | 98久久| 成人毛片一区 | 日韩免费电影网 | 狠狠干狠狠色 | 日韩免费大片 | 成年人免费观看在线视频 | 天天操天天干天天摸 | 日韩激情精品 | 中文乱幕日产无线码1区 | 一区二区三区日韩视频在线观看 | 天天射天天操天天色 | 中文字幕在线观看免费高清完整版 | 日韩精品一二三 | 成人毛片久久 | 久久久精品免费看 | 99精品国产aⅴ | 日韩久久午夜一级啪啪 | 综合网色 | 97av在线| 在线直播av | 欧美一级电影片 | 色欧美成人精品a∨在线观看 | 就操操久久| 91精品国产三级a在线观看 | 五月婷婷一区 | 美女免费视频观看网站 | 欧美日韩国产精品爽爽 | www.国产毛片 | 日韩av不卡在线播放 | 久久久午夜剧场 | 国产精品久久久久久久久久免费看 | 正在播放国产91 | 二区视频在线观看 | 亚洲劲爆av| 天堂av免费观看 | 精品专区| 99r精品视频在线观看 | 丁香激情综合国产 | 91视频观看免费 | 免费福利在线观看 | 国产精品高潮呻吟久久久久 | 精品美女视频 | av福利在线导航 | 91精品国产自产91精品 | av大全在线 | 激情欧美一区二区三区免费看 | 日韩在线观看不卡 | 我要色综合天天 | 国产精品欧美久久 | www.天天综合 | 午夜91在线 | 国产精品久久久久久久免费观看 | av三级av | 免费看短 | 欧美一级特黄高清视频 | 国产高清在线免费视频 | 在线观看中文字幕视频 | 亚洲一片黄 | 久久av中文字幕片 | 精品国产欧美一区二区 | 天天操天天干天天爽 | 国产精品手机在线播放 | 97热久久免费频精品99 | 亚洲国产成人在线观看 | 欧美一级乱黄 | av黄色影院| www.久草.com| 97av影院 | 免费看黄在线观看 | 日韩欧美国产精品 | 黄色网址国产 | av不卡免费在线观看 | 久久精品精品电影网 | 天天爱天天操天天爽 | 亚洲成年人免费网站 | 精品视频免费观看 | 伊人久久国产 | 亚洲动漫在线观看 | 日韩精品久久久久 | 超碰免费97 | 免费高清在线观看成人 | 亚洲精品久久久久中文字幕二区 | 最新国产中文字幕 | av在线收看 | 国产v在线 | 成人免费一级 | 99久久久久免费精品国产 | 亚洲国产成人在线播放 | 免费91麻豆精品国产自产在线观看 | 精品在线视频播放 | 亚洲免费国产 | 超碰大片 | 国产成人一区二区三区影院在线 | 91漂亮少妇露脸在线播放 | 日韩精品欧美专区 | 亚洲黄在线观看 | 成 人 黄 色 视频 免费观看 | 一区二区视 | 国产黄色精品网站 | 操操日| 一区二区三区四区免费视频 | 国产精品一区二区白浆 | 91av国产视频 | 国产高清黄色 | 日韩欧美电影在线 | 91探花在线视频 | 免费a v在线| 欧美韩国日本在线观看 | 美女网站视频久久 | 日韩综合色 | 五月婷婷视频在线观看 | 国产成人久久av免费高清密臂 | 国产精品久久久久久久久免费看 | 五月综合激情 | 国产做a爱一级久久 | 中文字幕在线视频一区二区三区 | 日韩精品视频一二三 | 91在线一区 | 久草在线免费在线观看 | 亚洲 欧美日韩 国产 中文 | av免费成人 | 欧美 日韩 久久 | 精品亚洲男同gayvideo网站 | 蜜臀av免费一区二区三区 | 国产精品人成电影在线观看 | 人人爱人人射 | 久热色超碰| 中文字幕在线播放一区 | 国产伦理久久精品久久久久_ | 日韩精品高清视频 | 色多多在线观看 | 蜜臀av.com | 超碰97.com | 免费看污在线观看 | 国产一区二区在线免费视频 | 99久久久国产精品免费99 | 国产福利中文字幕 | 亚洲精品国偷拍自产在线观看蜜桃 | 色偷偷88欧美精品久久久 | 亚洲第五色综合网 | 欧美一区二区在线刺激视频 | 五月婷婷影院 | 成人免费视频在线观看 | 手机av片 | 黄色软件网站在线观看 | 麻豆一二| 手机在线日韩视频 | 1024手机在线看 | 久久天天躁狠狠躁亚洲综合公司 | 91黄色小视频 | 日韩久久久久久久久久 | 奇米影视8888在线观看大全免费 | 91成人在线观看高潮 | 久久久亚洲电影 | 国产亚洲综合性久久久影院 | 亚洲日韩中文字幕在线播放 | 亚洲每日更新 | 91在线观看高清 | 精品国产三级 | 天天干天天做天天爱 | 97超碰色| 一级片免费视频 | 免费看三级网站 | 四虎影视4hu4虎成人 | 麻豆精品传媒视频 | 91中文字幕一区 | 91热视频 | 在线看免费 | 精品九九久久 | 午夜久久 | 久久精品国亚洲 | 超碰免费97 | 色婷婷伊人 | 久久99精品久久久久久三级 | www.久草视频 | 久热av在线 | 日日夜色 | 中文字幕在线观看网站 | 国产精品毛片一区 | 草久久av | 91看片在线免费观看 | 亚洲无在线 | 国产专区视频在线观看 | 91在线看片 | 97人人添人澡人人爽超碰动图 | 综合久久久 | 久久久99精品免费观看app | 99热在| 免费av网站在线看 | 国产又粗又长的视频 | 亚洲国产中文字幕在线观看 | 日韩在线视频免费观看 | 国产精品久久久久久吹潮天美传媒 | 久久区二区 | 久久久久免费精品国产小说色大师 | 欧美天堂视频在线 | 成人一区电影 | 亚洲欧美在线观看视频 | 96久久久| 日韩一区二区三区高清在线观看 | 51久久夜色精品国产麻豆 | 午夜电影中文字幕 | 免费观看久久久 | 在线天堂中文www视软件 | 国产理论在线 | 国产亚州精品视频 | 中文字幕av有码 | 超碰人人在线 | 在线观看色网站 | 色偷偷男人的天堂av | 亚洲欧美视频在线观看 | 亚洲少妇激情 | 在线午夜| 小草av在线播放 | 色五月激情五月 | 国产福利不卡视频 | 久久99在线观看 | 黄色一集片 | 日韩高清免费无专码区 | 91高清完整版在线观看 | 最近免费中文字幕mv在线视频3 | 国产亚洲精品久久久久秋 | 亚洲经典视频在线观看 | 国产精品久久久久久久久久久杏吧 | 欧美激情视频在线观看免费 | 久久艹综合 | 免费成视频 | 国产在线观看你懂的 | 成年人黄色免费网站 | 久久精品中文字幕 | 色多视频在线观看 | 日本特黄一级片 | 国产打女人屁股调教97 | 毛片网在线播放 | 一级国产视频 | 91久久偷偷做嫩草影院 | www.天天射 | 久久久久久久久久久免费 | 91激情在线视频 | 日韩色高清 | 国产欧美中文字幕 | 国产精品99久久久久的智能播放 | 日韩三级免费 | 日日夜夜精品网站 | 国产一区二区三区高清播放 | 亚洲精品免费观看 | 国产精品久久在线 | av三级av| 欧美日韩中文国产一区发布 | 天天操天天射天天爽 | 99视频在线精品国自产拍免费观看 | 在线观看蜜桃视频 | 国产在线精品国自产拍影院 | 在线日韩av | 国产精品久久婷婷六月丁香 | 超碰在线免费福利 | 国产福利av在线 | 美女视频一区二区 | 亚洲精品一区二区三区四区高清 | 日韩在线小视频 | 伊人狠狠色丁香婷婷综合 | 成人宗合网 | 亚洲在线网址 | 日日操夜夜操狠狠操 | 中文字幕刺激在线 | 亚洲国产人午在线一二区 | 亚洲一区日韩精品 | 精品久久久久久一区二区里番 | 免费合欢视频成人app | 日韩a在线观看 | 欧美国产精品久久久久久免费 | 久久婷婷五月综合色丁香 | 91亚洲精 | 国产美女主播精品一区二区三区 | 亚洲做受高潮欧美裸体 | 日韩在线免费高清视频 | 国产精品二区在线观看 | 久久综合久久综合久久综合 | 久久人人艹| 日韩 精品 一区 国产 麻豆 | 国产福利91精品 | 91九色蝌蚪视频 | 在线观看va | 国产成人精品不卡 | 五月婷在线观看 | 国产精品久久片 | 热99在线视频 | 国产视频一区二区在线播放 | 三级黄色网络 | 日韩中文字幕视频在线 | 婷婷伊人五月 | 综合天天色 | 亚洲精品视频久久 | 亚洲欧洲精品一区二区 | 久久国产电影院 | 中文字幕免费一区二区 | 婷婷五月情| 久草com| 国产精品一区二区三区视频免费 | 成人精品福利 | 国产美女精彩久久 | 麻花豆传媒一二三产区 | 99高清视频有精品视频 | 91九色成人蝌蚪首页 | 韩国一区二区av | 久久精品影视 | 在线视频第一页 | 69久久99精品久久久久婷婷 | 免费看片网址 | 成人av网站在线观看 | 狠狠色婷婷丁香六月 | 91看片在线播放 | 日本久久久久久久久 | 久草免费色站 | 亚洲 综合 精品 | 亚洲午夜久久久久久久久 | 亚州精品成人 | 98超碰在线观看 | 国产一在线精品一区在线观看 | 日韩欧美黄色网址 | 久久精品久久久久 | 91精品秘密在线观看 | www.色五月| 在线免费观看麻豆视频 | 精品免费观看视频 | 午夜精品久久久久久久久久久久 | 深爱开心激情网 | 免费看国产视频 | 在线免费国产 | 一级欧美黄 | 欧美精品v国产精品 | www最近高清中文国语在线观看 | 91成人精品国产刺激国语对白 | 日韩高清精品一区二区 | 91九色在线播放 | 超碰com | 三级黄在线 | 久久艹中文字幕 | 91精品在线看| 久久久久久久久久电影 | 中文字幕黄色网 | 国产在线中文 | 亚洲在线成人精品 | 中文字幕av在线播放 | 永久中文字幕 | 91中文字幕 | 国产亚洲精品电影 | 国产精品高潮呻吟久久久久 | 在线观看黄色的网站 | 日韩精品在线观看视频 | 免费看精品久久片 | 91九色视频观看 | 成人亚洲精品国产www | 日韩videos | 午夜精品福利在线 | 国产91全国探花系列在线播放 | 亚洲久草网 | 国产黄色片免费在线观看 | 久久欧美在线电影 | 天天综合色 | 久久国产精品久久国产精品 | 久久精品2| 香蕉视频4aa| 亚州精品天堂中文字幕 | 人人插人人搞 | 久久精品五月 | 超碰资源在线 | 香蕉网在线观看 | 深夜激情影院 | 久草在线资源观看 | 欧美男男tv网站 | 伊人国产在线播放 | 日日夜夜天天人人 | 国产999精品 | 久久99免费| 成人午夜电影在线播放 | 亚洲黄污 | 久草网站在线观看 | 国产精品aⅴ | 色福利网 | 不卡视频在线看 | 97在线播放 | 999久久久欧美日韩黑人 | 亚洲精品毛片一级91精品 | 狠狠干网 | 婷婷综合影院 | 中国一区二区视频 | 最近中文字幕国语免费av | 国产精品2020 | 成人免费在线视频 | 成人免费观看在线视频 | 国产只有精品 | 九九热在线观看视频 | 91视频高清免费 | www.夜夜操.com | 成人a视频在线观看 | 69国产盗摄一区二区三区五区 | 99在线精品视频在线观看 | 国产一性一爱一乱一交 | 亚洲闷骚少妇在线观看网站 | 激情av网| 久草视频网 | 久久99国产精品免费网站 | 亚洲成人资源网 | 国际精品网 | 欧美资源| 在线v | 国产精品免费在线观看视频 | 色综合久久精品 | 国产精品毛片久久久久久 | 久久人91精品久久久久久不卡 | 久久久久久久久久久网 | 精品视频999 | 99视频在线精品国自产拍免费观看 | 欧美另类sm图片 | 国产91精品一区二区绿帽 | 色夜视频 | 亚洲作爱视频 | 欧美精品天堂 | 色婷婷激情电影 | 欧美日韩中文字幕视频 | www·22com天天操| 久久激情久久 | 亚洲精品视频在线观看免费视频 | 精品国产视频在线观看 | 久久久久网址 | 视频在线一区 | 亚洲综合在线五月 | 久久电影国产免费久久电影 | 极品国产91在线网站 | 在线影视 一区 二区 三区 | 成人免费看视频 | 国产色在线,com | 综合久久一本 | 日韩在线视频免费看 | 免费网站观看www在线观看 | 一性一交视频 | 精品国产_亚洲人成在线 | 国产精品私拍 | 五月天久久久久久 | www久久久久 | 日韩精品一区在线播放 | a黄色 | 欧美成人h版在线观看 | 最近2019中文免费高清视频观看www99 | 亚洲专区免费观看 | 99在线免费视频 | 亚洲专区免费观看 | 日韩在线视频在线观看 | 四虎在线视频免费观看 | 97在线观看免费观看 | 天天艹| 在线成人免费av | 国内精品视频在线 | 最近中文字幕免费大全 | 国内精品久久久久久久 | 久草视频首页 | 中文字幕高清 | 成 人 黄 色 片 在线播放 | 九色视频网站 | 在线亚洲高清视频 | 久久免费播放视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 中文字幕乱码电影 | 精品999在线观看 | 91在线九色 | 色干干 | 久久艹中文字幕 | 欧美日韩另类视频 | 人人添人人 | 探花视频在线观看免费 | 91亚色在线观看 | 欧美日本一二三 | 美女视频黄在线 | 国产毛片aaa | 亚洲一二三在线 | 久久久久欧美精品999 | 日韩理论 | 欧美成人手机版 | 999国内精品永久免费视频 | 在线看黄色的网站 | 9ⅰ精品久久久久久久久中文字幕 | 亚洲另类交 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品免费一区二区三区在线观看 | 久久国产精品成人免费浪潮 | 波多野结衣一区 | 在线观看视频国产一区 | 中文字幕在线色 | 黄色三级在线 | 亚洲精品乱码白浆高清久久久久久 | 精品国产乱码久久久久久天美 | 国产精品福利午夜在线观看 | 国产96在线观看 | 日韩视频一| 97在线影视 | 精品一区电影 | 国产日韩精品一区二区在线观看播放 | 亚洲伊人av | 国色天香在线 | 在线免费视频一区 | 亚洲日b视频 | 久久综合激情 | 婷婷资源站| 国产午夜精品一区二区三区四区 | 国产69精品久久久久久 | a天堂最新版中文在线地址 久久99久久精品国产 | 美女福利视频 | 91在线亚洲 | 干 操 插 | 国产99精品| 欧美一区二区在线 | 开心综合网 | 久久久久久久久久久久久久电影 | 欧美了一区在线观看 | av经典在线 | av中文电影 | 麻豆视频一区 | 亚洲婷婷伊人 | 久久麻豆视频 | 国产成人资源 | 国产亚洲视频中文字幕视频 | 亚洲精品国精品久久99热 | 在线视频欧美精品 | 人人爽人人爽人人爽人人爽 | 国产国语在线 | 激情视频在线高清看 | 东方av在 | 日韩欧美综合视频 | 国产精品中文在线 | 中文字幕久久亚洲 | 国产免费一区二区三区最新 | 波多野结衣视频一区二区 | 婷婷色在线资源 | 日韩欧美视频免费看 | 日韩极品视频在线观看 | 中文字幕在线影院 | 国内精品久久久久影院男同志 | 黄色网www| 91精品综合在线观看 | 中文字幕 国产 一区 | 久久人人添人人爽添人人88v | 91九色视频在线观看 | 天天操天天舔天天干 | av电影免费 | 在线影视 一区 二区 三区 | 日b视频国产| 国内精品视频在线 | 日韩一区二区三区高清免费看看 | 俺要去色综合狠狠 | 亚洲成av人片在线观看香蕉 | 欧美一区二区三区在线看 | 欧美日韩一区二区三区免费视频 | 亚洲精品乱码白浆高清久久久久久 | 中文字幕激情 | 亚洲美女精品区人人人人 | 激情五月在线视频 | 少妇bbw搡bbbb搡bbb | 亚洲美女视频在线观看 | 日韩影视大全 | 免费av看片 | 亚洲永久在线 | 精品在线观看一区二区三区 | 亚洲二级片| 日日干干夜夜 | 国产精品久久久久高潮 | 久久久久免费精品视频 | 国产 中文 日韩 欧美 | 五月婷香蕉久色在线看 | 最近更新中文字幕 | 五月婷婷中文字幕 | 精品久久久久久一区二区里番 | 狠狠干成人综合网 | 国产精品1区2区 | 日韩网站在线看片你懂的 | 欧美日韩国产精品一区 | 欧美黑人性猛交 | 又色又爽又激情的59视频 | 91麻豆精品国产午夜天堂 | 久久久电影网站 | 中文字幕日本电影 | 国产一区二区在线精品 | www91在线观看 | 精品毛片一区二区免费看 | 欧美a视频在线观看 | 亚洲国产成人久久综合 | 丝袜美女在线观看 | 久久精品影视 | 精品一区电影 | 国产香蕉久久 | 日韩欧美国产免费播放 | 日韩二区在线播放 | 日韩 在线观看 | 69久久夜色精品国产69 | 97在线精品视频 | 黄色成人av在线 | 中文字幕电影高清在线观看 | 国产成人在线看 | www.久久成人 | 97爱爱爱 | 97视频在线免费观看 | 999久久久国产精品 高清av免费观看 | 久久综合在线 | 91麻豆文化传媒在线观看 | 五月开心网 | 国产精品久久久久久模特 | 久久91网 | 精品国产成人 | 麻豆精品视频 | 天天操天天艹 | 欧美视频99 | 成人观看 | 伊人狠狠干 | 99精品视频99 | 91香蕉视频 | 精品国产人成亚洲区 | 成人久久18免费网站麻豆 | 国产精品 国内视频 | 亚洲黄a | 欧美日韩一级久久久久久免费看 | 91免费的视频在线播放 | 69视频网站 | 人人爽人人爽人人爽人人爽 | av在线电影免费观看 | 成人亚洲精品久久久久 | 久久久久一区二区三区 | 日韩国产高清在线 | 免费看黄20分钟 | 国产精品一区二区在线 | 国产中文字幕在线免费观看 | 亚洲人精品午夜 | 人人干干人人 | 午夜av大片 | 国产精品一二三 | 国产一级久久 | 欧美性久久久 | 97精品国产97久久久久久粉红 | 热久久这里只有精品 | 久久精品婷婷 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 五月开心六月伊人色婷婷 | 久久99国产精品二区护士 | 中文字幕888 | 国产精品手机视频 | 看片网站黄色 | 天天操操操操操操 | 欧美日韩二区三区 | 欧美大片www | 亚洲人精品午夜 | 久草在线资源网 | 国产精品欧美激情在线观看 | 精品96久久久久久中文字幕无 | 最近免费观看的电影完整版 | 国产精品系列在线观看 | 超碰在线中文字幕 | 亚洲理论电影网 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 精品黄色在线 | www操操操 | 又黄又刺激视频 | 一级黄色免费 | 精壮的侍卫呻吟h | 欧美激情在线看 | 热久久在线视频 | 亚洲精品在线播放视频 | 国产精品女视频 | 激情影院在线观看 | 色在线视频 | 国产成人一区二区三区在线观看 | 成人在线视频一区 | 黄色av免费看 | 成人网444ppp | 四虎影视精品永久在线观看 | 欧美激情亚洲综合 | 免费看黄在线看 | 久久99亚洲热视 | 亚洲在线 | 国产精品久久久久免费 | 一区二区在线不卡 | 亚洲码国产日韩欧美高潮在线播放 | 国产99久久久国产精品成人免费 | 亚洲国产理论片 | 欧亚日韩精品一区二区在线 | 午夜99| 国产精品国产三级国产aⅴ无密码 | 伊人精品影院 | 天天色天天射天天干 | 在线观看视频国产一区 | 日本黄色大片儿 | 久久久精品一区二区 | 激情婷婷综合 | 亚洲另类视频在线观看 | 国产中文字幕在线播放 | 亚洲传媒在线 | 久草精品在线观看 | 国产一区二区三区免费视频 | 欧美成a人片在线观看久 | 国产精品毛片一区二区三区 | 超碰国产在线播放 | 国产在线a免费观看 | 福利一区在线视频 | 亚洲精品视频在线播放 | 成人av影视在线 | 丁香久久激情 | 国产在线播放观看 | 免费三级黄色片 | 国产一级片免费视频 | 国产精品乱码久久久 | 国产精品久久久久久久久久免费看 | 中国一级片免费看 | 亚洲精品国久久99热 | av丝袜在线 | 午夜视频播放 | 美女视频免费精品 | 日韩电影中文字幕在线观看 | 国产精品久久一区二区三区, | 亚洲精品一区二区久 | 日本久久免费电影 | 日韩精品免费在线观看 | 国产成人精品aaa | 性色大片在线观看 | 最新国产在线观看 | 97夜夜澡人人双人人人喊 | 天天拍天天爽 | 中文字幕精品一区二区精品 | 亚洲1区 在线| 91精品免费| 91av在线免费播放 | 日韩一级片网址 | 精品国产一二三 | 国产成人av电影 | 五月天婷婷在线播放 | 在线观看视频国产 | 中文字幕亚洲欧美日韩2019 | 日本成址在线观看 | 最新日本中文字幕 | 亚洲欧美视频在线播放 | 视频在线播放国产 | 99久久精品国产免费看不卡 | 日日日日干 | 成人播放器 | 中文字幕在线观看一区二区三区 | 狠狠狠狠狠干 | 久草视频视频在线播放 | 亚洲女欲精品久久久久久久18 | 亚一亚二国产专区 | 97人人模人人爽人人喊网 | 日韩理论片在线观看 | 亚洲精品一区二区三区四区高清 | 999成人| 天天色天天射天天操 | 99精品在线免费视频 | 人人干干人人 | 久久精品激情 | 国产精品嫩草影视久久久 | 天天色婷婷 | 97理论片 | 国产精品一区在线观看你懂的 | 黄色www在线观看 | 丁香婷婷亚洲 | 99热在线看 | 99精品视频在线观看视频 | 国产视频一区在线免费观看 | 在线国产精品一区 | 毛片永久新网址首页 | 99久久日韩精品免费热麻豆美女 | 四虎永久视频 | 国产精品毛片一区二区 | 亚洲精品综合在线观看 | 久综合网| 精品9999| 日韩中出在线 | 国产一级在线看 | 奇米7777狠狠狠琪琪视频 | 粉嫩一二三区 | 国产网红在线观看 | 天天操天天摸天天干 | 天天操天天舔天天爽 | 五月天色中色 |