某業(yè)務招致NameNode RPC通訊頻繁,后來察看監(jiān)控發(fā)現(xiàn),是由于該業(yè)務獲取HDFS列表文件的頻率過于頻繁。檢查代碼后,優(yōu)化由20s獲取一次目錄列表改為5分鐘獲取一次,獲取列表的RPC操作次數(shù)降落了約1.5倍,均勻每秒減少了2~3w次的RPC操作。
還有很多業(yè)務場景,經(jīng)過剖析察看RPC畫像,都發(fā)現(xiàn)了其不合理性,這里就不逐個羅列了。本文主要記載如何經(jīng)過ELK快速剖析NameNode RPC操作并對接Grafana展現(xiàn)。
經(jīng)過ELK快速剖析NameNode RPC操作
ELK是當前比擬主流的散布式日志搜集處置工具。這里采用Filebeat→Kafka集群→Logstash→ES→Kibana。
1)Filebeat是基于原先logstash-forwarder的源碼改造出來的。換句話說:Filebeat就是新版的logstash-forwarder,也會是Elastic Stack在shipper端的第一選擇。
2)小貼士:固然LogStash::Inputs::TCP用Ruby的Socket和OpenSSL庫完成了高級的SSL功用,但Logstash自身只能在SizedQueue中緩存20個事情。這就是我們倡議在消費環(huán)境中換用其他音訊隊列的緣由。
而Redis效勞器是Logstash官方引薦的Broker選擇,Broker角色也就意味著會同時存在輸入和輸出兩個插件。
Kafka是一個高吞吐量的散布式發(fā)布訂閱日志效勞,具有高可用、高性能、散布式、高擴展、耐久性等特性。目前曾經(jīng)在各大公司中普遍運用。和之前采用Redis做輕量級音訊隊列不同,Kafka應用磁盤作隊列,所以也就無所謂音訊緩沖時的磁盤詰題。此外,假如公司內(nèi)部已有Kafka效勞在運轉(zhuǎn),Logstash也能夠快速接入,免去反復建立的費事。
3)目前Logstash1.5版本已自帶支持Kafka插件,所以只需求學會如何書寫Logstash規(guī)則,并且Kafka消費運用high-level消費。
4)Filebeat部署在應用效勞器上(只擔任Logstash的讀取和轉(zhuǎn)發(fā),降低CPU負載耗費,確保不會搶占應用資源),Logstash、ES、Kibana在一臺效勞器上(此處的Logstash擔任日志的過濾,會耗費一定的CPU負載,能夠思索如何優(yōu)化過濾的語法步驟來到達降低負載)。
詳細搭建步驟:Filebeat裝置運用(考慮后決議Filebeat運用Zip裝置或者tar.gz便當修正配置打包分發(fā)。)→Logstash插件配置。
以下是架構(gòu)圖:
1、Filebeat采集hdfs-audit.log日志傳輸給Kafka或者Logstash
[hadoop@lf319-m3-002 filebeat]$ vi dynamically.config/audit-logstash.yml
filebeat.prospectors:
- input_type: log
paths:
- "/var/log/hadoop-hdfs/hdfs-audit.log"
harvester_buffer_size: 32768
scan_frequency: 1s
backoff: 10ms
#backoff <= max_backoff <= scan_frequency
processors:
- drop_fields:
fields: ["beat", "beat.name", "beat.hostname","beat.version","input_type","offset","@timestamp","type","source"]
output.logstash:
hosts: ["logstash-host:5044"," logstash-host:5045"]
loadbalance: true
worker: 4
bulk_max_size: 4096
#output.console:
# pretty: true
xpack.monitoring:
enabled: true
elasticsearch:
hosts: ["https://es-host1:9200", "https:// es-host2:9200"]
username: beats_system
password: beat@123
2、Logstash進一步合成日志,格式化日志數(shù)據(jù)
這里需求我們先查看下日志的格式,然后選擇便當?shù)娜罩靖袷交绞絹斫馕鋈罩尽?/p>
2019-08-25 13:11:58,630 INFO FSNamesystem.audit: allowed=trueugi=lf_zh_pro (auth:SIMPLE)ip=/dn-ipcmd=getfileinfosrc=/user/lf_zh_pro/test/CommonFilter/sync/biz_id=B43/day_id=20190825/prov_id=089/part-00019-1566675749932.gzdst=perm=proto=rpc
2019-08-25 13:11:58,630 INFO FSNamesystem.audit: allowed=trueugi=lf_xl_bp (auth:SIMPLE)ip=/dn-ipcmd=createsrc=/user/lf_xl_bp/lf_xl_src.db/src_d_trip_all/date_id=20190825/hour_id=13/minute_id=00/.hive-staging_hive_2019-08-25_13-10-18_301_9180087219965934496-1/_task_tmp.-ext-10002/prov_id=031/_tmp.000238_0dst=perm=lf_xl_bp:lf_xl_bp:rw-rw-r--proto=rpc
2019-08-25 13:11:58,630 INFO FSNamesystem.audit: allowed=trueugi=ubd_obx_test (auth:SIMPLE)ip=/ dn-ipcmd=rename
經(jīng)過察看能夠發(fā)現(xiàn)上面的每條日志格式都是分歧的,都由時間戳、日志級別、能否開啟審計、用戶、來源IP、命令類型這幾個字段組成。那么相較于grok來說dissect愈加簡明。
Dissect的運用規(guī)則:https://www.elastic.co/guide/en/logstash/current/plugins-filters-dissect.html
Logstash配置如下:
input {
beats {
port => "5045"
}
}
filter {
if "/user/if_ia_pro/output/test" in [message] {
dissect {
mapping => { "message" => "%{logd} %{drop} %{level} %{log-type}: %{?allowed}=%{&allowed}%{?ugi}=%{&ugi} (%{?authtype})%{?ip}=/%{&ip}%{?cmd}=%{&cmd}%{}=/user/if_ia_pro/output/test/%{src2}/%{src3}/%{}%{?dst}=%{&dst}%{?perm}=%{&perm}%{?proto}=%{&proto}" }
add_field => {
"srctable" => "/user/if_ia_pro/output/test/%{src2}/%{src3}"
"logdate" => "%{logd} %{drop}"
}
remove_field => ['message','src2','src3','logd','drop']
}
}
else if "/user/lf_zh_pro/lf_safedata_pro/output/" in [message] {
dissect {
mapping => { "message" => "%{logd} %{drop} %{level} %{log-type}: %{?allowed}=%{&allowed}%{?ugi}=%{&ugi} (%{?authtype})%{?ip}=/%{&ip}%{?cmd}=%{&cmd}%{}=/user/lf_zh_pro/lf_safedata_pro/output/%{src2}/%{}%{?dst}=%{&dst}%{?perm}=%{&perm}%{?proto}=%{&proto}" }
add_field => {
"srctable" => "/user/lf_zh_pro/lf_safedata_pro/output/%{src2}"
"logdate" => "%{logd} %{drop}"
}
remove_field => ['message','src2','drop']
}
}
else if "/files/" in [message] {
dissect {
mapping => { "message" => "%{logd} %{drop} %{level} %{log-type}: %{?allowed}=%{&allowed}%{?ugi}=%{&ugi} (%{?authtype})%{?ip}=/%{&ip}%{?cmd}=%{&cmd}%{}=/files/%{src2}/%{}%{?dst}=%{&dst}%{?perm}=%{&perm}%{?proto}=%{&proto}" }
add_field => {
"srctable" => "/files/%{src2}"
"logdate" => "%{logd} %{drop}"
}
remove_field => ['message','src2','drop']
}
}
else {
dissect {
mapping => { "message" => "%{logd} %{drop} %{level} %{log-type}: %{?allowed}=%{&allowed}%{?ugi}=%{&ugi} (%{?authtype})%{?ip}=/%{&ip}%{?cmd}=%{&cmd}%{}=/%{src}/%{src1}/%{src2}/%{src3}/%{}%{?dst}=%{&dst}%{?perm}=%{&perm}%{?proto}=%{&proto}" }
add_field => {
"srctable" => "/%{src}/%{src1}/%{src2}/%{src3}"
"logdate" => "%{logd} %{drop}"
}
remove_field => ['message','src','src1','src2','src3','logd','drop']
}
}
date {
match => [ "logdate","ISO8601" ]
target => "@times"
remove_field => ['logdate']
}
}
output {
elasticsearch {
hosts => ["es-host:9200"]
index => "logstash-hdfs-auit-%{+YYYY.MM.dd}"
user => "elastic"
password => "password"
}
stdout { }
}
3、ES上察看數(shù)據(jù)
Filebeat和Logstash配置好采集剖析hdfs-audit.log之后啟動進程,到ES上察看會發(fā)現(xiàn)創(chuàng)立有l(wèi)ogstash-hdfs-auit- YYYY.MM.dd的index。
詳細查看數(shù)據(jù),能夠看到曾經(jīng)具備多個需求運用到的字段。
Grafana配置NameNode RPC操作
最后一步就需求在Grafana上配置銜接ES數(shù)據(jù)庫。
然后創(chuàng)立Dashboard依次配置以下幾種查詢展現(xiàn):
1)集群整體RPC每分鐘銜接次數(shù)
2)HDFS途徑All下All類型每分鐘操作計數(shù)
3)All類型操作計數(shù)最多的hdfs途徑
4)途徑All下操作計數(shù)排行前五的類型 和All操作類型下操作計數(shù)前五的途徑
那么如今關(guān)于企業(yè)來說,不論是在物理機上還是云上,玩本人的大數(shù)據(jù)平臺跑消費任務,就不可防止會有不夠合理不夠優(yōu)化的任務,比方最簡單的集群對拷任務呈現(xiàn)異常中綴時,我們通常會掛定時任務并對hadoop distcp添加-update參數(shù),停止比照更新掩蓋,這時當定時吊起的過于頻繁,就會發(fā)現(xiàn)當對拷目錄下文件數(shù)越來越多,NameNode對該目錄的listStatus類型的RPC銜接會激增,這時我們就需求優(yōu)化對拷任務。
RPC的監(jiān)控只是監(jiān)控大數(shù)據(jù)平臺的一個指標,這里經(jīng)過這篇文章,帶大家理解下如何快速地采集剖析平臺日志,并停止展現(xiàn)監(jiān)控。