无法从Hadoop MapReduce程序中搜索Elasticsearch

时间:2016-01-06 06:18:26

标签: java hadoop elasticsearch

我试图通过Hadoop MapReduce程序在Elasticsearch上启动查询但是无法运行它的jar。以下是错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/common/transport/TransportAddress
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:270)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.common.transport.TransportAddress
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more

之前我已经加载了其他库,例如 common-configurations common-lang ,但我没有&#39那时候面临问题。需要做出哪些改变才能以正确的方式工作。

我已经尝试构建普通应用程序并为elasticsearch运行它。

在Hadoop的lib目录中添加所有必需的库后,我现在可以从main函数中搜索Elasticsearch DB,但是当我尝试从map函数执行相同的搜索时,会给出以下错误。

16/01/07 18:44:44 INFO mapred.JobClient: Task Id : attempt_201601011215_30692_m_000000_0, Status : FAILED
Error: java.lang.ClassNotFoundException: org.elasticsearch.client.Client
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at fragmentextractor.FragmentExtractor$FragmentExtractorMapper.is_clean(FragmentExtractor.java:163)
        at fragmentextractor.FragmentExtractor$FragmentExtractorMapper.writeToContext(FragmentExtractor.java:216)
        at fragmentextractor.FragmentExtractor$FragmentExtractorMapper.map(FragmentExtractor.java:282)
        at fragmentextractor.FragmentExtractor$FragmentExtractorMapper.map(FragmentExtractor.java:68)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)

据我所知,它能够在Parent进程中搜索和加载库,但是当它克隆时,在子进程中找不到库。保留库文件以使其成功的其他地方有哪些?

1 个答案:

答案 0 :(得分:0)

终于得到了解决问题的答案。以下是描述:

您需要为hadoop jar命令提供-libjars选项

hadoop jar <MapReduce.jar> -libjars <jar_path1,jar_path2> argument1 argument2 ...

用于在Map Reduce部分程序中识别Jar,因为它通过 libjars 选项提取这些Jars。

您可以在HADOOP的lib目录中复制所有必需的Jars,但是当您执行与外部Jar相关的操作时,它们将无法使用。它们将在main()函数中可用。