1.flume模型
1.1 Event
flume 事件,被定義爲一個具有有效荷載的字節數據流和可選的字符串屬性集。
1.2 Agent
flume 代理,是一個進程承載從外部源事件流到下一個目的地的過程。包含source channel 和 sink。
1.3 Source
數據源,消耗外部傳遞給他的事件,外部源將數據按照flume Source 能識別的格式將Flume 事件發送給flume Source。
1.4 Channel
數據通道,是一個被動的存儲,用來保持事件,直到由一個flume Sink消耗。
1.5 Sink
數據匯聚點,代表外部數據存放位置。發送flume event到指定的外部目標。
2.flume 配置文件
2.1 配置文件例子如下
# example.conf 單節點flume配置
# 命名Agent a1的組件 (這是一個給組件起名的過程)
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 描述/配置source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = 文件路徑和數據源名稱
a1.sources.r1.fileHeader = true
#描述sink 設置kafka接收器 也就是接受到哪裏去
a1.sinks.s1.type=hive
a1.sinks.s1.hive.metastore=thrift://服務器ip:端口
a1.sinks.s1.hive.database=hive數據庫名稱
a1.sinks.s1.hive.table=hive表名
a1.sinks.s1.batchSize=3000
a1.sinks.s1.serializer=JSON
a1.sinks.s1.serializer.fieldnames=business_id,type,create_time
#描述channels 設置接收器 用什麼傳遞,這裏可以默認用內存,也可以配合用kafka 還很多方式,可以多選一
#kafka
a1.channels.c1.type=org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers=地址ip:kafka端口
a1.channels.c1.kafka.topic=設置topic
a1.channels.c1.kafka.consumer.group.id=1
#內存
#a1.channels.c1.type=memory
#a1.channels.c1.capacity=10000
#a1.channels.c1.transactionCapacity=10000
說明:
1.source主要有四種: NetCat 、Avro 、Exec 、 Spooling Directory
1.1.NetCat Source : 綁定端口(Tcp、Udp),將流經端口的每個文本行數據作爲Event輸入
- type:類型,必須是netcat
- bind:要監聽的(本機的)主機名或者ip。此監聽不是過濾發送方。一臺電腦不是說只有一個IP。有多網卡的電腦,對應多個IP
- port:綁定的本地端口
#####1.2.Avro Source:監聽一個Avro服務端口。採集Avro數據序列化後的數據 - type:類型,必須是avro。
- bind:要監聽的(本機的)主機名或者ip。此監聽不是過濾發送方。一臺電腦不是說只有一個IP。有多網卡的電腦,對應多個IP。
- port:綁定的本地的端口。
#####1.3.Exec Source: 於Unix的command在標準輸出上採集數據 - type:source的類型:必須是exec。
- command:要執行命令。
#####1.4.Spooling Directory Source :監聽一個文件夾裏的文件新增,如果有則採集作爲source - type:類型:必須是spooldir
- spoolDir:監聽的文件夾 【提前創建目錄】
- fileSuffix:上傳完畢後文件的重命名後綴,默認爲.COMPLETED
- deletePolicy:上傳後的文件的刪除策略never和immediate,默認爲never。
- fileHeader:是否要加上該文件的絕對路徑在header裏,默認是false。
- basenameHeader:是否要加上該文件的名稱在header裏,默認是false。
2.sink主要記錄兩個 HDFS 和 Hive
2.1 HDFS Sink : 將數據傳輸到hdfs集羣
- type : sink的類型。必須寫hdfs
- hdfs.path : hdfs的上傳路徑
- hdfs.filePrefix:hdfs文件的前綴。默認是:FlumeData
- hdfs.rollInterval:間隔多久產生新文件,默認是:30(秒) 0表示不以時間間隔爲準。
- hdfs.rollSize:文件到達多大再產生一個新文件,默認是:1024(bytes)0表示不以文件大小爲準。
- hdfs.rollCount:event達到多大再產生一個新文件,默認是:10(個)0表示不以event數目爲準。
- hdfs.batchSize:每次往hdfs裏提交多少個event,默認爲100
- hdfs.fileType:hdfs文件的格式主要包括:SequenceFile, DataStream ,CompressedStream,如果使用了CompressedStream就要設置壓縮方式。
- hdfs.codeC:壓縮方式:gzip, bzip2, lzo, lzop, snappy
注:%{host}可以使用header的key。以及%Y%m%d來表示時間,但關於時間的表示需要在header裏有timestamp這個key。
2.2 Hive Sink : 將數據直接整hive裏去
- type : 類型,必須寫hive
- hive.metastore:元數據存儲位置
- hive.database:數據庫名稱
- hive.table:表名
- batchSize:再將文件刷新到HDFS之前寫入文件的事件數
- serializer :序列化格式
- mserializer.fieldnames:可以理解爲列名,以逗號隔開即可
3.channel :通道 主要寫三種Memory、File、KafkaChannel
3.1 Memory Channel
- type :類型 必須是memory
- capacity : channel中最大event的數
- transactionCapacity:channel中允許事務的最大event數目
3.2 File Channel
- Type channel的類型:必須爲 file
- checkpointDir:檢查點的數據存儲目錄【提前創建目錄】
- dataDirs:數據的存儲目錄【提前創建目錄】
- transactionCapacity:channel中允許事務的最大event數目
3.3 Kafka Channel
- type:org.apache.flume.channel.kafka.KafkaChannel
- 組件名.channels.c1.kafka.bootstrap.servers=服務器ip:kafka端口(默認9092)
- 組件名.channels.c1.kafka.topic=定義主題
- 組件名.channels.c1.kafka.consumer.group.id=id號
文件配置好之後就要準備使用flume傳日誌內容到hive去了
3.執行啓動
bin目錄下執行
./flume-ng agent 指令 這裏簡單說一下參數和選項
命令:
參數 | 描述 |
---|---|
help | 打印幫助信息 |
agent | 運行一個Flume Agent |
avro-client | 運行一個Avro Flume 客戶端 |
version | 顯示Flume版本 |
全局選項:
參數 | 描述 |
---|---|
–conf-file,-f | 指定配置文件,這個配置文件必須在全局選項的–conf參數定義的目錄下。(必填) |
–name,-n | Agent的名稱(必填) |
–help,-h | 幫助 |
Avro客戶端選項:
參數 | 描述 |
---|---|
–rpcProps,-P | 連接參數的配置文件 |
–host,-H | Event所要發送到的Hostname |
–port,-p | Avro Source的端口 |
–dirname |
Avro Source流到達的目錄 |
–filename,-F | Avro Source流到達的文件名 |
–headerFile,-R | 設置一個JAVA -X的選項 |
啓動Avro客戶端要麼指定–rpcProps,要麼指定–host和–port。
舉個栗子:
./flume-ng agent --conf …/conf/ --conf-file …/conf/xcx_dir_hive.conf --name xcx -Dflume.root.logger=INFO,console &
首先是客戶端,啓動一個agent, 然後–conf選擇配置文件的路徑, --conf-file選擇具體的配置文件。 --name是必要的!要給Agent起名! 最後在控制檯輸出~
#已經踩過的坑!!!注意事項
- 1.首先,flume是一直執行的,如果想要執行啓動同名的Agent,請先kill掉之前的flume進程,同時,Spooling Directory Source源的情況下,源文件會被修改後綴,一定要在關閉flume之後去修改名字。否則會報錯。
- 2.如果hive中沒有數據庫,同時沒有表,那麼執行Agent將會幫我們創建數據庫和表,但是!如果我們已經有數據庫了,flume是不會幫我們創建表的,還會持續不斷的報錯!!!非常煩人!有的同學們表示,刪除數據庫之後再次執行還是會報錯,是因爲我們要通過dfs去刪除相關hive庫的信息。
- 3.手動建表的話,需要明確一點!可以採用直接建表法,但是一定要加上事務!否則會報錯
例如: create table 表名(user_id int,user_name string) clustered by (user_id) into 2 buckets stored as orc tblproperties(‘transactional’=‘true’);