2016-11-21 104 views
0

我得到了我運行的代碼,這個一般片:星火:寫掌握的記錄從工人

df.rdd.foreachPartition(i => { 
    //some code 
    //writing to log 
}) 

的問題是writing to log是在工人自己進行,而不是在主人 - 和因此日誌條目分散在某處,並且很難 - 甚至有時甚至是不可能 - 檢索。有沒有辦法從工人那裏寫入主人的日誌,或者其他一些工作?

回答

2

無法立即寫入主日誌 - 分佈式處理意味着您的代碼在各種計算機上運行,​​因此對計算機資源(例如文件系統)的任何訪問都將被分發。

有幾個方法可以達到你想要的東西:

  1. 款待日誌,數據:而不是使用foreachPartition,您可以使用mapPartitions用同日志行返回Iterator[String]一個功能你想寫(或構建它們所需的數據)。假設日誌行的總數並不大,則可以將其收集到驅動機和記錄他們:

    val logLines = df.rdd.mapPartitions(i => { 
        //some code 
        val log: Iterator[String] = //construct log lines 
        log 
    }).collect() 
    
    logLines.foreach(logger.info) 
    
  2. 使用一些日誌聚合框架:這些框架從多臺機器上收集日誌,並能將它們顯示爲單個日誌條目流。這對於分佈式計算非常有用,因爲它可以訪問特定計算機的日誌冗餘。