生活随笔
收集整理的這篇文章主要介紹了
Flume学习笔记(二)问题整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文環境如下:
操作系統:CentOS 7.2.1511 64位
Flume版本:1.6.0
1. 當Flume與Hadoop不在同一服務器上
當Flume與Hadoop不在同一服務器上時,又配置了寫HDFS,則Flume啟動時會報找不到類的錯誤。
需要添加Hadoop相關的包到flume的classpath配置中(或者直接拷貝到flume的lib文件夾中)。
具體需要的包,我是在maven項目中配置:
<dependency><groupId>org.apache.hadoop
</groupId><artifactId>hadoop-common
</artifactId><version>2.6.4
</version>
</dependency>
<dependency><groupId>org.apache.hadoop
</groupId><artifactId>hadoop-hdfs
</artifactId><version>2.6.4
</version>
</dependency>
<dependency><groupId>org.apache.hadoop
</groupId><artifactId>hadoop-client
</artifactId><version>2.6.4
</version>
</dependency>
然后把所有依賴的包(共82個),都拷貝到flume的lib中(有些包會和lib中的重復)。實際情況應該有蠻多包是沒有使用的,以后有時間再精簡了。
2. 寫入配置了HA的HDFS中
當你的Flume需要將數據寫入HDFS中,而Hadoop服務器又配置了HA,我嘗試了2種配置方案。
方案1
配置其中一個namenode,并添加到host。
該方案能用,但是Hadoop的HA就起不了作用了。當你一個節點掛掉了,flume也要手動去修改配置,才能使用另外一個namenode。
方案2
直接把Hadoop的nameservices(假設為xxfs)配置到flume的hdfs.path屬性中。
這種方案將會報以下錯:
2016-
08-
04 13:
34:
55,
535 (SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org
.apache.flume.SinkRunner$PollingRunner
.run(SinkRunner
.java:
160)] Unable to deliver event. Exception follows.
org.apache.flume.EventDeliveryException: java
.lang.IllegalArgumentException: java
.net.UnknownHostException: xxfsat org
.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink
.java:
463)at org
.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor
.java:
68)at org
.apache.flume.SinkRunner$PollingRunner
.run(SinkRunner
.java:
147)at java
.lang.Thread.run(Thread
.java:
745)
Caused by: java
.lang.IllegalArgumentException: java
.net.UnknownHostException: xxfsat org
.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil
.java:
374)at org
.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies
.java:
310)at org
.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies
.java:
176)at org
.apache.hadoop.hdfs.DFSClient.<init>(DFSClient
.java:
668)at org
.apache.hadoop.hdfs.DFSClient.<init>(DFSClient
.java:
604)at org
.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem
.java:
148)at org
.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem
.java:
2596)at org
.apache.hadoop.fs.FileSystem.access$200(FileSystem
.java:
91)at org
.apache.hadoop.fs.FileSystem$Cache
.getInternal(FileSystem
.java:
2630)at org
.apache.hadoop.fs.FileSystem$Cache
.get(FileSystem
.java:
2612)at org
.apache.hadoop.fs.FileSystem.get(FileSystem
.java:
370)at org
.apache.hadoop.fs.Path.getFileSystem(Path
.java:
296)at org
.apache.flume.sink.hdfs.BucketWriter$1
.call(BucketWriter
.java:
243)at org
.apache.flume.sink.hdfs.BucketWriter$1
.call(BucketWriter
.java:
235)at org
.apache.flume.sink.hdfs.BucketWriter$9$1
.run(BucketWriter
.java:
679)at org
.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator
.java:
50)at org
.apache.flume.sink.hdfs.BucketWriter$9
.call(BucketWriter
.java:
676)at java
.util.concurrent.FutureTask.run(FutureTask
.java:
266)at java
.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor
.java:
1142)at java
.util.concurrent.ThreadPoolExecutor$Worker
.run(ThreadPoolExecutor
.java:
617)...
1 more
Caused by: java
.net.UnknownHostException: xxfs...
21 more
最終的方案
(1)將Hadoop的nameservices(假設為xxfs)配置到flume的hdfs.path屬性中。例如:
a1
.sinks.userSink.hdfs.path = hdfs://xxfs/flume
(2)將Hadoop服務器上配置好的core-site.xml、hdfs-site.xml拷貝到flume的conf文件夾下。
再重新啟動Flume將可以用了。
(3)將Hadoop所使用的幾臺服務器做好host。
3. Kafka Channel的parseAsFlumeEvent
由于項目有需求要把Flume中的部分數據寫Kafka,而我做過測試,通過Memory Channel+Kafka Sink的性能不如直接使用Kafka Channel,以上為背景。
實際使用的過程中,發現parseAsFlumeEvent這個配置起不了作用。也就是無論parseAsFlumeEvent配置為true還是false,都會轉為Flume Event。
這樣的話,造成的結果是,會始終都把Flume的headers中的信息混合著內容一起寫入Kafka的消息中,這顯然不是我所需要的,我只是需要把內容寫入即可。
后來我查詢了一些資料,網絡上也有人發現了這個bug,并且提交bugfix給Flume官方,但是要下一個版本(1.7)才能解決。
無奈之下,只能先采用Memory Channel+Kafka Sink的方式作為代替了。
總結
以上是生活随笔為你收集整理的Flume学习笔记(二)问题整理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。