7:カフカは、基本的なJava APIの操作を生きるために使用されます
:私はケース送るコールバック関数なしで関数のパラメータをプロデューサーAPIの操作:
1 :まず、消費者を開始
2 :コーディングは以下の
kafka_producerパッケージ; インポートorg.apache.kafka.clients.producer.Callback; インポートorg.apache.kafka.clients.producer.KafkaProducer; インポートorg.apache.kafka.clients.producer.ProducerRecord; インポートorg.apache.kafka.clients .producer.RecordMetadata; インポートjava.util.Properties; / ** * @authorドーン * @date 2019インディアン6越3 Riを午前14時21分23秒 * @version 1.0 *カフカがプロデューサAPIライブするために使用される * / パブリッククラスproducerl { パブリックstaticメインボイド(文字列[]引数){ //プロパティプロデューサ1つの設定(指定されたパラメータの複数)。 プロパティは(=新たな新しい特性を支える); //パラメータ //カフカノードアドレス prop.put(「bootstrap.servers」 、 "192.168.40.11:9092"); //応答メッセージが送信されるのを待つ ための式(I = 0 int型、iが 100 <; Iは++){ 小道具を。 (「アック」、「すべてをかけます 」)。 //構成メッセージ障害リトライ送信 ; prop.put(「再試行」、「0」) //バッチ処理構成メッセージサイズ prop.put(「batch.size」、「10241」)を; //バッチ処理構成データ遅延 prop.put( "linger.ms"、」5" 。); //メモリバッファサイズ設定 prop.put( "buffer.memory"、 "12341235")を; //送信する前にメッセージが(*)直列化されなければならない 小道具。 PUT( "key.serializer"、 "org.apache.kafka.common.serialization.StringSerializer"); prop.put( "value.serializer"、 "org.apache.kafka.common.serialization.StringSerializer"); //プロデューサーの2例 KafkaProducer <文字列、文字列> =新しい新プロデューサKafkaProducer <文字列、文字列>(プロプ)。 // 3.メッセージ送信 producer.send(新しいProducerRecord <文字列、文字列>( "朝"、 "have_freshair" + I)); } // 4释放资源。 producer.close(); } }
3 :実行結果
ケースII:カスタムのパーティションおよび送信関数のパラメータを使用するコールバック関数プロデューサー
1 :またはの使用朝のテーマ
2:コードを書きます:
区:
kafka_producerパッケージ; インポートorg.apache.kafka.clients.producer.Partitioner; インポートorg.apache.kafka.common.Cluster; インポートjava.util.Map; / ** * @authorドーン * @date * @version 1.0 *からパーティションに戻り、パーティションを定義1。 * / publicクラスパーティション1を実装するパーティション分割{ //論理区画 公共int型のパーティション(S文字列、オブジェクトO、バイト[]バイトを、O1、バイト[]バイト1、クラスタクラスタオブジェクト){ リターン1; } / /設定し ます。public voidのconfigure(地図<文字列、?>マップ){ } //解放リソース ます。public void利用クローズ(){ } }
クリエーター、コールバック関数
kafka_producerパッケージ; インポートorg.apache.kafka.clients.producer.Callback; インポートorg.apache.kafka.clients.producer.KafkaProducer; インポートorg.apache.kafka.clients.producer.ProducerRecord; インポートorg.apache.kafka.clients .producer.RecordMetadata; インポートjava.util.Properties; / ** * @author夜明け * @date 2019インディアン6越3 Riを午前14時21分23秒 * @version 1.0 *カフカがプロデューサー追加カスタムパーティションを生きるために使用されます。コールバックコールバック関数とデータ送信 * / publicクラスProducer2 { パブリック静的無効メイン(文字列[] args){ //プロパティプロデューサを1つの設定(指定されたパラメータの複数)。 プロパティ小道具=新しい新しいプロパティ(); //パラメータ設定 //カフカノードアドレス prop.put( "bootstrap.servers"、 "192.168.40.11:9092"); //待つ応答メッセージが送信されるため prop.putを( "ACKを"、 "すべて"); //送信メッセージの設定失敗時の再試行 prop.put ( "再試行"、 "0"); //バッチ処理構成メッセージサイズ prop.put( "batch.size"、 "10241"); //バッチ処理構成データ遅延 prop.put( "linger.ms"、 " 5 "); //メモリバッファサイズ設定 prop.put(" buffer.memory "" 12341235 ")を; //パーティションカスタム注釈で開く prop.put(" partitioner.class "" kafka_producer.Partition1 「) ; //送信する前にメッセージが(*)直列化されなければならない prop.put( "key.serializer"、「org.apache.kafka.common.serialization。StringSerializer "); prop.put( "value.serializer"、 "org.apache.kafka.common.serialization.StringSerializer"); // 2。インスタンス化プロデューサー KafkaProducer <文字列、文字列> =新しい新しいプロデューサーKafkaProducer <文字列、文字列>(プロパ); ... // 3メッセージ、コールバック関数を送信 以下のために(;私は100 <; I = 0 int型私は++){ (){producer.send(新しいProducerRecord <文字列、文字列>( "朝"、 "have_freshair +" + i)は、新しいコールバックを 公共のボイドonCompletion(RecordMetadata recordMetadata、例外e){ //如果recordMetadata不为ヌル拿到当前的数据偏移量与分区 場合(recordMetadata!= NULL){ System.out.printlnは(recordMetadata.topic()+ "----" + recordMetadata。オフセット()+ "----" + recordMetadata.partition()); } } })。 } // 4。 } }
3:実行結果
カフカの消費者はデータがホバリングされていません
4:次のようにコールバック結果は
分析:一つだけのパーティションたときに私たちは、テーマを作成する 0パーティションで、データパーティション0が我々が端末で消費されています。我々は、カスタムパーティションを追加したコードは、パーティション番号が存在しないデータがないとオフセット得られたコールバックは定数であるプロデューサは、パーティション1に、すべての消費者に送る、1です。図3に関連して、以下を参照してください。
ケース 3 :カフカが住んでいたインターセプタを
ここだけの簡単なプロセスでした。これは、タイムスタンプが先行します
1:次のようにコードであります
インターセプター:
package 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; /** * @author Dawn * @date 2019年6月3日15:58:15 * @version 1.0 * 这里在拦截器哪里添加了当前时间 */ public class TimeInterceptor implements ProducerInterceptor<String,String> { //配置信息 public void configure(Map<String, ?> configs) { } //业务逻辑 public ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) { return new ProducerRecord<String, String>( record.topic(), record.partition(), record.key(), System.currentTimeMillis() + "-" + record.value()); } //发送失败调用 public void onAcknowledgement(RecordMetadata metadata, Exception exception) { } //关闭资源 public void close() { } }
生成者:
package kafka_interceptor; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.ArrayList; import java.util.Properties; /** * @author Dawn * @date 2019-6-3 15:47:10 * @version 1.0 * kafka的拦截器 */ public class Producer1 { public static void main(String[] args) { //1.配置生产者属性(指定多个参数) Properties prop = new Properties(); //参数配置 //kafka节点的地址 prop.put("bootstrap.servers","192.168.40.11:9092"); //发送消息是否等待应答 prop.put("acks","all"); //配置发送消息失败重试 prop.put("retries","0"); //配置批量处理消息大小 prop.put("batch.size","10241"); //配置批量处理数据延迟 prop.put("linger.ms","5"); //配置内存缓冲大小 prop.put("buffer.memory", "12341235"); //消息在发送前必须序列化(*) prop.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer"); prop.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer"); //拦截器 ArrayList<String> list = new ArrayList<String>(); list.add("kafka_interceptor.TimeInterceptor"); prop.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,list); //2.实例化producer KafkaProducer<String, String> producer = new KafkaProducer<String, String>(prop); //3.发送消息 for (int i=0; i<100; i++){ producer.send(new ProducerRecord<String, String>("morning","dawntest ---"+i)); } //4:释放资源 producer.close(); } }
运行结果如下:
案例4:kafka Stream
需求?
这里进行简单的kafka计算。(注意kafka计算的性能不是很好,只能满足一点点的计算,一般情况下都是结合SparkStream storm用的)。这里进行简单的数据清洗
例如,在主题t1 producer中输入了dawn-persist
在主题t2 consumer中接收来的就是persist
1:代码如下
package kafka_stream; import org.apache.kafka.streams.processor.Processor; import org.apache.kafka.streams.processor.ProcessorContext; /** * @author Dawn * @date 2019年6月3日16:55:09 * @version 1.0 * kafka简单数据清洗 * 需求? * 例如:dawn-persist 结果: persist * 定义主题,并将结果发送到另一个主题中 */ public class LogProcessor implements Processor<byte[],byte[]> { private ProcessorContext context; public void init(ProcessorContext context) { //传输 this.context=context; } //具体业务逻辑 public void process(byte[] key, byte[] value) { //1.拿到具体数据,并装换成字符串 String message = new String(value); //2:如果包含 - 就去掉,并且只保存右侧数据 例如 dawn-persist 结果: persist if (message.contains("-")){ message=message.split("-")[1]; } //3:发送数据 context.forward(key,message.getBytes()); } public void close() { } }
主程序:
package kafka_stream; import org.apache.kafka.streams.KafkaStreams; import org.apache.kafka.streams.StreamsConfig; import org.apache.kafka.streams.Topology; import org.apache.kafka.streams.processor.Processor; import org.apache.kafka.streams.processor.ProcessorSupplier; import java.util.Properties; /** * @author Dawn * @date * @version 1.0 * kafka数据清洗。 */ public class Application { public static void main(String[] args) { //1.定义2个主题,并将结果发送到另一个主题中 String firstTopic="t1"; String secondTopic="t2"; //2.设置属性 Properties prop = new Properties(); prop.put(StreamsConfig.APPLICATION_ID_CONFIG,"logProcessor"); prop.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,"bigdata11:9092,bigdata12:9092,bigdata13:9092"); //3.实例对象 StreamsConfig config = new StreamsConfig(prop); //4.流计算 拓扑 Topology bulider = new Topology(); //5.定义kafka组件数据源 bulider.addSource("Source",firstTopic).addProcessor("Processor", new ProcessorSupplier<byte[],byte[]>() { public Processor<byte[],byte[]> get() { return new LogProcessor(); } //从哪里来 },"Source") //去哪里 .addSink("Sink",secondTopic,"Processor"); //6.实例化kafkaStream KafkaStreams kafkaStreams = new KafkaStreams(bulider, prop); kafkaStreams.start(); } }
2:运行结果
发送:
接收: