2014-09-12 49 views
1

我有一個Storm Spout將從日誌文件中讀取。所以當我在本地測試代碼的時候它的效果很好,因爲我在運行Job時傳遞了運行時參數。無法讀取風暴噴口中的輸入文件

但是,當我在集羣中部署代碼時,它給出FileNotFoundException

所以我的問題是如何將輸入傳遞給集羣系統中的Spout。

我正在使用資源位置將少量查找表傳遞給螺栓,但是如果我以相同的方式傳遞給噴口,它會給出相同的錯誤。

我也嘗試將參數傳遞給驅動程序類中的conf.put("logfile", args[0]);,噴口應該讀取其open()方法中的conf對象。這也不起作用。

public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { 
     collector_out = collector; 

     try { 
      this.context = context; 
      this.filereader = new FileReader(conf.get("logfile").toString()); 
     } catch (FileNotFoundException e) { 
      throw new RuntimeException("Error reading file ["+conf.get("logfile")+"]"); 
     } 

} 

public void nextTuple() { 
    try { 
     br = new BufferedReader(filereader); 
     line = br.readLine();   
     while(line != null){ 
      count++; 
      collector_out.emit(new Values(line)); 
      Thread.sleep(2); 
      line = br.readLine(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    finally{ 
     completed = true; 
    } 
} 

所以,如果有任何想法如何得到它將是一個很大的幫助。

+0

你可以把你的噴口的代碼? – gasparms 2014-09-12 18:59:25

+1

Storm集羣無法識別常規路徑。最好使用NFS或其他選擇。 – halfelf 2014-09-13 02:59:33

+0

您需要將文件保存在某個可供所有節點訪問的位置。如前面的註釋中所建議的,您可以使用NFS或同等...來驗證一個節點中的運行風暴並將文件保留在那裏,您應該獲得預期的產出 – user2720864 2014-09-15 06:44:38

回答

1

在集羣模式下,當您使用open方法讀取文件時,每個節點將轉到其本地路徑,並且可能在所有節點中都沒有該文件。

解決此問題的好選擇是在羣集中掛載nfs系統,在羣集節點之間共享一個目錄並將這些文件放入該目錄。我有一個像你這樣工作的噴嘴。

相關問題