Flume之HDFS Sink 的参数解析及异常处理
生活随笔
收集整理的這篇文章主要介紹了
Flume之HDFS Sink 的参数解析及异常处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、配置詳解
typeSink類型為hdfshdfs.pathHDFS存儲路徑,支持按照時間分區集群的NameNode名字:單節點:hdfs://主機名(ip):9000/%Y/%m/%d/%HHA集群:hdfs://nameservice(高可用NameNode服務名稱)/%Y/%m/%d/%Hhdfs.filePrefix默認值:FlumeDataEvent輸出到HDFS的文件名前綴hdfs.fileSuffixEvent輸出到HDFS的文件名后綴hdfs.inUsePrefix臨時文件的文件名前綴Flume首先將Event輸出到HDFS指定目錄的臨時文件中,再根據相關規則重命名為目標文件hdfs.inUseSuffix默認值:.tmp臨時文件名后綴hdfs.rollInterval默認值:30間隔多久將臨時文件滾動成最終目標文件,單位:秒如果設置為0,則表示不根據時間滾動文件注:滾動(roll)指的是,HDFS Sink將臨時文件重命名成最終目標文件,并新打開一個臨時文件來寫數據hdfs.rollSize默認值:1024當臨時文件達到該大小時,滾動成目標文件,單位:byte該值設置為0,則表示文件不根據文件大小滾動生成hdfs.rollCount默認值:10當Event數據達到該數量時,將臨時文件滾動生成目標文件該值設置為0,則表示文件不根據Event數滾動生成hdfs.idleTimeout默認值:0當目前被打開的臨時文件在該參數指定的時間內,沒有任何數據寫入,則將該臨時文件關閉并重命名成目標文件,單位:秒該值設置為0,則表示禁用此功能,不自動關閉臨時文件hdfs.round默認值:false用于HDFS文件按照時間分區,時間戳向下取整hdfs.roundValue默認值:1當round設置為true,配合roundUnit時間單位一起使用,例如roundUnit值為minute該值設置為1則表示一分鐘之內的數據寫到一個文件中,相當于每一分鐘生成一個文件hdfs.roundUnit默認值:second按時間分區使用的時間單位,可以選擇second(秒)、minute(分鐘)、hour(小時)三種粒度的時間單位示例:a1.sinks.k1.hdfs.path = hdfs://nameservice/flume/events/%y/%m/%d/%H/%Ma1.sinks.k1.hdfs.round = truea1.sinks.k1.hdfs.roundValue = 10a1.sinks.k1.hdfs.roundUnit = minute當時間為2022-04-05 17:38:59時候,hdfs.path依然會被解析為:/flume/events/2022/04/05/17/30因為設置的是舍棄10分鐘內的時間,因此,該目錄每10分鐘新生成一個hdfs.batchSize默認值:100每個批次刷寫到HDFS的Event數量hdfs.codeC默認值:不采用壓縮文件壓縮格式,目前支持的壓縮格式有gzip、bzip2、lzo、lzop、snappyhdfs.fileType默認值:SequenceFile文件類型,包括:SequenceFile、DataStream、CompressedStream該值設置為DataStream,則輸出的文件不會進行壓縮,不需要設置hdfs.codeC指定壓縮格式。該值設置為CompressedStream,則對輸出的文件進行壓縮,需要設置hdfs.codeC指定壓縮格式hdfs.maxOpenFiles默認值:5000最大允許打開的HDFS文件數,當打開的文件數達到該值,則最早打開的文件將會被關閉hdfs.minBlockReplicas默認值:HDFS副本數寫入HDFS文件塊的最小副本數該參數會影響文件的滾動配置,一般將該參數配置成1,才可以按照配置正確滾動文件hdfs.writeFormat默認值:Writable文件的格式,目前可以選擇Text或者Writable兩種格式hdfs.callTimeout默認值:10000操作HDFS文件的超時時間,如果需要寫入HDFS文件的Event數比較大或者發生了打開、寫入、刷新、關閉文件超時的問題,可以根據實際情況適當增大超時時間,單位:毫秒hdfs.threadsPoolSize默認值:10每個HDFS Sink執行HDFS IO操作打開的線程數hdfs.rollTimerPoolSize默認值:1HDFS Sink根據時間滾動生成文件時啟動的線程數hdfs.timeZone默認值:Local Time本地時間寫入HDFS文件使用的時區hdfs.useLocalTimeStamp默認值:false是否使用本地時間替換Event頭信息中的時間戳hdfs.closeTries默認值:0在發起關閉嘗試后,嘗試重命名臨時文件的次數如果設置為1,表示重命名一次失敗后不再繼續嘗試重命名操作,此時待處理的文件將處于打開狀態,擴展名為.tmp如果設置為0,表示嘗試重命名操作次數不受限制,直到文件最終被重命名成功如果close調用失敗,文件可能仍然會處于打開狀態,但是文件中的數據將保持完整,文件會在Flume重啟后關閉hdfs.retryInterval默認值:180 秒連續嘗試關閉文件的時間間隔。如果設置為0或小于0的數,第一次嘗試關閉文件失敗后將不會繼續嘗試關閉文件,文件將保持打開狀態或者以“.tmp”擴展名結尾的臨時文件如果設置為0,表示不嘗試,相當于于將hdfs.closeTries設置成1serializer默認值:TEXT序列化方式,可選值有TEXT、avro_event或者實現EventSerializer.Builder接口的類kerberosPrincipalHDFS安全認證kerberos配置kerberosKeytabHDFS安全認證kerberos配置proxyUser代理用戶二、簡單模板
agent_name.sources = source_name agent_name.channels = channel_name agent_name.sinks = sink_name# source agent_name.sources.source_name.type = avro XXX XXX# channel agent_name.channels.channel_name.type = file XXX XXX# sink agent_name.sinks.sink_name.type = hdfs agent_name.sinks.sink_name.hdfs.path = hdfs://${HA_NameNode_Name}/flume_data/yr=%Y/mon=%m/day=%d/hr=%H agent_name.sinks.sink_name.hdfs.writeFormat = Text agent_name.sinks.sink_name.hdfs.fileSuffix = _${hdfsFileSuffix}.log agent_name.sinks.sink_name.hdfs.fileType = DataStream agent_name.sinks.sink_name.hdfs.filePrefix = %Y%m%d%H%M agent_name.sinks.sink_name.hdfs.useLocalTimeStamp = true agent_name.sinks.sink_name.hdfs.rollInterval = 0 agent_name.sinks.sink_name.hdfs.rollSize = 125829120 agent_name.sinks.sink_name.hdfs.rollCount = 0 agent_name.sinks.sink_name.hdfs.minBlockReplicas = 1 agent_name.sinks.sink_name.hdfs.round = true agent_name.sinks.sink_name.hdfs.roundValue = 1 agent_name.sinks.sink_name.hdfs.roundUnit = hour agent_name.sinks.sink_name.hdfs.idleTimeout = 600# source | channel | sink 關聯 agent_name.sources.source_name.channels = channel_name agent_name.sinks.sink_name.channel = channel_name三、注意事項及異常
idleTimeout 的設置
-
設置為0,如果flume程序突然宕機,就會導致 hdfs上的 .tmp后綴的文件無法會更改為完成的文件,造成一種假象,以為該文件正在寫入。當程序重啟時,就會有兩個 .tmp文件。
-
如果idle Timeout有設置值m,當在m秒內沒有數據寫入,就會把tmp文件改為已完成。后面再有數據過來的時候重新生成.tmp文件。
-
建議:最好設置一個比較大的值,防止小文件產生,若不設置,宕機的話會有tmp文件
-
為了能快速查看到數據,可以設置該值較小,沒數據進行就滾動,因為臨時文件是不能被Hive查詢到,但是這樣會產生小文件
round 與 rollInterval 理解有誤
-
round、roundValue、roundUnit是基于路徑path去滾動生成文件夾的,針對文件夾而言
-
rollInterval、rollSize、rollCount是基于文件的條件限制滾動生成文件的,基于文件而言的
異常:Error while trying to hflushOrSync
- 問題排查:通過查看不同Flume的Agent日志發現,同名的文件被不同的Flume Agent打開,在文件第二次打開后,先前打開的Agent擁有的token就失效了,因此無法關閉它,就會不斷的報錯:Error while trying to hflushOrSync!
- 查看之前的flume配置文件發現,每一個Flume-Agent配置的hdfsSink是完全一樣的,每個Flume-Agent讀取的source相同,有很大概率會出現多個Fume-Agent同時寫同名文件,導致部分Flume-Agent無法繼續。
- 解決方案:不同Flume設置不同的文件后綴名
總結
以上是生活随笔為你收集整理的Flume之HDFS Sink 的参数解析及异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙协议栈HCI EIR(EXTENDE
- 下一篇: Atom处理器喜迎周岁生日 主频达2GH