即将上线的flume服务器面临的一系列填坑笔记
? 即將上線的flume服務器面臨的一系列填坑筆記
作者:尹正杰
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
?
?
一.flume缺少依賴包導致啟動失敗!
報錯信息如下:
2018-10-17 11:07:43,369 (conf-file-poller-0) [ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:146)] Failed to start agent because dependencies were not found in classpath. Error follows.
上面的報錯信息很明顯的告訴了我們,缺少依賴包。沒有找到依賴環境!我對比了線上的flume的lib目錄下和我新集群的lib目錄,發現是有點不一樣!下圖就是我線上的環境:
下圖就是我新集群的環境:
? 此時相信大家看到這種情況,已經迫不及待的想把線上的jar包都拷貝過來,觀察問題是否解決,沒錯,我也是這么想的,于是我將線上的jar包拷貝到了我的集群。如下圖:
拷貝完成后,觀察我的新集群的jar包和線上jar包環境是一致的!如下圖:?
我新集群的環境和線上的保持一致后,重新執行上述的錯誤就不在出現啦!
?
二.內存溢出,導致flume運行崩潰
解決了上面關于依賴包的問題,發現新錯又出現了,報錯OOM,報錯信息如下:
Exception in thread "PollableSourceRunner-KafkaSource-kafkaSource" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.ArrayList.iterator(ArrayList.java:834)
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "PollableSourceRunner-KafkaSource-kafkaSource"
Exception in thread "SinkRunner-PollingRunner-DefaultSinkProcessor" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "SinkRunner-PollingRunner-DefaultSinkProcessor"
? 相必須看到上述的報錯的小伙伴應該都跟我一樣,第一反應就是調大內存,在將堆內存調大之前,我們先看一下flume默認給我分配堆堆內存是多大,如下圖:(我們看到flume默認指定堆堆大堆內存為20M,它崩潰了是理所當然的,畢竟我們公司的數據量也不小!)
? 你是不是很好奇,這個20M大小在哪里設置的呢?其實就是在flume-ng這個腳本里寫死了,編輯你的flume-ng腳本,查看第225行,如下圖:
找到原因呢后,我們可以修改這個上面的配置文件(/soft/apache-flume-1.7.0-bin/bin/flume-ng,這個路徑跟你安裝flume的路徑去找,推薦使用which,find命令將他找出來!)參數(JAVA_OPTS="-Xmx10240m"),我們將20M改為10G,具體操作如下:
當然,如果你不想修改默認的參數,我們也可以在啟動的時候修改JVM的堆內存空間。我在命令行啟動flume進程的時候手動分配Java的堆內存大小為2G,如下圖:
?
?
三.缺少Hadoop的運行環境導致無法通過kafka將數據拷貝到hdfs中。
?報錯信息如下:
2018-10-17 13:06:45,287 (SinkRunner-PollingRunner-DefaultSinkProcessor) [WARN - org.apache.flume.sink.hdfs.BucketWriter.getRefIsClosed(BucketWriter.java:182)] isFileClosed is not available in the version of HDFS being used. Flume will not attempt to close files if the close fails on the first attempt
java.lang.NoSuchMethodException: org.apache.hadoop.fs.LocalFileSystem.isFileClosed(org.apache.hadoop.fs.Path)
遇到上面的這種情況,首先請確認你的hdfs的環境是否安裝了,我的flume機器上僅僅部署了jdk和flume環境,其他的環境都沒部署。如果你跟我一樣沒有部署的話,我給你個思路:
1>.去Apache官網下載和你集群中hdfs版本一致的包,安裝到你的服務器上;(我cdh默認hdfs版本是2.6.0,于是我就去官網下載相應的包:https://archive.apache.org/dist/hadoop/common/hadoop-2.6.0/)
2>.安裝過程很簡單,解壓即可,然后在“/etc/profile”這個配置文件中配置一下環境變了,最后別忘記將你要上傳到hdfs集群中的配置文件(core-site.xml和hdfs-site.xml?)拷貝一份到本地,將這兩個配置文件覆蓋到本地到配置文件,配置文件生效后,需要使用“source /etc/profile”命令來重新加載一個系統的環境變量的配置文件,配置完成后我們可以通過下面的命令查看hdfs的版本。
按照上述方法操作后,我們再次運行flume,發現不報錯了,數據也開始在hdfs中寫了,是不是沒有報錯信息了?沒有報錯就是最好的結果,如下圖:?
? 接下來我們去集群的webUI查看相應的文件是否生產,果不其然,文件已經寫到hdfs中了:
?
四.broker節點時間不同步導致的
報錯信息如下:
2018-10-18 16:28:37,329 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.kafka.clients.consumer.internals.AbstractCoordinator$SyncGroupRequestHandler.handle(AbstractCoordinator.java:431)] SyncGroup for group flume-consumer-against_cheating_01 failed due to coordinator rebalance, rejoining the group
2018-10-18 16:28:37,957 (PollableSourceRunner-KafkaSource-kafkaSource) [WARN - org.apache.flume.channel.kafka.KafkaChannel$KafkaTransaction.doCommit(KafkaChannel.java:560)] Sending events to Kafka failed
java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: The request timed out.
at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.valueOrError(FutureRecordMetadata.java:56)
at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:43)
at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:25)
at org.apache.flume.channel.kafka.KafkaChannel$KafkaTransaction.doCommit(KafkaChannel.java:552)
at org.apache.flume.channel.BasicTransactionSemantics.commit(BasicTransactionSemantics.java:151)
at org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:194)
at org.apache.flume.source.kafka.KafkaSource.doProcess(KafkaSource.java:295)
at org.apache.flume.source.AbstractPollableSource.process(AbstractPollableSource.java:60)
at org.apache.flume.source.PollableSourceRunner$PollingRunner.run(PollableSourceRunner.java:133)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.kafka.common.errors.TimeoutException: The request timed out.
? 這個問題,困擾了我好久,百度谷歌接近2個小時,都沒有找到答案,手動去kafka集群拉去數據也是可以正常拉去都,就是一直報上面都錯誤,最后我們運維小組都人一起在辦公室幫我分析一下原因,我自己也納悶,為什么上午還好好都,下午就不好使了。我一個同時說會不會是下午你讓我同步Hadoop集群都時間了?導致這個錯誤都發生?我尋思了一番,于是重啟了一下Hadoop集群,發現以上錯誤煙消云散啦!那么問題來了,為什么會這樣的呢?
說到這,我們就不得不探討一下Kafka的工作原理了。
?
總結
以上是生活随笔為你收集整理的即将上线的flume服务器面临的一系列填坑笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第九章:路由网关(Zuul)的使用
- 下一篇: Message Loop 原理及应用