• <nav id="dstbx"></nav>

    <nav id="dstbx"></nav>
    1. <form id="dstbx"></form>
    2. <small id="dstbx"></small>

      教育行業A股IPO第一股(股票代碼 003032)

      全國咨詢/投訴熱線:400-618-4000

      Shell怎樣實現定時日志數據采集?【案例展示】

      更新時間:2021年07月16日16時01分 來源:傳智教育 瀏覽次數:

      好口碑IT培訓

      服務器每天會產生大量日志數據,并且日志文件可能存在于每個應用程序指定的data目錄中,在不使用其它工具的情況下,將服務器中的日志文件規范的存放在HDFS中。通過編寫簡單的shell腳本,用于每天自動采集服務器上的日志文件,并將海量的日志上傳至HDFS中。由于文件上傳時會消耗大量的服務器資源,為了減輕服務器的壓力,可以避開高峰期,通常會在凌晨進行上傳文件的操作。下面按照步驟實現Shell定時日志采集功能。

      1.配置環境變量

      首先在/export/data/logs目錄下(如果目錄不存在,則需要提前創建)使用vi命令創建upload2HDFS.sh腳本文件,在編寫Shell腳本時,需要設置Java環境變量,即使我們當前虛擬機節點已經配置了Java環境變量,這樣做是用來提高系統的可靠性,保障運行程序的機器在沒有配置環境變量的情況下依然能夠運行腳本。代碼如下所示:

      export JAVA_HOME=/export/servers/jdk
      
      export JRE_HOME=${JAVA_HOME}/jre
      
      export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
      
      export PATH=${JAVA_HOME}/bin:$PATH

      在配置完Java環境變量之后還需要配置Hadoop的環境變量,代碼如下所示:

      export HADOOP_HOME=/export/servers/hadoop-2.7.4/
      
      export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

      2.準備日志存放目錄和待上傳文件

      為了讓開發者便于控制上傳文件的流程,可以在腳本中設置一個日志存放目錄和待上傳文件目錄,若上傳過程中發生錯誤只需要查看該目錄就能知道文件的上傳進度。添加相應代碼如下所示:

      #日志文件存放的目錄

      log_src_dir=/export/data/logs/log/

      #待上傳文件存放的目錄

      log_toupload_dir=/export/data/logs/toupload/

      為了保證后續腳本文件能夠正常執行,還需要在啟動腳本前手動創建好這兩個目錄。

      3.設置日志文件上傳的路徑

      設置上傳的HDFS目標路徑,命名格式以時間結尾,并且輸出打印信息。添加代碼如下所示:

      #設置日期

      date1=`date -d last-day +%Y_%m_%d`

      #日志文件上傳到hdfs的根路徑

      hdfs_root_dir=/data/clickLog/$date1/

      #打印環境變量信息

      echo "envs: hadoop_home: $HADOOP_HOME"

      #讀取日志文件的目錄,判斷是否有需要上傳的文件

      echo "log_src_dir:"$log_src_dir

      4.實現文件上傳

      上傳文件的過程就是遍歷文件目錄的過程,將文件首先移動到待上傳目錄,再從待上傳目錄中上傳到HDFS中。添加代碼如下所示:

      ls $log_src_dir | while read fileName
      
      do
      
      if [[ "$fileName" == access.log.* ]]; then
      
      date=`date +%Y_%m_%d_%H_%M_%S
      
      \#將文件移動到待上傳目錄并重命名
      
      echo "moving $log_src_dir$fileName to 
      
      $log_toupload_dir"xxxxx_click_log_$fileName"$date"
      
      mv $log_src_dir$fileName 
      
      $log_toupload_dir"xxxxx_click_log_$fileName"$date
      
      \#將待上傳的文件path寫入一個列表文件willDoing,
      
      echo $log_toupload_dir"xxxxx_click_log_$fileName"$date >> 
      
      $log_toupload_dir"willDoing."$date
      
      fi
      
      done

      最后將文件從待上傳目錄傳至HDFS中,具體代碼如下所示:

      #找到列表文件willDoing
      
      ls $log_toupload_dir | grep will |grep -v "_COPY_" | grep -v "_DONE_" | while 
      
      read line
      
      do
      
        \#打印信息
      
        echo "toupload is in file:"$line
      
        \#將待上傳文件列表willDoing改名為willDoing_COPY_
      
        mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
      
        \#讀列表文件willDoing_COPY_的內容(一個一個的待上傳文件名)
      
        \#此處的line 就是列表中的一個待上傳文件的path
      
        cat $log_toupload_dir$line"_COPY_" |while read line
      
        do
      
          \#打印信息
      
          echo "puting...$line to hdfs path.....$hdfs_root_dir"
      
          hadoop fs -mkdir -p $hdfs_root_dir
      
          hadoop fs -put $line $hdfs_root_dir
      
        done  
      
        mv $log_toupload_dir$line"_COPY_" $log_toupload_dir$line"_DONE_"
      
      done

      如果在每天12點凌晨執行一次,我們可以使用Linux Crontab表達式執行定時任務。

      0 0 * * * /shell/upload2HDFS.sh

      上述crontab表達式是由6個參數決定,分別為分、時、日、月、周、命令組成,其中/shell/upload2HDFS.sh為shell腳本的絕對路徑。由于crontab表達式并非本書重點,若想要深入學習的讀者可以自行查閱資料學習。

      5.執行程序展示運行結果

      一般日志文件產生是由業務決定,例如每小時滾動一次或者日志文件大小達到1G時,就滾動一次,產生新的日志文件。為了避免每個日志文件過大導致上傳效率低,可以采取在滾動后的文件名后添加一個標識的策略,例如access.log.x,x就是文件標識,它可以為序號、日期等自定義名稱,該標識用于表示日志文件滾動過一次,滾動后的文件,新產生的數據將不再寫入該文件中,當滿足業務需求時,則文件可以被移動到待上傳目錄,如圖1所示。

      圖1 滾動日志文件

      從圖1可以看出,為了模擬生產環境,在日志存放目錄/export/data/logs/log/中,手動創建日志文件,access.log表示正在源源不斷的產生日志的文件,access.log.1、access.log.2等表示已經滾動完畢的日志文件,即為待上傳日志文件。

      在upload2HDFS.sh文件路徑下使用“sh upload2HDFS.sh”指令執行程序腳本,打印執行流程,如圖2所示。

      圖2 運行腳本

      從圖2可以看出,首先將日志存放目錄log中的日志文件移動到待上傳toupload目錄下,并根據業務需求重命名,然后腳本自動執行“hadoop put”上傳命令,將待上傳目錄下的所有日志文件上傳至HDFS中。通過HDFS Web界面可以看到,需要采集的日志文件已經按照日期分類,上傳到HDFS中,如圖3所示。

      圖3 日志采集文件

      小提示:

      Shell腳本語言并本章節的重點,讀者只需要掌握本節案例的業務和思想,以及可以讀懂簡單的Shell腳本語言即可。





      猜你喜歡:

      什么是HDFS Shell?HDFS常用命令操作演示

      怎樣使用Spark Shell來讀取HDFS文件?

      shell 腳本如何進行調試?這些命令你知道嗎?

      傳智教育Python+大數據開發高手班

      0 分享到:
      神马影院我不卡