2014-07-18 40 views
0

我目前正在嘗試使用自定義InputSplitRecordReader以及Apache Spark的SparkContexthadoopRDD()函數。Spark與Hadoop InputFormat混淆整合

我的問題是:

是否通過InpuSplit.getLenght()和/或RecordReader.getProgress()返回的值影響map()功能的執行星火運行?

我在問,因爲我在Apache Hadoop上使用了這兩個自定義類,它們按預期工作。但是,在Spark中,我發現運行時會生成新的InputSplit對象,這是我不想讓我的代碼執行的事情。更確切地說:

在執行開始時,我在我的日誌文件中看到生成了正確數量的InputSplit對象(在本例中,我們只說1個)。接着,生成與該分割相關聯的RecordReader對象,並開始提取記錄。在某個時候,我收到一條消息,說明正在處理以前的InputSplit的作業會停止,並會產生一個新的作業InputSplit。我不明白爲什麼會發生這種情況?是否與RecordReader.getProgress()方法或InputSplit.getLength()方法返回的值有關?

此外,我將InputSplit的長度定義爲一些任意大的字節數(即1GB)。此值是否會影響運行系統中產生的Spark作業的數量?

歡迎提供任何幫助和/或建議嗎?

謝謝 尼克

附註:1:我張貼這麼多問題道歉,但是Apache星火是通過HadoopRDD S上的Hadoop的集成星火小文件的新工具。

P.S.-2:如果需要,我可以提供更多技術細節。

回答

1

是的,如果從getLength()返回任何值,然後讀取這些值之後。來自文件的字節,hadoop將生成一個新的分割來讀取更多的數據。 如果您不想要這種行爲,請覆蓋方法InputFormat.getSplits()以返回false。即......你不想讓它分裂。

getProgress()方法與生成新的分割無關。