Hadoop日志紀錄篇


                 Hadoop日志紀錄篇

                                作者:尹正傑 

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

 

一.Hadoop日志消息概述

1>.Hadoop日志記錄概述

  Hadoop日志對於處理失敗的作業很有幫助。作業可能由於應用程序中的問題或硬件和平台錯誤而失敗。Hadoop守護程序日志能夠顯示影響作業的守護進程中的任何問題的來源。

  可以分析應用程序日志,以確定發生性能問題的根本原因,例如緩慢運行的作業,運行失敗作業的等原因都在日志中有相應的記錄。   與Oracle數據庫不同,它具有跟蹤更改和日志問題的單個警報日志,Hadoop具有復雜的日志的日志記錄結構。當你首次處理此復雜的日志記錄結構時,會感到困惑。

  不過,不要害怕,只要了解了hadoop日志記錄結構,就可以輕松地瀏覽日志框架,並學習如何挖掘日志,以更好地跟蹤系統。

  在進行故障排除時,需要查看應用程序日志和Hadoop守護日志。但首先,我們來了解一下不同類型的應用程序以及如何查看日志。

2>.日志類型概述

  可以通過瀏覽各個日志文件或通過Hadoop內置的web界面訪問Spark,Hive和其他作業的Hadoop日志消息。在大多數時候,通過Web界面訪問日志更好,因為可以節省時間,並快速找到發生性能問題或作業失敗的根本原因。
  
  Spark和MapReduce作業任務生成的日志有三種類型:
    stdout:
      將所有的system.out.println()消息定向到名為stdout的日志文件,可以為stdout日志使用自定義消息。 
    stderr:
      將所有system.err.println()消息都綁定到名為stderr的日志文件,可以為stderr日志使用自定義消息。
    syslog:
      將所有log4j(標准日志庫)日志發送到名為syslog的日志文件,可以再次發送自定義郵件,這是最重要的日志。
      可以通過其了解一個任務的進展,為什么它很慢,啟動失敗或停止運行。作業執行期間的任何未處理的異常被syslog補貨,所以它是了解map與reduce任務失敗的地方。

  接下來我們舉個例子:
    假設mapper程序包含以下代碼:
      logger.info("Mapper Key = " + key);
      分析如下:
        在這種情況下,mapper僅使用Log4j日志記錄,並且不會記錄到標准輸出流。
        因此,我們會看到,此作業僅記錄syslog文件中的記錄信息,無論是否自定義了Log4j日志記錄,該文件將始終包含信息,因為它是來自系統的所有Log4j消息的日志。
        在這種情況下,你不會在stdout和stderr文件中看到任何記錄信息(那里有這兩個文件,但文件內容為空)。
    假設reducer代碼中具有以下與日志相關的代碼:
      logger.info("Reduce Key =" + key);
      System.out.println("Reducer system.out >>>" + key);
      System.err.println("Reducer system.err >>>" + key);
      分析如下:
        由於reducer已經指定了所有三種類型的日志,因此可以在reducer任務的所有三個日志文件(stdout,stderr和syslog)中找到日志信息。      

  溫馨提示:
    (1)syslog文件始終包含日志信息,stdout和stderr文件為空,除非在代碼中指定了stdout和stderr類型的日志記錄。
    (2)通過編輯"${HADOOP_HOME}/etc/hadoop/log4j.properties"(等效於$HADOOP_CONF_DIR/log4j.properties)配置文件來配置log4j日志。
        在默認情況下,該文件位於位於$HADOOP_CONF_DIR變量指定的目錄中。一旦更改了日志記錄屬性,更改會立即生效,而不需要重新啟動集群。
    (3)嚴格意義上來講,除了上面提到的stdout,stderr以及syslog外,還有另外兩種日志類型,如下所示:
      prelaunch.err:
        記錄啟動容器前發生的錯誤信息。
      prelaunch.out:
        啟動容器前的信息,比如,設置環境變量(Setting up env variables)設置作業資源(Setting up job resources),啟動容器(Launching container)等等。

3>.守護進程和應用程序日志以及如何查看這些日志

  一些新的Hadoop應用程序開發人員和管理人員在審閱守護程序和應用程序日志時會感到困惑。

  如果使用Cloudera或Hortonworks並使用它們的管理界面(如Cloudera Manager或者Ambari),則可以通過單機按鈕進入日志。切確的說,在哪里存儲各種日志,以及哪些日志可用對於我們很重要。

  Hadoop生成兩種主要類型的日志:
    守護程序日志(例如:HDFS和YARN相關的守護進程):
      守護進程日志主要由管理員使用,因為它們有助於排除諸如DataNodes和NameNode等關鍵Hadoop服務的意外故障。

    應用程序日志(例如:MRAppMaster和SparkAppMaster類型的日志):
      Hadoop應用程序對於應用程序開發人員和管理員非常重要,因為它們可以幫助我們了解作業失敗和性能下降的根本原因。

  可以通過多種方式查看Hadoop應用程序日志,包括但不限於以下方法:
    (1)從Hadoop Web UI(特別是ResourceManager Web UI)查看,使用ResourceManager Web UI可以免除訪問日志存儲位置和查看日志文件的麻煩。還可以通過JobHistory Web UI查看日志。
    (2)直接從日志文件檢查日志信息,當然,這需要你登錄服務器。
    (3)對於某些應用程序日志,如果啟用了日志聚合功能,則將它們聚合到HDFS存儲,強烈建議這樣做,因為這樣查看日志就毫不費力啦,無需登錄服務器;
    (4)通過yarn命令檢查(例如:"yarn logs -applicationId application_1604218163813_0008  > application_1604218163813_0008.log")。

  綜上所述,對於兩種主要類型的日志,需要從Hadoop管理員的角度來關注,接下來我們介紹一下應用程序日志記錄,然后討論如何管理Hadoop守護程序日志。

 

二.應用程序日志記錄的工作原理

  應用程序日志在分析Hadoop作業的性能以及處理作業執行問題時至關重要。要想了解如何使用hadoop應用程序日志,首先要了解日志的生成方式。因此,下面首先介紹了MapReduce作業的步驟,最終會生成和存儲由Hadoop處理的每個作業的日志文件。

1>.Hadoop存儲日志的位置

  想要有效地分析Hadoop日志,重要的是了解Hadoop在作業運行時和作業完成后,在系統中的多個位置存儲作業相關的信息和日志。有以下三個位置:
    HDFS集群:
      這是Hadoop創建用於存儲作業執行文件的暫存目錄的位置。如果配置hadoop的日志聚合功能,hadoop還會使用長期(日志的保留有效期是可以自行配置的)的hadoop作業日志,因為它存儲在HDFS集群上。
    NodeManager本地目錄:
      這些是在本地文件系統上創建的目錄,hadoop在其中存儲由NodeManager服務生成的shell腳本(比如"default_container_executor_session.sh","default_container_executor.sh","launch_container.sh"),以便於執行ApplicationMaster容器。
      這些目錄如果在運行時去查看的話,除了上面提到的shell文件,如下圖1-3所示,你可能會發現還包括但不限於: "job.splitmetainfo","job.split","job.jar","job.xml","file.out","file.out.index","container_tokens"等文件。
      可以使用文件中的"yarn.nodemanager.local-dirs"屬性指定NodeManager本地目錄的位置。如下所示,就是我在生產環境中配置的三個目錄。
        <property>
          <name>yarn.nodemanager.local-dirs</name>
          <value>/yinzhengjie/data/hdfs/nm1,/yinzhengjie/data/hdfs/nm2,/yinzhengjie/data/hdfs/nm3</value>
          <description>
            指定用於存儲本地化文件的目錄列表(即指定中間結果存放位置,通常會配置多個不同的掛在目錄,以增強I/O性能)。默認值為"${hadoop.tmp.dir}/nm-local-dir"。
            YARN需要存儲其本地文件,例如MapReduce的中間輸出,將它們存儲在本地文件系統上的某個位置。可以使用此參數指定多個本地目錄,YARN的分布式緩存也是用這些本地資源文件(例如切片信息,配置信息,jar包等)。
          </description>
        </property>
    NodeManager日志目錄:
      這些是Linux上的本地目錄,NodeManager在此存儲用戶運行的應用程序的實際日志文件。在此節點的NodeManager上執行作業的所有容器(Spark,MapReduce和其他作業任務)並將其應用程序日志存儲在此目錄中。
      該參數的默認值為${yarn.log.dir}/userlogs,需要注意的是,"${yarn.log.dir}"實際上不是一個OS環境變量(例如JAVA_HOME變量)。這是通過"${HADOP_HOME}/etc/hadoop/yarn-env.sh"文件配置的Java系統屬性。
      在默認情況下,將yarn.log.dir屬性設置為與OS環境變量YARN_LOG_DIR的值相同。
      在"${HADOOP_HOME}/etc/hadoop/yarn-site.xml"文件中,使用"yarn.nodemanager.log-dirs"屬性指定NodeManager日志目錄的位置。如下所示,我指定了三個目錄(這些目錄存儲的內容可參考下圖4)。
        <property>
          <name>yarn.nodemanager.log-dirs</name>
          <value>/yinzhengjie/logs/yarn/container1,/yinzhengjie/logs/yarn/container2,/yinzhengjie/logs/yarn/container3</value>
          <description>
            指定存儲容器日志的位置,默認值為"${yarn.log.dir}/userlogs"。此屬性指定YARN在Linux文件系統上發送應用程序日志文件的路徑。通常會配置多個不同的掛在目錄,以增強I/O性能。
            由於我啟用了日志聚合功能,一旦應用程序完成,YARN將刪除本地文件。可以通過JobHistroyServer訪問它們(從匯總了日志的HDFS上)。
            在該示例中將其設置為"/yinzhengjie/logs/yarn/container",只有NondeManager使用這些目錄。
          </description>
  溫馨提示:
    HDFS分段目錄和NodeManager本地目錄包含具有作業參數和執行ApplicationMaster的shell腳本字段。由於這些目錄包含實際的應用程序日志文件,所以在日常工作中NodeManger日志目錄對我們更為重要。

  如上圖所示,我之所以截圖是因為這些是臨時文件,當應用程序運行完畢后,這些本地臨時文件或被清除。

  但這並不是無跡可尋,如下圖所示,我們可以通過日志信息可以看出,某個特定的job在具體的時間其map和reduce程序分別在哪個主機上運行的。

  如果你關心中間臨時結果有哪些,如下所示,其實是有很多的臨時文件,不僅僅包含shell文件,還有一些配置文件,jar包文件,切片信息等。我下面的截圖也只是運行一個MR所臨時產生的文件(包含了部分內容,圖中並未展示全,因為屏幕不夠用,哈哈哈~)。

2>.NodeManager日志目錄包含的內容

  應用程序的日志文件中實際上包含的是容器日志。每個應用程序的本地化日志目錄具體以下目錄結構:
    ${yarn.nodemanager.log-dirs}/application_${appid}/

  ${appid}變量表示MapReduce作業的應用程序ID。每個容器的日志目錄位於此目錄下,並使用以下目錄命名約定:
    container_${contid}
 
  如下圖所示,各個容器的日志(即"container_${containerID}")位於名為"${yarn.nodemanager.log-dirs}/application_${appid}"目錄下。

  容器目錄中的每個目錄都包含我們感興趣的實際日志文件,它們是本容器生成的五種類型的hadoop日志,包括prelaunch.err,prelaunch.out,stderr,stdout和syslog。這是在運行期間找到有關容器錯誤信息的地方。

  由於我生產環境中配置了日志聚合,yarn.nodemanager.log-dirs配置的屬性主要是日志臨時存放目錄,運行一個MR程序后,可以看到類似上圖所示的目錄結構,當應用程序運行完畢后,可能會有5秒的延遲,該目錄下的所有臨時文件都將被刪除。

  溫馨提示:
    我上面給出的5秒鍾是我跑了一個MR的心理估算的結果,可能並不准確,但相差不會太大。因為它需要將這些臨時日志上傳到HDFS集群進行聚合,所以才會有這個延遲。  

    可能是由於我運行的程序處理的數據比較小,生產環境中你的集群刪除這些數據可能會有更大的延遲,但我估計也在5-10s之間。

 

三.Hadoop如何使用HDFS目錄和本地目錄

  當啟動YARN作業時,Hadoop會使用HDFS(不是使用HDFS中存儲的數據,這里我們討論hadoop如何使用HDFS來記錄和存儲作業相關信息)和本地目錄中的各種節點。

  Hadoop使用HDFS進行作業緩存,使用本地目錄存儲生成的用於啟動作業容器(比如MRAppMaster中的map和reduce任務)的各種腳本。

  接下來我們一起看一下在作業執行期間hadoop如何使用HDFS和本地目錄。

1>.HDFS如何執行作業

  當用戶執行MapReduce作業時,他們通常調用作業客戶端來配置作業並啟動它。作業客戶端執行以下操作:
    (1)它首先檢查在HDFS中用戶名下是否有暫存目錄。如果沒有,創建它。暫存目錄的格式為: "${yarn.app.mapreduce.am.staging-dir}/${user}/.staging",注意哈,這提到的兩個變量並非指操作系統的環境變量。
      需要注意的是,"yarn.app.mapreduce.am.staging-dir"屬性通常需要在"${HADOOP_HOME}/etc/hadoop/mapred-site.xml"配置文件中指定,如下所示,我自定義了該屬性所對應的路徑。
        <property>
          <name>yarn.app.mapreduce.am.staging-dir</name>
          <value>/yinzhengjie/workspace/mapreduce</value>
          <description>
            該參數用於他提交作業的暫存目錄,其默認值為"/tmp/hadoop-yarn/staging"。
            一般情況下,我們將其指向一個HDFS目錄,YARN存儲所有應用程序相關信息,例如運行作業時創建的臨時文件,作業計數器和作業配置等,該目錄路徑自定義即可。
          </description>
        </property>
    (2)如下圖所示,作業在客戶端在".staging"目錄下,在作業(每個Job對應一個HDFS上的目錄,例如:"job_1604544273281_0007")以及job.xml文件中創建名為"job_<jobID>_conf.xml"文件,這些文件包括用於執行此作業的hadoop參數。
    (3)除了與作業相關的文件外,還將hadoop-mapreduce-client-jobclient.jar的Hadoop JAR(Java 歸檔)文件放在".staging"目錄中,然后將其重命名為"job.jar"。

  溫馨提示:
    (1)若未配置"yarn.app.mapreduce.am.staging-dir"屬性。則使用"${HADOOP_HOME}/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml"中默認值,即"/tmp/hadoop-yarn/staging";
    (2)設置了暫存目錄后,作業客戶端將作業提交到ResourceManager,作業客戶端還通過顯示作業的map和reduce階段的完成百分比(如下圖所示,"map 100% reduce 100%"),向控制台發送作業進度狀態;
    (3)請注意,所有這些都是HDFS文件系統中發生的,而不是在Linux服務器的本地目錄中。作業客戶端啟動作業后,此作業的ApplicationManager將變為動作。

2>.NodeManger如何使用本地目錄

  ResourceManager的ApplicationManager(千萬別和Job的ApplicationMaster混淆哈)服務在其中一個集群的節點上選擇一個NodeManager,以啟動ApplicationMaster進程。

  總所周知,ApplicationMaster進程始終是YARN作業中要創建的第一個容器(Container)。ResourceManager選擇哪個NodeManager取決於啟動作業時的可用資源,我們不能指定用於啟動作業的節點(僅就這一點而言,它沒有K8S靈活)。

  NodeManager服務啟動並在本地應用程序緩存(appCache目錄)中生成各種腳本,以執行ApplicationMaster容器。

  ApplicationMaster的目錄位於使用"${HADOOP_HOME}/etc/hadoop/yarn-site.xml"文件中"yarn.nodemanager.log-dirs"屬性為NodeManager本地目錄指定的位置,關於如何配置我在上面已經介紹過,此處就不再贅述啦。

  使用yarn.nodemanager.log-dirs屬性,可以提供NodeManager存儲其本地文件的目錄列表,在這些目錄下面,能夠找到具體以下目錄結構的實際應用程序的本地文件目錄:
    ${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}

  要訪問各個容器的工作目錄,必須深入了解目錄結構。容器工作目錄時應用程序根目錄下的子目錄,並以容器命名,如下所示:  
    ${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}/container_${contid}

  如上圖所示,顯示了一個MRAppMaster容器目錄(其容器編號為"container_1604544273281_0003_01_000001")的內容,注意該目錄中的兩個文件:
    job.xml:
      該文件包含次作業要使用的YARN,MapReduce和HDFS的配置屬性,對於hadoop的每個配置屬性(使用"<property></property>"標簽指定)。
      該文件列出了屬性的名稱(對應"<name></name>"標簽),屬性值(對應"<value></value>"標簽),是否可以修改(對應"<final></final>"標簽)和來源(對應"<source></source>"標簽)。
      配置屬性的來源可能是以下之一:
        (1)官方默認參數配置文件,比如:core-default.xml,hdfs-default.xml,mapred-default.xml,yarn-default.xml。
        (2)用戶自定義參數配置文件,比如:core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml。
        (3)由用戶以編程方式設置,即在代碼中指定。
        (4)用戶提交任務時使用指定屬性("-D <property=value>"),如下所示。
            "hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar wordcount -D mapreduce.job.queuename=root.yinzhengjie.development /input /output"     launch_container.sh:       該腳本用來執行ApplicationMaster類並允許ApplicationMaster容器。ApplicationMaster啟動並向ResourceManager發送請求,以分配為了托管此應用程序所需的mapper和reducer的必須數量的容器。   溫馨提示:     final標簽和java中的關鍵字final類似,當其值為true時意味着這個配置項是"固定不變的",當其值為false時則意味着這個配置項是可變的。如下圖所示,此job作業有2個屬性是不變的。     我們在自定義配置文件(比如:hdfs-site.xml,yarn-site.xml,mapred-site.xml)時,通常無需指定"<final></final>"標簽(若不指定默認值為false),但在合並資源的時候,如果要防止配置項的值被覆蓋則可以將其值設置為true。

3>.啟動NodeManager並創建Map/Reduce容器

  ResourceManager會以一個可用的NodeManager列表來響應由ApplicationMaster發出的關於容器分配的請求。ApplicationMaster聯系在各個集群節點上運行的NodeManager,以啟動完成該作業所需的mapper/reducer容器。

  每個NodeManager節點在其本地下的本地應用程序緩存中目錄(該目錄用戶可以自定義,就是由我們上面提到"yarn.nodemanager.local-dirs"屬性設置的)中生成各種腳本,這些腳本與ApplicationMaster服務創建的腳本非常相似。

  每個容器的應用程序緩存目錄都包含"job.xml","launch_container.sh"等文件。應用程序緩存目錄以map或reduce容器命名,如下圖所示。

  如上圖所示,可能有小伙伴會擔心各個nodemanager目錄下會填滿appCache子目錄下的作業文件,導致磁盤空間不足的問題。

  其實無須擔心該問題,因為這些文件在作業完成時會被自動刪除。但是,若某些作業確實包含大文件,並且當AppCache目錄沒有足夠的空間來容納它們時,作業將失敗。

  我們可以通過配置"yarn.nodemanager.delete.debug-delay-sec"指定應用程序完成后保留本地日志目錄的時間(默認以秒為單位),下面就是我生產環境中配置的參數示例:
    <property>
      <name>yarn.nodemanager.delete.debug-delay-sec</name>
      <value>1800</value>
      <description>
        指定應用程序(ApplicationMaster運行的Container)運行完成后,nodemanager的刪除服務將刪除應用程序的本地化文件目錄和日志目錄之前的秒數,默認值為0(即運行完成后立即刪除)。
        如果要診斷YARN的應用程序問題,可以將此屬性設置的足夠大(例如我這里設置的是1800s,即30分鍾),以有充足事件來簡稱這些目錄,更改此屬性值后,必須重新啟動nodemanager節點才能生效喲~
        生產環境中我不推薦大家將該值設置的過大,或者不設置,建議設置一個合理的值,比如1800-3600秒(即30-60分鍾)。設置過小可能來不及處理,設置過大可能會造成過多空間的浪費喲!
      </description>
    </property>

  需要注意的時,一旦"yarn.nodemanager.delete.debug-delay-sec"配置的時間到期,NodeManager的DeletionService進程會刪除應用程序的本地文件目錄結構,包括日志目錄。

  綜上所述,建議將此參數的值設置得高一些(例如至少30分鍾,即1800秒),以便有足夠的時間查看應用程序(ApplicationMaster啟動的各種Container)的日志。

4>.應用程序日志

  當應用程序運行時,它將生成日志並將它們存儲在使用yarn.nodemanager.log.dirs參數指定的目錄(在yarn-site.xml)中,如下所示。這里我們指定了多個目錄(對應多個掛載點),雖然這。
    <property>
      <name>yarn.nodemanager.log-dirs</name>
      <value>/yinzhengjie/logs/yarn/container1,/yinzhengjie/logs/yarn/container2,/yinzhengjie/logs/yarn/container3</value>
      <description>
        指定存儲容器日志的位置,默認值為"${yarn.log.dir}/userlogs"。可以指定多個目錄,但僅有一個目錄存儲有數據,如上圖所示。
      </description>
    </property>

  請記住,一個典型的作業(Job)運行在幾個節點上,每個節點都有一個獨立的NodeManager進程。在每個NodeManager節點上,都會發現與該節點上運行的Job的(mapper/reducer)容器相關的日志。

  溫馨提示:
    如下圖所示,就是一個典型的map容器和一個reduce容器。可以很明顯的察覺出這兩個目錄有一定的差異,即Reduce容器多了一個"syslog.shuffle"日志文件。這也印證了shuffle過程是reduce程序去主動從map程序端拉取數據。

5>.map和reduce任務的日志級別

  為整個集群設置的標准日志記錄級別可能不適用於所有業務和任務。使用以下屬性可以為map和reduce任務設置自定義日志記錄級別。
    <property>
      <name>mapreduce.map.log.level</name>
      <value>WARN</value>
      <description>
        指定"MR ApplicationMaster"的map任務的日志記錄級別。默認值為:"INFO"。允許的級別包括:"OFF","FATAL","ERROR","WARN","INFO","DEBUG","TRACE"和"ALL".
        我這里指定的值為"WARN",需要注意的是,如果你配置了"mapreduce.job.log4j-properties-file"文件,則此處的配置將被覆蓋喲~
      </description>
    </property>

    <property>
      <name>mapreduce.reduce.log.level</name>
      <value>WARN</value>
      <description>
        指定"MR ApplicationMaster"的reduce任務的日志記錄級別。默認值為:"INFO"。允許的級別包括:"OFF","FATAL","ERROR","WARN","INFO","DEBUG","TRACE"和"ALL".
        我這里指定的值為"WARN",需要注意的是,如果你配置了"mapreduce.job.log4j-properties-file"文件,則此處的配置將被覆蓋喲~
      </description>
    </property>

  溫馨提示:
    map和reduce任務的默日志記錄級別都是INFO,可以在"mapreduce.job.log4j-properties-file"中設置不同的值來覆蓋集群的設置。

6>.應用程序日志的保留持續時間(其與日志聚合功能沖突,若已經配置了日志聚合功能可直接忽略該參數)

  當應用程序持續運行時,NodeManager會將日志數據復雜到該節點上運行的夢容器的日志文件中。作業完成后,NodeManager會將應用程序日志保留3小時(即默認10800s),然后將其刪除。

  可以通過在"${HADOOP_HOME}/etc/hadoop/yarn-site.xml"文件中設置"yarn.nodemanager.log.retain-seconds"屬性的值來更改保留期限,如下所示。
    <property>
      <name>yarn.nodemanager.log.retain-seconds</name>
      <value>86400</value>
      <description>保留用戶日志的時間(以秒為單位)。僅在禁用日志聚合的情況下適用,默認值為:10800s(即3小時)。我這里設置的是24小時。</description>
    </property>

  溫馨提示:
    (1)上述配置在作業完成后將日志保留24小時,之后刪除它們;
    (2)當然,若想要檢查幾個小時甚至幾天之前完成的作業日志,生產環境中通常會配置日志聚合功能,可以訪問舊的日志,如果你真的這樣做,則意味着此參數配置無效;
    (3)默認情況下禁用日志聚合,這意味着除非顯式配置日志聚合,否則所有應用程序的日志將在三個小時后被自動刪除。

 

四.通過日志聚合將作業日志存儲在HDFS中

  博主推薦閱讀:
    https://www.cnblogs.com/yinzhengjie/p/13943340.html

 

五.使用Hadoop守護程序日志

  博主推薦閱讀:
    https://www.cnblogs.com/yinzhengjie/p/13943831.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM