如下圖,在測試使用nifi往kafka打數據的時候,發現通過ambari安裝的kafka收不到數據,而通過docker安裝的kafka則可以收到數據。
模擬公司場景,消費海外的kafka,往國內kafka打數據
nifi後臺log日誌報錯信息
2020-04-19 11:09:02,916 INFO [Timer-Driven Process Thread-10] o.a.kafka.common.utils.AppInfoParser Kafka version : 0.9.0.1
2020-04-19 11:09:02,916 INFO [Timer-Driven Process Thread-10] o.a.kafka.common.utils.AppInfoParser Kafka commitId : 23c69d62a0cabf06
2020-04-19 11:09:33,124 ERROR [Timer-Driven Process Thread-10] o.a.n.p.kafka.pubsub.PublishKafka PublishKafka[id=90615958-0171-1000-ecfb-347ad3ec18ae] Failed to send all message for StandardFlowFileRecord[uuid=cf69651e-f562-42c6-abed-9b8b55259213,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1587248292562-1, container=default, section=1], offset=419, length=9],offset=0,name=cf69651e-f562-42c6-abed-9b8b55259213,size=9] to Kafka; routing to failure due to org.apache.kafka.common.errors.TimeoutException: Batch Expired: org.apache.kafka.common.errors.TimeoutException: Batch Expired
org.apache.kafka.common.errors.TimeoutException: Batch Expired
log報錯並沒有直接說明報錯原因,而是報一個【批次過期】錯誤,幸好在網上搜這個錯誤的時候大部分信息都指向了kafka的server.properties中listeners的配置問題。
原因
ambari安裝kafka是server.properties中listeners的配置默認ip是localhost,這樣導致遠程訪問不到kafka的broker
解決
因爲使用ambari安裝的kafka,不需要到kafka目錄找到配置修改,只需要在ambari的web管理界面修改配置即可。
將listeners的localhost改成真實ip。
注意:
我先將ip用hostname的方式,結果是不行的,最後改成真實ip才能接收到數據。
這個問題考慮過nifi所在的機器是不是配置了hosts映射,專門測試過也不行,所以還是要使用真實ip吧
ps.這裏跟網上的稍微不同的是ambari裏面只改listeners就解決了,也沒找到【advertised.listeners】這個配置
如果是自己手動安裝的kafka就需要將下面兩個參數都改了。
修改前:
listeners=PLAINTEXT://:9092
修改後
listeners=PLAINTEXT://真實ip:9092
advertised.listeners=PLAINTEXT://真實ip:9092
最終效果
最終打通效果圖
nifi消費192.168.2.15:9092
nifi給【192.168.2.15:9093】kafka打數據的配置
nifi給【192.168.2.11:6667】kafka打數據的配置
數據流
1、通過【192.168.2.15:9092】這個kafka的生產者產生消息
2、然後nifi消費這個kafka的消息,在分別向【192.168.2.11:6667】和【192.168.2.15:9093】這兩個kafka打,
3、通過console-consumer查看兩個kafka是不是接收到消息了。