Java NiFi-定制orc处理器为类org.apache.hadoop.hdfs.DistributedFileSystem提供NoClassDefFoundError

Java NiFi-定制orc处理器为类org.apache.hadoop.hdfs.DistributedFileSystem提供NoClassDefFoundError,java,hadoop,hdfs,apache-nifi,orc,Java,Hadoop,Hdfs,Apache Nifi,Orc,我正在尝试用ApacheNIFI开发一个定制处理器,它直接将orc文件写入远程hadoop集群。为了写它们,我使用了。我试着在本地FS上写这些文件,它们还可以:hive是它们的“最终目的地”,读取它们没有问题 问题是,在尝试创建Writer对象时,我为类org.apache.hadoop.hdfs.DistributedFileSystem得到了一个NoClassDefFoundError 这就是使用的代码: Configuration conf = new Configuration(); c

我正在尝试用ApacheNIFI开发一个定制处理器,它直接将orc文件写入远程hadoop集群。为了写它们,我使用了。我试着在本地FS上写这些文件,它们还可以:hive是它们的“最终目的地”,读取它们没有问题

问题是,在尝试创建Writer对象时,我为类org.apache.hadoop.hdfs.DistributedFileSystem得到了一个NoClassDefFoundError

这就是使用的代码:

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;
}
...
我复制了lib目录中的hadoop hdfsjar,并尝试使用ClassLoader查看类路径中加载的jar的运行时,可以看到它。将它们包含在maven依赖项中也不能解决这个问题

任何关于如何消除这一错误的建议都非常感谢。谢谢大家!

@riccamini

请试着这样做,这肯定是工作

只需在处理器pom文件中添加以下与hadoop版本相关的依赖项

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

org.apache.hadoop
hadoop hdfs
2.7.3
但仍然无法解决错误。最后,将hadoop hdfs jar复制到NiFi\lib目录中

让我知道它是否适合你

@riccamini

请试着这样做,这肯定是工作

只需在处理器pom文件中添加以下与hadoop版本相关的依赖项

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

org.apache.hadoop
hadoop hdfs
2.7.3
但仍然无法解决错误。最后,将hadoop hdfs jar复制到NiFi\lib目录中


让我知道它是否适合您

尝试使用Maven/Gradle而不是JAR文件。您需要了解更多用于构建定制处理器的配置/设置。例如,你能在github中共享一个指向某个项目的指针吗?@cricket_007我已经在使用maven(我承认它没有写得那么清楚),我尝试添加依赖项,但没有成功。@JoeWitt我会尝试与你共享该项目,但我不知道我是否能做到这一点。但是,我使用的是NiFi 1.2和Hadoop 2.7。处理器的项目是从NiFi maven原型创建的。好的,那么您可以显示您的
pom.xml
?您说过您复制了一个JAR,但Maven不需要这样做。请尝试使用Maven/Gradle而不是JAR文件。您需要了解构建定制处理器的更多配置/设置。例如,你能在github中共享一个指向某个项目的指针吗?@cricket_007我已经在使用maven(我承认它没有写得那么清楚),我尝试添加依赖项,但没有成功。@JoeWitt我会尝试与你共享该项目,但我不知道我是否能做到这一点。但是,我使用的是NiFi 1.2和Hadoop 2.7。处理器的项目是从NiFi maven原型创建的。好的,那么您可以显示您的
pom.xml
?您说您复制了一个JAR,但Maven不需要这样做。谢谢您的回答,但正如前面提到的,我已经尝试添加所需的依赖项,但没有成功。Riccamini,您是否尝试将该JAR直接复制到Nifi\lib目录中?是的,首先。但最终我在pom中添加了hadoop公共依赖项,并对代码进行了一点重构,解决了这个问题。谢谢您的回答,但正如前面提到的,我已经尝试添加所需的依赖项,但没有成功。Riccamini,您是否尝试将jar直接复制到Nifi\lib目录中?是的,首先。但最终我解决了这个问题,在pom中添加了hadoop公共依赖项,并对代码进行了一点重构。