2017-08-10 69 views
0

我調試一個Spark工作,但不知何故,一個星火API調用內部任何事情都是從控制檯/日誌hidding,這裏是我的代碼:無法打印/火花API日誌消息

public static JavaRDD<SolrInputDocument> join(
     JavaPairRDD<ImmutableBytesWritable, Result> hBaseRdd, 
     List<NuggetsField> fields) { 
     System.out.println("In join method...."); 
     logger.error("In join method.... logger.error"); 

     JavaRDD<ProductJoin> pjs = hBaseRdd.map(tuple -> { 
      System.out.println("in map API ....."); 
      logger.error("in map API.... logger.error"); 
      /**do some transformation*/ 
     }); 

     System.out.println("got ProductJoin RDD....."); 
     System.out.println("pjs.count() = " + pjs.count()); 
     return pjs; 
    } 

In join method....In join method.... logger.error並且got ProductJoin RDD.....pjs.count() =總是可以打印出來。

然而,in map API .....in map API.... logger.error從不顯示。

這是爲什麼? 另外,pjs.count()的值不是0.

有人可以幫我嗎?

謝謝!

+0

您能查看使用'紗日誌-applicationId application_id'。 –

+0

我以前試過,但是我得到了'-bash:yarn:command not found',:(: – FisherCoder

+0

好的,我能夠這樣做,但是仍然在這個紗線日誌中,仍然沒有記錄任何東西,可能會出錯? – FisherCoder

回答

1

這裏的關鍵是JVM運行打印行,因爲這是它將出現的日誌。 在你的情況下,因爲除了驅動程序之外你正在紗線上運行,你可以看到驅動程序的打印輸出,但沒有在執行程序上運行的任何代碼(如地圖)。 該輸出進入相應的紗線容器stderr文件。

如果您想在調試時看到任何打印語句,最簡單的事情就是以本地模式運行。

關於pjs.count(),映射操作使得1到1的轉換,它不能刪除元素。您需要稍後應用過濾器來刪除空值。

+0

謝謝,我發現他們在執行者的stderr日誌。 – FisherCoder

0

根據你的代碼時加入執行方法無論在方法中提到的系統輸出消息將在駕駛員上打印從您所提交的火花提交作業。但是如果是pjs這是一個RDD,並且只有在調用動作時纔會被評估,在這裏調用pjs.count(),這將在執行器一側評估。因此,無論您在轉換中提到的Sysout消息都將在Executor端打印出來。要訪問這些日誌,您需要通過紗線日誌-applicationId application_id來訪問YARN容器日誌,因爲來自執行者的日誌將被聚合在容器中。正如我看到你沒有找到yarn命令那麼請在你的CLASSPATH中添加「$ YARN_HOME/bin」並嘗試命令。

請使用以下鏈接: - https://spark.apache.org/docs/latest/running-on-yarn.html

科:調試應用程序