使用EMR-Flume同步HDFS audit日志到HDFS
1.前言
E-MapReduce從3.19.0版本開始對EMR-Flume提供叢集管理的功能。通過叢集管理功能,可以在Web頁面友善的配置和管理Flume Agent。
本文将使用EMR-Flume實時同步HDFS audit日志至HDFS,便于對HDFS操作記錄進行離線統計和實時分析。
2.部署方案
2.1方案一
在master執行個體啟動Flume agent,收集本地磁盤中的audit日志并sink到HDFS。
這個方案架構和配置比較簡單,但是master執行個體本身部署了比較重要且對資源占用比較敏感的服務,比如Zookeeper,在master執行個體中HDFS讀寫操作如果占用過多資源會對這些服務産生影響。
2.2方案二
選取core執行個體啟動Flume agent做sink HDFS的操作,在master執行個體啟動Flume agent,收集本地磁盤中的audit日志通過Avro協定發送資料至core執行個體。
使用這個方案時,考慮到core執行個體上Flume運作的穩定性,可以選取多個core執行個體構成failover sink processor。
本文以方案二對操作流程作說明。
3.操作流程
3.1準備工作
建立E-MapReduce Hadoop叢集,在可選服務中選擇Flume。具體操作可參考
建立叢集3.2 core執行個體配置并啟動Flume Agent
比如在emr-worker-1節點進行操作,選擇核心執行個體組進行配置,如下入所示

在配置頁面設定如下
default-agent.sinks.default-sink.type | hdfs |
---|---|
default-agent.channels.default-channel.type | file |
default-agent.sources.default-source.type | avro |
deploy_node_hostname | emr-worker-1 |
在配置頁面通過自定義配置添加如下配置:
default-agent.sinks.default-sink.hdfs.path | 對于高可用叢集,使用hdfs://emr-cluster/path形式的位址 |
---|---|
default-agent.sinks.default-sink.hdfs.fileType | DataStream |
default-agent.sinks.default-sink.hdfs.rollSize | |
default-agent.sinks.default-sink.hdfs.rollCount | |
default-agent.sinks.default-sink.hdfs.rollInterval | 86400 |
default-agent.sinks.default-sink.hdfs.batchSize | 51200 |
default-agent.sources.default-source.bind | 0.0.0.0 |
default-agent.sources.default-source.port | 根據實際設定 |
default-agent.channels.default-channel.transactionCapacity | |
default-agent.channels.default-channel.dataDirs | channel存儲event資料的路徑 |
default-agent.channels.default-channel.checkpointDir | 存儲checkpoint的路徑 |
default-agent.channels.default-channel.capacity | 根據hdfs roll進行設定 |
說明:為避免生成過多小檔案,通常以GB為機關生成HDFS檔案,或者按天生成一個檔案。此處按照時間來生成檔案,可根據實際情況進行設定.
儲存配置後啟動Flume agent
在檢視操作曆史裡顯示操作成功後,部署拓撲頁面可以看到emr-worker-1節點的flume已經是started狀态
emr-worker-1節點啟動成功後,開始啟動第二個worker節點。
同樣的方式,比如在worker-2節點啟動flume,修改配置項
節點的hostname | |
---|---|
儲存配置後,啟動 All Components,指定機器為emr-worker-2。
3.3 master執行個體配置并啟動Flume Agent
比如在emr-header-1節點進行操作,選擇服務配置
配置agent如下
additional_sinks | k1 |
---|---|
emr-header-1 | |
taildir | |
新增配置如下:
配置項 | 值 |
---|---|
default-agent.sources.default-source.filegroups | f1 |
default-agent.sources.default-source.filegroups.f1 | /mnt/disk1/log/hadoop-hdfs/hdfs-audit.log.* |
default-agent.sources.default-source.positionFile | 存儲position file的路徑 |
存儲event資料的路徑 | |
根據實際情況設定 | |
default-agent.sources.default-source.batchSize | 2000 |
default-agent.sources.default-source.ignoreRenameWhenMultiMatching | true |
default-agent.sinkgroups | g1 |
default-agent.sinkgroups.g1.sinks | default-sink k1 |
default-agent.sinkgroups.g1.processor.type | failover |
default-agent.sinkgroups.g1.processor.priority.default-sink | 10 |
default-agent.sinkgroups.g1.processor.priority.k1 | 5 |
default-agent.sinks.default-sink.hostname | emr-worker-1節點的IP |
default-agent.sinks.default-sink.port | emr-worker-1節點Flume Agent的port |
default-agent.sinks.k1.hostname | emr-worker-2節點的IP |
default-agent.sinks.k1.port | emr-worker-2節點Flume Agent的port |
default-agent.sinks.default-sink.batch-size | |
default-agent.sinks.k1.batch-size | |
default-agent.sinks.k1.type | |
default-agent.sinks.k1.channel | default-channel |
需要說明的是,Flume的taildir source在filegroups使用通配符比對log4j的滾動日志時會有資料重複的問題,通過對EMR-Flume配置ignoreRenameWhenMultiMatching可以避免這種問題。
儲存配置後,相同的方式指定機器為emr-header-1啟動flume。
如果需要在emr-header-2節點啟動Flume agent,隻需對配置作如下修改
3.4檢視同步結果
使用HDFS指令,可以看到同步的資料被寫入FlumeData.${timestamp}形式的檔案中,其中timestamp為檔案建立的時間戳