java - 无法从Hadoop MapReduce程序搜索Elasticsearch

标签 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 ,但是那时候我没有遇到问题。为了正确地工作,应该进行哪些更改。

我已经尝试构建普通应用程序并运行它以进行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)

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

最佳答案

终于得到了答案。以下是说明:

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

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

为了在Map Reduce程序部分中标识Jar,因为通过,libjars 选项提供时,Jar会提取这些Jar。

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

关于java - 无法从Hadoop MapReduce程序搜索Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34626821/

相关文章:

java - Tomcat 8.5 重写 Valve 将 root 请求重定向到特定的 webapp

java - (安卓工作室) E/Surface : getSlotFromBufferLocked: unknown buffer: 0xae6b28f0

java - 安卓媒体播放器无响应

hadoop - MapReduce 2.0 YARN中的 namespace 和 block 池是什么意思?

java - Elasticsearch:java.lang.InternalError:无法连接到窗口服务器

spring - 带有Shield的Spring Data Elasticsearch

Java版本验证

java - 将数据从 MySql 导入 HDFS 的最佳方式

date - Elasticsearch 中的日期过滤器

java - 在 Java 中尝试从 HDFS 复制 FromLocalFile 时出现 “Wrong FS… expected: file:///”