1. 程式人生 > >flume通過公網ip採集到hdfs上

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

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