2017-04-19 45 views
0

我一直試圖在SPARK與主紗集羣,但其導致沒有執行下面的語句。而如果我在本地執行相同的操作,它的運行沒有任何問題。有人可以提出這裏有什麼問題嗎?地圖在RDD與集羣

在這個過程中,輸入HDFS目錄與文件的AVRO

val rdd = sc.newAPIHadoopFile(inAvro, 
    classOf[AvroKeyInputFormat[PolicyTransaction]], 
    classOf[AvroKey[PolicyTransaction]], 
    classOf[NullWritable], 
    sc.hadoopConfiguration 
) 

println(rdd.count())// This works with Local and Cluster 

val avroObj = rdd.map(record => { 
    Try 
    { 
    val combineRecords = new PolicyTransaction 

     println(record._1.datum().getPolicyNumber)// This doesn't work with Local and Cluster 
     combineRecords.setPolicyNumber(record._1.datum().getPolicyNumber) 
     combineRecords.setLOBCd(record._1.datum().getLOBCd) 
     combineRecords.setPolicyVersion(record._1.datum().getPolicyVersion) 
     combineRecords.setStatStateProvCd(record._1.datum().getStatStateProvCd) 
     combineRecords.setTransactionEffectiveDt(record._1.datum().getTransactionEffectiveDt) 
     combineRecords.setTransactionProcessedDt(record._1.datum().getTransactionProcessedDt) 
     combineRecords.setQuoteOrPolicy(record._1.datum().getQuoteOrPolicy.get(0)) 

    combineRecords 
    } 
    match 
    { 
    case Success(map) => Right(map) 
    case Failure(map) => Left(map) 
    } 
} 
).cache() 
+0

你有什麼用VAL avroObj做什麼?你是否觸發了任何行動? – BDR

+0

什麼不起作用? –

+1

您是否指印刷品未被印刷?如果是這樣,你這是忘記了'println'命令你的工人執行的典型的錯誤 - _not_你的驅動程序 - 這樣的話你會看到_不_是印在你的驅動程序。必須通過工人的日誌文件一看,你會看到你的打印語句;-) –

回答

0

我想你找錯了地方! println將打印到本地輸出。因此,由於第一次打印正在驅動程序上運行,因此您可能會在啓動的控制檯上看到該打印。但是,在映射內部這是不正確的,代碼在羣集上的某處運行。你需要去檢查本地日誌。

另外,停止使用的println,並使用記錄器來代替。這會將所有內容記錄到共享的日誌環境中。您仍然不會在集羣模式下看到這一點,但至少所有內容都會集中在您的某個位置,從而爲您節省了解代碼運行位置的工作。

1

因此,當我發表評論 - 我認爲你指的是沒有打印的打印聲明,如果是這樣,你犯了一個經典錯誤,忘記了println命令在你的工人上執行 - 而不是驅動器上的 - 因此您不會在驅動程序上看到它。必須通過工人的日誌文件一看,你會看到你的打印語句;-)