2017-03-08 69 views
1

我試圖在Apache NiFi中開發一個自定義處理器,它將直接將orc文件寫入遠程hadoop集羣。爲了編寫它們,我使用了orc core api。我試圖在本地FS上編寫文件,它們都可以:配置單元,這是他們的「最終目的地」在讀取它們時沒有問題。NiFi - 自定義orc處理器爲類org.apache.hadoop.hdfs.DistributedFileSystem提供NoClassDefFoundError

的問題是,試圖創建一個Writer對象,我得到一個的NoClassDefFoundError該類org.apache.hadoop.hdfs.DistributedFileSystem

這是使用的代碼:

Configuration conf = new Configuration(); 
conf.addResource(new Path(hadoopConfigurationPath+"/core-site.xml")); 
conf.addResource(new Path(hadoopConfigurationPath+"/hdfs-site.xml")); 
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()); 
String hdfsUri = conf.get("fs.default.name"); 

... 

try{ 
    writer = OrcFile.createWriter(new Path(hdfsUri+"/"+filename+".orc"), OrcFile.writerOptions(conf).setSchema(orcSchema)); 
} 
catch(IOException e){ 
    log.error("Cannot open hdfs file. Reason: "+e.getMessage()); 
    session.transfer(flowfile, hdfsFailure); 
    return; 
} 
... 

我已經複製了Hadoop的HDFS lib目錄罐子,我嘗試使用的ClassLoader在classpath中加載的罐子尋找運行時,它可以是看到。將它們包含在Maven依賴項中也不能解決問題。

任何有關如何擺脫這個錯誤的建議真的很感激。謝謝你們!

+0

嘗試使用Maven /搖籃,而不是JAR文件 –

+1

將有必要看得多了,你必須構建定製處理器的配置/設置的。你能分享一個指向github中的項目的指針嗎? –

+0

@ cricket_007我已經在使用maven(我承認它並不像寫的那樣清晰),並且我嘗試添加依賴沒有成功。 – riccamini

回答

0

@riccamini,

請嘗試這種方式,肯定是工作。

只需添加以下依賴關係到您的處理器pom文件就您的hadoop版本。

<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-hdfs</artifactId> 
    <version>2.7.3</version> 
</dependency> 

仍然無法解決錯誤。最後將hadoop-hdfs jar複製到NiFi \ lib目錄中。

讓我知道,如果它的工作,你

+0

謝謝你的回答,但正如前面提到的,我已經嘗試添加所需的依賴關係,但沒有成功。 – riccamini

+0

Riccamini,您是否嘗試將該jar直接複製到Nifi \ lib目錄中? –

+0

是的,一開始。但最終我解決了它,並在pom中添加了** hadoop-common **依賴項,並重構了一些代碼。 – riccamini

相關問題