轉自:https://segmentfault.com/a/1190000011881177
記一次linux上安裝配置flume1.8.0過程
1、安裝jdk
需要1.6以上版本
參考文章 https://segmentfault.com/a/11...
2、下載flume
從官網下載壓縮包:http://flume.apache.org/downl...
選擇apache-flume-1.8.0-bin.tar.gz,選擇鏡像地址開始下載,如:wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz
3、解壓並安裝
- 解壓
tar -zxvf apache-flume-1.8.0-bin.tar.gz
- 安裝:
mv apache-flume-1.8.0-bin /opt/flume-1.8.0
(放到想要安裝的目錄下,目錄名保存爲flume-1.8.0,如/opt)
4、配置
-
修改配置文件:
vi /opt/flume-1.8.0/conf/flume.conf
此配置文件,配置了兩個source:s1和s2,一個channel,一個sink。s1監聽目錄/data/log目錄,並把信息寫入c1,s2監聽本機所有ip(0.0.0.0)的80端口,信息也寫入c1,k1從c1讀取數據,寫入flume的日誌。
- 配置文件說明:
配置項名稱 | 作用 | 舉例 |
agent1 | flume節點名稱,啓動時通過參數命令-name指定 | |
agent1.sources | 監聽的源,可以有多個,空格隔開即可,用於收集數據併發送到channel | agent1.sources=s1 s2 |
agent1.channels | 臨時通道,可以有多個,空格隔開,存放source收集的數據,sink從這裏讀取數據 | agent1.channels=c1 |
agent1.sinks | 接收器,可以有多個,空格隔開,從channel讀取數據,併發送給目標 (比如kafka 或者hdfs或者另一個flume) | agent1.sinks=k1 |
agent.sources.s1.type | 源的類型,s1是源名稱,可以是目錄、日誌文件、或者監聽端口等。 常用的source的類型包括avro、exec、netcat、spooldir和syslog等. 具體請參考官網http://flume.apache.org/Flume... | agent.sources.s1.type=spooldir agent.sources.s2.type=avro |
agent1.sources.s1.channels | 監聽數據要寫入的channel名稱 | agent1.sources.s1.channels=c1 |
agent1.channels.c1.type | 通道的類型,c1爲通道名稱,此處memory表示爲常用的memory-channel, 同時也有其他類型的channel,如JDBC、file-channel、custom-channel等, 具體請參考官網http://flume.apache.org/Flume... | agent1.channels.c1.type=memory |
agent1.sinks.k1.type | 接收器類型,k1爲接收器名稱,此處logger表示直接寫入日誌, 常用的包括avro、logger、HDFS、Hbase以及file-roll等, 具體參考官網http://flume.apache.org/Flume... | agent1.sinks.k1.type=logger |
5、啓動
/opt/flume-1.8.0/bin/flume-ng agent --conf conf --conf-file conf/flume.conf --name agent1 -Dflume.root.logger=INFO,console
- 啓動命令參數說明:
參數 | 作用 | 舉例 |
–conf 或 -c | 指定配置文件夾,包含flume-env.sh和log4j的配置文件 | –conf conf |
–conf-file 或 -f | 配置文件地址 | --conf-file conf/flume.conf |
–name 或 -n | agent(flume節點)名稱 | --name agent1 |
6、錯誤說明
- 監聽端口被佔用:
java.net.BindException:地址已在使用
- 接收協議與client發送數據協議不一致:
設置爲avro 時,可能會出現這樣的錯誤。比如:flume接收avro,client發送tcp,可把avro改爲netcat
-
sink讀不到數據:
若兩個sink讀取同一個c1 同一個消息,每次只有一個sink讀取成功。 channel 的內容只輸出一次,同一個event 如果sink1 輸出,sink2 不輸出;如果sink1 輸出,sink1 不輸出。 最終 sink1+sink2=channel 中的數據 ![clipboard.png](/img/bVX0Vf)
錯誤記錄
1、Caused by: java.lang.NullPointerException:Excepted timestamp in the Flume event headers, but it was null...
- 原因:
寫入到hdfs時使用到了時間戳來區分目錄結構,flume的消息組件event在接受到之後在header中沒有發現時間-戳參數,導致該錯誤發生 -
解決辦法:
有三種解決辦法:(重啓生效)- 爲source添加timestamp攔截器,沒調event頭中加入時間戳(效率會慢點)agent1.sources.source1.interceptors.t1.type=timestamp
- 爲sink使用本地時間戳agent1.sinks.sink1.hdfs.useLocalTimeStamp=true即可(如果客戶端與flume集羣時間不一致,數據時間會不準確)
- 在想source發送event時,講時間戳參數添加到event的header中即可,header是一個map,添加時mapkey爲timestamp
2、org.apache.hadoop.security.AccessControlException: Permission denied: user=flume, access=WRITE, inode="/flume":hdfs:supergroup:drwxr-xr-xr...
- 原因:
flume用戶沒有hdfs讀寫權限,查看hdfs目錄發現沒有/flume: -
解決辦法:
- 新建hdfs存儲目錄,如/flume (需要先su hdfs 否則沒有權限)
- 授權:用戶權限和讀寫權限
hadoop fs -chown -R flume:flume /flume
hadoop fs -chmod -R 777 /flume
3、Configuration must specify a spooling derectory
- 原因:
spoolDir=/data/... spoolDir區分大小寫