Logstash6整合Hadoop

  • 2020 年 1 月 21 日
  • 筆記

前提

本文是之前elk的後續,故默認已搭建好logstash等elk相關環境。側重點是Hadoop安裝以及其與logstash的Output插件的整合。ELK的搭建可見:ELK實時日誌管理-系統搭建

假設存在兩台伺服器並處於同一區域網中,分別是192.168.0.79和192.168.0.80,系統均是CentOS7,且均已安裝Java 8。 – ELK系統已部署在192.168.0.79 – Hadoop將部署於192.168.0.80

原則Hadoop集群需要ssh免密登陸配置,以便操作節點的啟動與停止,這裡暫不涉及此方面需求,故捨去。相關的可在 官方文檔-Hadoop: Setting up a Single Node Cluster. 查看。

下載並解壓Hadoop

可從官方 Apache Download Mirrors獲取鏈接下載。本文下載的為Hadoop-2.8.5:

wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz

完成後解壓文件:

tar -zxvf hadoop-2.8.5.tar.gz

得到hadoop-2.8.5文件夾

配置

進入解壓後的hadoop-2.8.5文件夾:

cd hadoop-2.8.5

etc/hadoop/hadoop-env.sh

編輯etc/hadoop/hadoop-env.sh配置一些默認項,這裡主要是設置 JAVA_HOME,即填寫完整的 Java 安裝路徑。

vi etc/hadoop/hadoop-env.sh

注釋掉原來的

# export JAVA_HOME=${JAVA_HOME}

192.168.0.80的Java安裝目錄為/home/parim/apps/jdk1.8.0_181,故添加:

export JAVA_HOME=/home/parim/apps/jdk1.8.0_181

若是需要搭建Local (Standalone) Mode,通過如下命令啟動即可:

bin/hadoop

本文需要搭建Pseudo-Distributed Operation,故需要繼續配置其他文件。

etc/hadoop/core-site.xml

該文件中有兩個參數需要設置: 1. fs.defaultFS – 默認文件系統的名稱,埠號可自定義 2. hadoop.tmp.dir – 其他臨時目錄的根目錄 打開core-site.xml文件:

vi etc/hadoop/core-site.xml

拷貝以下所有行的內容放入到標籤 <configuration></configuration> 中間。

<property>      <name>fs.defaultFS</name>      <value>hdfs://192.168.0.80:54310</value>  </property>    <property>    <name>hadoop.tmp.dir</name>    <value>/home/parim/apps/hadoop-2.8.5/tmp-data</value>    <description>Parent directory for other temporary directories.</description>  </property>

fs.defaultFS

默認文件系統的名稱,本身是一個URL,其方案和許可權決定了FileSystem的實現。 – 此URL的方案(scheme )確定命名FileSystem 實現類的配置屬性(fs.SCHEME.impl)。 – 此URL的許可權(authority )用於確定文件系統的主機,埠等。 – fs.defaultFS是舊版本fs.default.name的代替,在新版中fs.default.name已被棄用。 參考core-default.xml#fs.defaultFS

hadoop.tmp.dir

hadoop.tmp.dir的目錄默認指向的是:/tmp/hadoop-${USERNAME}

這樣會有個問題,系統重啟時會自動刪除/tmp目錄下的文件,導致你之前對hadoop做的很多

操作都被刪除了,需要重新再來,比如你想hdfs導入的文件會都被刪除。

參考: 1. Hadoop安裝 2. hadoop修改hadoop.tmp.dir

etc/hadoop/hdfs-site.xml

這裡有兩個參數需要配置: 1. dfs.replication – 默認備份(塊複製,block replication)。創建文件時可以指定實際的備份數。如果未在創建時指定備份,則使用默認值。hdfs-default.xml#dfs.replication 2. dfs.datanode.hostname – datanode默認的hostname,這個不是必須的,因為這裡是兩台伺服器之間傳遞資訊,所以需要配置,否則會導致後面的讀寫操作異常。

打開hdfs-site.xml文件:

vi etc/hadoop/hdfs-site.xml

拷貝以下所有行的內容放入到標籤 <configuration></configuration> 中間。

    <property>          <name>dfs.replication</name>          <value>1</value>      </property>        <property>          <name> dfs.datanode.hostname</name>          <value>192.168.0.80</value>      </property>

啟動單節點偽分散式集群

以下為在本地運行一個MapReduce job的實現,由於不是必須運行在YARN上,故暫且沒配置與啟動YARN。

格式化HDFS

在第一使用 Hadoop 之前,需要先格式化 HDFS,使用下面的命令

bin/hdfs namenode -format

若有需要選擇的,輸入按提示Y即可。

啟動單節點集群

使用以下命令啟動cHadoop 的單節點集群(使用對應的用戶來啟動),如下:

sbin/start-dfs.sh

若該用戶之前設置了免密登錄,此處可免去多次輸入密碼的操作,反之則需要根據提示多次輸入登錄密碼。

檢測運行

可以使用 'jps' 工具/命令, 驗證是否所有 Hadoop 相關的進程正在運行。

/home/parim//apps/jdk1.8.0_181/bin/jps

如果 Hadoop 成功啟動,那麼 jps 輸出應顯示: NameNode, SecondaryNameNode, DataNode.

訪問

可通過web訪問NameNode,默認鏈接如下:

 http://localhost:50070/

創建HDFS目錄

創建執行 MapReduce jobs所需要的HDFS目錄:

 bin/hdfs dfs -mkdir /user   # bin/hdfs dfs -mkdir /user/<username>,username即啟動Hadoop的用戶名,這裡假設為parim   bin/hdfs dfs -mkdir /user/parim

測試

  1. 將Hadoop的logs文件夾中的文件複製到分散式文件系統中:
bin/hdfs dfs -put logs logstash

默認會在HDFS中的/user/parim下創建logstash文件夾並向其寫入logs中的文件,若未執行上面創建目錄操作,會報無法找到/user/parim的錯誤。

  1. 查看分散式文件系統上logstash中的文件:
 bin/hdfs dfs -cat logstash/*

停止/關閉 Hadoop

當需要停止時可執行如下命令

sbin/stop-dfs.sh

如果用戶不是ssh免密碼登錄,此時需要再多次輸入登錄密碼

Logstash輸出到Hadoop

上面是Hadoop安裝到操作的基本流程,接下來轉到192.168.0.79配置Logstash到Hadoop的輸出。

Logstash6的Output plugins有webhdfs,其作用是使用webhdfs REST API將Logstash事件發送到HDFS。

默認Logstash啟動配置文件為01-logstash-initial.conf,進入Logstash安裝目錄並打開文件:

vi config/01-logstash-initial.conf

在output部分追加如下內容:

webhdfs {      # hdfs的namenode地址      host => "192.168.0.80"      # Hadoop的webhdfs使用的埠      port => 50070      # hadoop運行的用戶,以這個用戶的許可權去寫入hdfs      user => "parim"      # 按年月日建log文件      path => "/user/parim/logstash-data/logstash-%{+YYYY}-%{+MM}-%{+dd}.log"      codec => "json"      flush_size => 5000      idle_flush_time => 5      retry_interval => 3  }

保存後,重啟Logstash即可。

放行埠

為了Logstash與Hadoop通訊, 192.168.0.80的Hadoop默認配置下,需要放行埠50070和50075,此處是基於firewall防火牆下的命令:

sudo firewall-cmd --zone=public --add-port=50070/tcp --permanent  sudo firewall-cmd --zone=public --add-port=50075/tcp --permanent  sudo firewall-cmd --reload

訪問http://192.168.0.80:50070可見如下,當看到logstash-data文件夾時,說明整合成功:

進入logstash-data下載裡面的log文件,打開可見類似記錄:

{"source":"/home/parim/apps/nginx-1.10/logs/access.log","@version":"1","learner_type":"exam","tags":["beats_input_codec_plain_applied"],"type":"logs","offset":1656526468,"beat":{"version":"6.4.0","hostname":"dev.windcoder.com","name":"dev.windcoder.com"},"@timestamp":"2018-09-29T01:45:53.093Z","input":{"type":"log"},"prospector":{"type":"log"},"read_timestamp":"2018-09-29T01:45:53.093Z","nginx":{"access":{"client_ip":"192.168.0.221","method":"GET","body_sent":{"bytes":"0"},"referer":"http://sd.windcoder.com/learner/course/detail/1423705","x_forwarded":"121.69.9.234","msec":"[1538185552.664]","user_name":"-","cookie_sid":"-","time_iso8601":"2018-09-29T09:45:52+08:00","url":"/api/learner/exam/myExam/examList","user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36","http_version":"1.0","response_code":"302"}},"host":{"name":"dev.windcoder.com"}}

Hadoop與Java版本

Hadoop

Java

2.7及以後版本

Java 7 +

2.6及以前版本

Java 6 +

HadoopJavaVersions