flume通過公網ip採集到hdfs上

需求描述:
公司的服務器在不同的地市都有分佈,需要把不同地方的服務器的日誌文件都收集到公司的內網hadoop集羣中,來進行分析,(公司的hadoop集羣和其他地方的集羣不在同一內網中,需要藉助公網來進行傳輸)
簡單的模型圖如下
這裏寫圖片描述

失敗案例:
直接把公網IP放在了hadoop集羣的nn(namenode上面),模型如下:
這裏寫圖片描述
然後啓動flume往hdfs上面傳輸日誌文件,發現flume端一直拋異常,說的是,不能夠寫入文件,然後去hadoop上看,發現只能穿上文件名,但是不能夠寫入文件。多次嘗試都是不行的,進過一番嘗試和分析,發現時應爲外網傳輸的原因,應爲公網在namenode上面,但是datanode上面並沒有,當真正往hdfs上面寫文件的時候,並不能寫上去。錯誤分析圖:
這裏寫圖片描述

成功案例:
經過了一天的糾結終於想的出可以實現的方案了,因爲上面的是應爲不能和DN進行通訊造成的,所對以上方案進行改進,在公司內網服務器端再加上一個flume進行對接一下,這樣就可以避免了上面案例的失敗的點了,具體的模型爲:
這裏寫圖片描述

附上配置文件:

#這個是不同地方的服務器上的flume的配置文件
#從本地的文件夾中讀取文件,然後發送爲avro文件
a1.sources = r1
a1.channels = c1
a1.sinks = k1

#具體定義source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/hadoop/install/flumefile

#具體定義channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 100

#定義sink

a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 公網ip
a1.sinks.k1.port = 4545

#組裝source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
#這個是內網裏面的flume的配置文件
#定義agent名, source、channel、sink的名稱
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#
##具體定義source
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4545
#
#
#
##具體定義channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 100
#
##定義攔截器,爲消息添加時間戳
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
#
#
#具體定義sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.fileType = DataStream
#
##不按照條數生成文件
a1.sinks.k1.hdfs.rollCount = 0
##HDFS上的文件達到128M時生成一個文件
a1.sinks.k1.hdfs.rollSize = 10240
##HDFS上的文件達到60秒生成一個文件
a1.sinks.k1.hdfs.rollInterval = 120
#
#
##組裝source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

注意:配置文件裏面的參數是不能直接放入生產環境中去使用的,需要自己根據實際情況去修改的,這裏面的參數只是爲了方便測試看出來效果才這樣去配置的。

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