2015-03-31 49 views
0

我正在使用CombineTextInputFormat讀取Spark上的很多小文件。Spark:使用CombineTextInputFormat時,任務大小很大

的Java代碼如下(我寫它作爲一個效用函數):

public static JavaRDD<String> combineTextFile(JavaSparkContext sc, String path, long maxSplitSize, boolean recursive) 
{ 
    Configuration conf = new Configuration(); 
    conf.setLong(CombineTextInputFormat.SPLIT_MAXSIZE, maxSplitSize); 
    if (recursive) 
     conf.setBoolean(CombineTextInputFormat.INPUT_DIR_RECURSIVE, true); 
    return 
     sc.newAPIHadoopFile(path, CombineTextInputFormat.class, LongWritable.class, Text.class, conf) 
     .map(new Function<Tuple2<LongWritable, Text>, String>() 
     { 
      @Override 
      public String call(Tuple2<LongWritable, Text> tuple) throws Exception 
      { 
       return tuple._2().toString(); 
      } 
     }); 
} 

它的工作原理,但在程序運行時,以下警告印:

WARN TaskSetManager: Stage 0 contains a task of very large size (159 KB). The maximum recommended task size is 100 KB. 

程序總共讀取約3.5MB,文件數量爲1234.這些文件位於一個目錄中。

這是正常的嗎?否則,我該如何擺脫這個信息?

我的Spark版本是1.3。

程序以本地模式運行。

回答

0

獨立於你的問題,我沒有答案,你可能想嘗試一種不同的方法來處理目錄下的所有文件。

Spark不僅可以簡單的方式處理單個文件,還可以處理整個目錄。如果所有的文件將被所在的位置,你的情況,在同一個目錄,命令sc.textfile可以通過指定位置讀取它裏面的所有文件,例如:

sc.textfile("//my/folder/with/files");

你可以找到更多有關它的信息在下面的問題:How to read multiple text files into a single RDD?

+1

這是真的,但CombineTextInputFormat是在我的情況更快。完成這項工作需要9秒,而sc.textFile()需要300秒。 (是的,三百秒) – zeodtr 2015-03-31 07:23:45

+0

我覺得它很棒。你對數據集進行什麼樣的操作?你可以提供一個你的應用程序的樣本,以便自己測試它嗎? – 2015-03-31 07:25:39

+0

目前這只是我的電腦上的一項測試。問題是目前測試輸入文件的數量是1234,每個文件的大小範圍從1KB到5KB,這對於hadoop應用程序來說是非常罕見的情況。測試輸入文件在實際系統上會更大。所以,這可能不是問題,但爲了測試,我需要CombineTextInputFormat。 – zeodtr 2015-04-01 00:07:06

相關問題