ETL系列 | Kafka輸入插件使用指南

本文介紹Kafka輸入插件基本使用方法。

01—

概述

Kafka輸入插件從kafka接受各種格式的字符串類型消息,進行加工處理、流計算後,通過輸出插件輸出結果數據,對應的插件配置類:

Kafka2InputConfig,可以配置kafka消費端參數,包括kafka服務器地址、消費組id、自動提交機制、offset機制、消費線程數量、消息處理工作線程數、線程隊列長度、topic、消息序列化機制等。

02—

插件配置案例

直接看kafka輸入插件的配置案例:

// kafka服務器參數配置// kafka 2x 客戶端參數項及說明類:org.apache.kafka.clients.consumer.ConsumerConfigKafka2InputConfig kafka2InputConfig = new Kafka2InputConfig();kafka2InputConfig//.addKafkaConfig("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer")  //.addKafkaConfig("key.deserializer","org.apache.kafka.common.serialization.LongDeserializer")  .addKafkaConfig("group.id","trandbtest") // 消費組ID  .addKafkaConfig("session.timeout.ms","30000")  .addKafkaConfig("auto.commit.interval.ms","5000")  .addKafkaConfig("auto.offset.reset","latest")//          .addKafkaConfig("bootstrap.servers","192.168.137.133:9093")  .addKafkaConfig("bootstrap.servers","127.0.0.1:9092")  .addKafkaConfig("enable.auto.commit","false")//一般不要開啓自動提交  .addKafkaConfig("max.poll.records","500") // The maximum number of records returned in a single call to poll().  .setKafkaTopic("xinkonglog") // kafka topic  .setConsumerThreads(5) // 並行消費線程數,建議與topic partitions數一致  .setKafkaWorkQueue(10)//每個消費線程對應的工作等待隊列長度  .setKafkaWorkThreads(2)//每個消費線程對應的工作線程數量
  .setPollTimeOut(1000) // 從kafka consumer poll(timeout)參數  .setValueCodec(CODEC_JSON)  .setKeyCodec(CODEC_LONG);importBuilder.setInputConfig(kafka2InputConfig);

關鍵配置說明:

kafka2InputConfig.setValueCodec(CODEC_JSON) json消息反序列化,將kafka中json字符串自動轉換爲map對象,如果消息是json格式,可以指定這個解碼器,如果不指定默認就是String解碼器

kafka2InputConfig.setKeyCodec(CODEC_LONG) 如果key是long類型,採用long反序列化消息key,這是一個可選配置。

Codec目錄可以支持以下類型:

CODEC_TEXTCODEC_TEXT_SPLITCODEC_JSONCODEC_LONGCODEC_INTEGERCODEC_BYTE(byte數組)

如果配置了value.deserializer,那麼setValueCodec將不起作用;

如果配置了key.deserializer,那麼setKeyCodec將不起作用;

如果消息是其他格式,則可以設置CODEC_TEXT 類型,然後自行在datarefactor中進行處理,亦可以按照分割字符進行解析,然後進行字段映射處理。

03—

自定義消息轉換處理

非格式化的字符串消息,可以自行在datarefactor中進行靈活的轉換處理:

kafka2InputConfig.setValueCodec(CODEC_TEXT );importBuilder.setDataRefactor(new DataRefactor() {  public void refactor(Context context) throws Exception  {
     // 獲取原始的Kafka記錄     KafkaStringRecord record = (KafkaStringRecord) context.getCurrentRecord();     if(record.getKey() == null)       System.out.println("key is null!");     String message = (String)record.getData();     String[] datas = message.split("|");//舉個簡單的處理實例:按指定消息字段分割符,將消息切割爲字符串數組    //指定數組元素與字段名稱的映射配置    context.addFieldValue("logOperTime",datas[0]);    context.addFieldValue("operModule",datas[1]);    context.addFieldValue("logOperuser",datas[2]);  }});

如果消息是按照特定分割字符拼接而成,那麼可以直接按照特定分隔符進行解析,然後進行字段映射處理,valuecodec必須設置爲

CODEC_TEXT_SPLIT

kafka2InputConfig .setValueCodec(CODEC_TEXT_SPLIT);
Kafka2InputConfig kafka2InputConfig = new Kafka2InputConfig();kafka2InputConfig.setFieldSplit(";");//指定消息字段分割符,按照分隔符將消息切割爲字符串數組//指定數組元素與字段名稱的映射配置,kafka2InputConfig.addCellMapping(0, "logOperTime");kafka2InputConfig.addCellMapping(1, "operModule");kafka2InputConfig.addCellMapping(2, "logOperuser");

採用上面兩種kafka消息自定義處理方法,可以滿足各種不同格式的字符串kafka消息的處理需求

04—

 kafka輸入插件攔截器設置

kafka輸入插件作爲事件監聽型插件,在通過攔截器收集作業metrics信息時,需定時記錄和統計插件消費kafka數據記錄情況,然後調用任務攔截器的aftercall方法輸出統計jobMetrics信息,因此一般指定統計時間間隔:

//300秒做一次任務攔截調用,默認值kafka2InputConfig.setMetricsInterval(300 * 1000L);

05—

 結束語

通過kafka輸入插件,可以非常靈活地處理各種格式的字符串kafka消息,然後將處理後的數據通過各種輸出插件進行輸出,從而實現海量數據的實時高效流處理作業。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章