Flume探索筆記

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’);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章